Capítulo 06: Laços Determinísticos (For...Next) e Varredura Reversa (Step -1)

🎯 Objetivo da Aula

Nesta aula, você aprenderá a automatizar repetições controladas utilizando a estrutura de repetição For...Next. Você compreenderá a cláusula de passo Step e dominará um dos conceitos mais cruciais de engenharia de software em planilhas: o algoritmo de varredura reversa (Step -1), indispensável para excluir linhas ou registros sem sofrer com o deslocamento de índices (index shifting).

Ao final desta aula, você terá construído o robô de auditoria de fretes da FastLog S.A., capaz de auditar centenas de linhas e expurgar cancelamentos em milissegundos.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: Toda sexta-feira, o departamento financeiro recebe uma planilha com 300 ordens de serviço de transporte. O assistente precisava:

  1. Calcular 2% de multa + juros diários para fretes com pagamento em atraso.
  2. Excluir as linhas de pedidos com status "CANCELADO".
    Um analista tentou criar um laço comum de cima para baixo (For i = 2 To 300). Resultado desastroso: sempre que o código excluía uma linha cancelada (ex: linha 5), a linha 6 subia imediatamente para a posição 5. Como o contador avançava para i = 6, o registro seguinte nunca era verificado, deixando dezenas de pedidos cancelados na base e distorcendo o balanço fiscal da transportadora.
    Sua Missão: Construir o procedimento AuditarBaseFretes, implementando o laço determinístico para atualização de juros e a varredura inversa de baixo para cima (Step -1), garantindo que 100% dos cancelamentos sejam expurgados sem pular nenhum registro.

🧠 Fundamentos: A Teoria Traduzida

1. A Estrutura do Laço For...Next

O laço For...Next repete um bloco de comandos um número fixo de vezes, incrementando uma variável contadora a cada iteração:

1
2
3
4
Dim i As Long
For i = 1 To 10
    Cells(i, 1).Value = "Registro " & i
Next i

2. A Cláusula Step (Passo)

Por padrão, o contador soma +1 a cada volta. A palavra-chave Step permite alterar esse incremento:

  • Avanço de 2 em 2: For i = 2 To 100 Step 2 (apenas linhas pares).
  • Contagem regressiva: For i = 10 To 1 Step -1 (do 10 até o 1).

3. O Problema do Deslocamento de Linhas (Index Shifting)

Observe o que ocorre na exclusão de cima para baixo vs. de baixo para cima:

flowchart TD
    subgraph ERRADO["❌ Varredura Normal (De Cima para Baixo)"]
        A1["Linha 4: CANCELADO (Excluída!)"] --> A2["Linha 5 antiga sobe para Linha 4"]
        A2 --> A3["Contador avança para Linha 5<br/>A linha promovida NUNCA É TESTADA!"]
    end

    subgraph CORRETO["✅ Varredura Inversa (Step -1: De Baixo para Cima)"]
        B1["Linha 10 avaliada"] --> B2["Linha 9 avaliada"]
        B2 --> B3["Linha 4 excluída:<br/>Linhas abaixo sobem, mas ELAS JÁ FORAM PROCESSADAS!<br/>Nenhuma linha é pulada!"]
    end

    style ERRADO fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff
    style CORRETO fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff

Regra de Ouro do VBA: Sempre que você for deletar linhas de uma planilha usando um laço numérico, percorra a tabela de baixo para cima (For i = ultimaLinha To 2 Step -1)!


📖 Exemplo Guiado: Passo a Passo no Laboratório

No Excel, abra o editor VBE com Alt + F11.

Passo 1: Inserção do Módulo de Auditoria

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na Janela de Propriedades (F4), renomeie o módulo para: modAuditoria.
  3. Confirme a diretiva Option Explicit.

Passo 2: Preparação da Massa de Testes no Excel

Na primeira planilha, crie a seguinte estrutura de colunas na linha 1:

  • A1: ID_Frete | B1: Valor_Original | C1: Dias_Atraso | D1: Valor_Atualizado | E1: Status
  • Preencha as seguintes 5 linhas de teste:
    • Linha 2: FR-001 | 1000 | 0 | (vazio) | PAGO
    • Linha 3: FR-002 | 2500 | 10 | (vazio) | PENDENTE
    • Linha 4: FR-003 | 1800 | 0 | (vazio) | CANCELADO
    • Linha 5: FR-004 | 3200 | 0 | (vazio) | CANCELADO (Dois cancelados seguidos: o teste supremo!)
    • Linha 6: FR-005 | 4000 | 5 | (vazio) | PENDENTE

🛠️ Prática Obrigatória 1: Cálculo de Juros com Laço For…Next

Calcularemos os juros de mora (2% de multa + 0,1% por dia de atraso) para todos os fretes pendentes.

Passo a Passo no Computador:

  1. No módulo modAuditoria, digite a rotina de atualização financeira:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    Option Explicit
    
    Sub CalcularJurosAtraso()
        Dim ws As Worksheet
        Dim lngUltimaLinha As Long
        Dim i As Long
        Dim curValor As Currency
        Dim lngDias As Long
        Dim curValorFinal As Currency
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        ' Identifica dinamicamente a última linha preenchida na coluna A
        lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
        ' Laço determinístico da linha 2 até a última linha
        For i = 2 To lngUltimaLinha
            curValor = CCur(ws.Cells(i, 2).Value)
            lngDias = CLng(ws.Cells(i, 3).Value)
    
            If lngDias > 0 Then
                ' Regra: Valor Original + 2% multa fixa + (0,1% ao dia)
                curValorFinal = curValor + (curValor * 0.02) + (curValor * (lngDias * 0.001))
            Else
                curValorFinal = curValor
            End If
    
            ' Grava o valor corrigido na coluna D (Coluna 4)
            ws.Cells(i, 4).Value = curValorFinal
            ws.Cells(i, 4).NumberFormat = "R$ #,##0.00"
        Next i
    
        MsgBox "Juros e multas calculados com sucesso até a linha " & lngUltimaLinha & "!", vbInformation, "Auditoria Financeira"
    End Sub
  2. Posicione o cursor dentro do código e tecle F5.
  3. Veja as células da coluna D serem preenchidas:
    • Na linha 3 (FR-002 com 10 dias de atraso): R$ 2.500,00 virou R$ 2.575,00 (2% multa = R$ 50 + 1% juros = R$ 25).
    • Na linha 6 (FR-005 com 5 dias de atraso): R$ 4.000,00 virou R$ 4.100,00.

✅ Resultado Esperado (Prática 1):

A coluna D exibe os valores financeiros corrigidos linha por linha sem qualquer intervenção manual.


🛠️ Prática Obrigatória 2: Expurgando Cancelamentos com Varredura Inversa (Step -1)

Agora aplicaremos o algoritmo de exclusão reversa para eliminar com precisão cirúrgica os pedidos com status "CANCELADO".

Passo a Passo no Computador:

  1. No mesmo módulo, adicione a rotina com Step -1:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    Sub ExcluirPedidosCancelados()
        Dim ws As Worksheet
        Dim lngUltimaLinha As Long
        Dim i As Long
        Dim strStatus As String
        Dim lngExcluidos As Long
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        lngExcluidos = 0
    
        ' Desativa atualização visual para ganho imediato de velocidade
        Application.ScreenUpdating = False
    
        ' VARREDURA REVERSA: Começa na última linha e sobe até a linha 2
        For i = lngUltimaLinha To 2 Step -1
            strStatus = UCase(Trim(ws.Cells(i, 5).Value))
    
            If strStatus = "CANCELADO" Then
                ' Exclui a linha inteira da planilha
                ws.Rows(i).EntireRow.Delete
                lngExcluidos = lngExcluidos + 1
            End If
        Next i
    
        Application.ScreenUpdating = True
    
        MsgBox "Auditoria concluída!" & vbCrLf & _
               "Total de registros cancelados expurgados: " & lngExcluidos, _
               vbInformation, "Expurgo Homologado"
    End Sub
  2. Execução:
    • Execute o procedimento ExcluirPedidosCancelados (F5).
    • Observe que ambos os pedidos cancelados consecutivos (FR-003 e FR-004) foram excluídos com perfeição!
    • Restaram na tabela apenas as linhas 2, 3 e 4 (antigos FR-001, FR-002 e FR-005).

✅ Resultado Esperado (Prática 2):

A base é limpa sem deixar nenhum resíduo de cancelamento, provando a eficácia do laço reverso Step -1.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo: Atividade_06_VBA_SeuNome_SeuSobrenome.xlsm.
  2. Acesse a plataforma Microsoft Teams.
  3. Abra a tarefa: “VBA - Cap 06: Laços For…Next e Step -1”.
  4. Anexe a planilha e envie.

💡 Checkpoint de Gestão & TI

O erro de pular linhas ao deletar registros de cima para baixo é uma das falhas mais comuns cometidas por desenvolvedores iniciantes em VBA. Em bases com milhares de registros de faturamento ou contabilidade, registros “invisíveis” que deixam de ser expurgados distorcem estoques e balanços patrimoniais. Dominar a técnica Step -1 diferencia o profissional técnico qualificado do usuário amador de planilhas.


🔥 Desafio de Fixação: Totalizador de Valores Auditados

Incremente o procedimento de auditoria:

  1. Crie uma variável curTotalRecuperado As Currency.
  2. Durante a varredura do cálculo de juros, acumule em curTotalRecuperado apenas a diferença de juros gerada (curValorFinal - curValor).
  3. Ao término do laço, grave na célula G1 o texto "Total Juros Recuperados:" e na célula H1 o valor acumulado formatado em moeda.

🔑 Revelar Gabarito Oficial de Laboratório (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código Consolidado (modAuditoria):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit

Sub ExecutarAuditoriaGeral()
    Dim ws As Worksheet
    Dim lngUltimaLinha As Long
    Dim i As Long
    Dim curValor As Currency
    Dim lngDias As Long
    Dim curValorFinal As Currency
    Dim curJurosAcumulados As Currency
    Dim strStatus As String
    Dim lngExcluidos As Long
    
    Set ws = ThisWorkbook.Worksheets(1)
    
    Application.ScreenUpdating = False
    
    ' ETAPA 1: Cálculo Financeiro e Juros
    lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    curJurosAcumulados = 0
    
    For i = 2 To lngUltimaLinha
        curValor = CCur(ws.Cells(i, 2).Value)
        lngDias = CLng(ws.Cells(i, 3).Value)
        
        If lngDias > 0 Then
            curValorFinal = curValor * 1.02 + (curValor * (lngDias * 0.001))
            curJurosAcumulados = curJurosAcumulados + (curValorFinal - curValor)
        Else
            curValorFinal = curValor
        End If
        
        ws.Cells(i, 4).Value = curValorFinal
        ws.Cells(i, 4).NumberFormat = "R$ #,##0.00"
    Next i
    
    ' ETAPA 2: Varredura Reversa para Exclusão de Linhas
    lngExcluidos = 0
    For i = lngUltimaLinha To 2 Step -1
        strStatus = UCase(Trim(ws.Cells(i, 5).Value))
        
        If strStatus = "CANCELADO" Then
            ws.Rows(i).EntireRow.Delete
            lngExcluidos = lngExcluidos + 1
        End If
    Next i
    
    ' ETAPA 3: Resumo Executivo (Desafio de Fixação)
    ws.Range("G1").Value = "Total Juros Apurados:"
    ws.Range("H1").Value = curJurosAcumulados
    ws.Range("G1:H1").Font.Bold = True
    ws.Range("H1").NumberFormat = "R$ #,##0.00"
    ws.Columns("A:H").AutoFit
    
    Application.ScreenUpdating = True
    
    MsgBox "Auditoria Completa Homologada!" & vbCrLf & vbCrLf & _
           "• Cancelamentos Excluídos: " & lngExcluidos & vbCrLf & _
           "• Juros Recuperados: " & FormatCurrency(curJurosAcumulados), _
           vbInformation, "FastLog Auditoria"
End Sub

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que você estudou neste capítulo. Ao concluir, apresente o caderno ao professor para visto.

  1. Como funciona a estrutura de controle For...Next e para que serve a variável contadora?
  2. O que a cláusula Step define em um laço de repetição e qual é o seu valor padrão quando omitida?
  3. Explique detalhadamente o fenômeno do “deslocamento de índice” (index shifting) ao excluir linhas de cima para baixo.
  4. Por que a varredura inversa utilizando Step -1 resolve com 100% de segurança a exclusão de linhas consecutivas?
  5. Qual é a finalidade do comando ws.Cells(ws.Rows.Count, "A").End(xlUp).Row no código?
  6. O que a instrução Application.ScreenUpdating = False realiza e por que ela melhora expressivamente a performance de laços?
  7. Qual método do VBA é utilizado para deletar uma linha inteira de dados na planilha?
  8. Como formatamos uma célula para o padrão de moeda brasileiro (R$ #,##0.00) via código VBA?
  9. O que ocorre se esquecermos de reativar Application.ScreenUpdating = True ao final de uma macro?
  10. No Desafio de Fixação, qual foi a lógica utilizada para acumular apenas a parcela de juros apurada na auditoria?