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:
- Calcular 2% de multa + juros diários para fretes com pagamento em atraso.
- 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 parai = 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 procedimentoAuditarBaseFretes, 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:
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:#fffRegra 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
- No menu superior, clique em Inserir ➔ Módulo.
- Na Janela de Propriedades (
F4), renomeie o módulo para:modAuditoria. - 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
- Linha 2:
🛠️ 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:
- No módulo
modAuditoria, digite a rotina de atualização financeira: - Posicione o cursor dentro do código e tecle
F5. - Veja as células da coluna D serem preenchidas:
- Na linha 3 (
FR-002com 10 dias de atraso):R$ 2.500,00virouR$ 2.575,00(2% multa = R$ 50 + 1% juros = R$ 25). - Na linha 6 (
FR-005com 5 dias de atraso):R$ 4.000,00virouR$ 4.100,00.
- Na linha 3 (
✅ 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:
- No mesmo módulo, adicione a rotina com
Step -1: - Execução:
- Execute o procedimento
ExcluirPedidosCancelados(F5). - Observe que ambos os pedidos cancelados consecutivos (
FR-003eFR-004) foram excluídos com perfeição! - Restaram na tabela apenas as linhas 2, 3 e 4 (antigos
FR-001,FR-002eFR-005).
- Execute o procedimento
✅ 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)
- Salve o arquivo:
Atividade_06_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse a plataforma Microsoft Teams.
- Abra a tarefa: “VBA - Cap 06: Laços For…Next e Step -1”.
- 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:
- Crie uma variável
curTotalRecuperado As Currency. - Durante a varredura do cálculo de juros, acumule em
curTotalRecuperadoapenas a diferença de juros gerada (curValorFinal - curValor). - 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.
📝 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.
- Como funciona a estrutura de controle
For...Nexte para que serve a variável contadora? - O que a cláusula
Stepdefine em um laço de repetição e qual é o seu valor padrão quando omitida? - Explique detalhadamente o fenômeno do “deslocamento de índice” (index shifting) ao excluir linhas de cima para baixo.
- Por que a varredura inversa utilizando
Step -1resolve com 100% de segurança a exclusão de linhas consecutivas? - Qual é a finalidade do comando
ws.Cells(ws.Rows.Count, "A").End(xlUp).Rowno código? - O que a instrução
Application.ScreenUpdating = Falserealiza e por que ela melhora expressivamente a performance de laços? - Qual método do VBA é utilizado para deletar uma linha inteira de dados na planilha?
- Como formatamos uma célula para o padrão de moeda brasileiro (
R$ #,##0.00) via código VBA? - O que ocorre se esquecermos de reativar
Application.ScreenUpdating = Trueao final de uma macro? - No Desafio de Fixação, qual foi a lógica utilizada para acumular apenas a parcela de juros apurada na auditoria?