For Next e Do While no VBA: Aula 6 com Exemplos

Aula 6 do Curso Gratuito de VBA do Excel. Você vai aprender a repetir tarefas automaticamente usando For…Next, Step, For Each, Do While e Do Until. Ao final, terá uma macro que percorre uma lista de vendas, calcula totais e identifica quem atingiu uma meta.

Navegação: Índice do curso | ← Aula 5 — If, ElseIf e Else | Aula 6 — Laços de repetição.

O que é um laço de repetição no VBA?

Um laço de repetição (loop) executa instruções várias vezes sem que você precise duplicar linhas de código. Imagine conferir as vendas de 300 funcionários. Em vez de escrever a mesma regra 300 vezes, o VBA percorre as linhas e aplica a regra a cada uma.

Há duas perguntas importantes antes de escolher um laço: você sabe quantas vezes deseja repetir? e qual condição faz a repetição terminar? Normalmente, use For...Next quando houver uma contagem conhecida; use Do While ou Do Until quando o encerramento depender de uma condição.

Prepare o Excel antes de praticar

Utilize o Excel instalado no computador. O Excel para a Web não executa VBA. Crie uma pasta de trabalho nova e vazia; os exemplos que escrevem em células devem ser executados somente nela. No Windows, pressione Alt + F11 para abrir o Editor VBA e selecione Inserir > Módulo. No Mac, abra o editor pela guia Desenvolvedor; os atalhos podem variar.

  1. Na primeira linha do módulo padrão, antes de qualquer procedimento, escreva Option Explicit. Ele exige declarar as variáveis e ajuda a detectar nomes digitados incorretamente.
  2. Os exemplos a seguir são procedimentos independentes. Você pode colá-los no mesmo módulo, sem repetir Option Explicit.
  3. Para executar um exemplo, deixe o cursor dentro da respectiva macro e pressione F5 no Editor VBA; no Excel para Windows, também pode usar Alt + F8.
  4. Salve seus exercícios como Pasta de Trabalho Habilitada para Macro do Excel (*.xlsm), pois o formato .xlsx não guarda o projeto VBA.
  5. Não habilite macros de arquivos desconhecidos ou de fontes não confiáveis.

1. For…Next: repetir um número conhecido de vezes

A estrutura For contador = início To fim executa o trecho até chegar ao limite e usa Next contador para avançar. Vamos enviar os números de 1 a 5 para a Janela Imediata do Editor VBA, sem alterar a planilha.

Sub Aula6_ForNext()
    Dim contador As Long

    For contador = 1 To 5
        Debug.Print "Número: " & contador
    Next contador
End Sub

No VBE para Windows, abra a Janela Imediata com Ctrl + G e execute a macro. Serão exibidas cinco linhas: Número: 1, Número: 2, Número: 3, Número: 4 e Número: 5. A variável contador assume cada valor inteiro no intervalo.

Como alterar os passos com Step

Por padrão, o contador aumenta de 1 em 1. Com Step, você define outro intervalo. Para exibir somente números pares, utilize Step 2:

Sub Aula6_ForStep()
    Dim n As Long

    For n = 2 To 10 Step 2
        Debug.Print n
    Next n

    For n = 5 To 1 Step -1
        Debug.Print "Regressiva: " & n
    Next n
End Sub

Resultado esperado: primeiro os números 2, 4, 6, 8 e 10; depois uma contagem regressiva de 5 até 1. Para uma contagem regressiva, o Step precisa ser negativo. Se o incremento não permitir alcançar o limite, o bloco poderá nem ser executado.

2. For Each: percorrer células sem contar posições

For Each é indicado quando você quer percorrer cada elemento de uma coleção, como as células de um intervalo. No exemplo, cada célula de A2:A5 da planilha ativa será examinada para contar quantas estão preenchidas.

Sub Aula6_ForEach()
    Dim celula As Range
    Dim preenchidas As Long

    preenchidas = 0

    For Each celula In ActiveSheet.Range("A2:A5")
        If Len(Trim$(CStr(celula.Value2))) > 0 Then
            preenchidas = preenchidas + 1
        End If
    Next celula

    MsgBox "Células preenchidas: " & preenchidas
End Sub

Insira um nome em A2, outro em A3 e outro em A4, deixando A5 vazia. O resultado esperado é Células preenchidas: 3. Use esse exemplo com textos comuns, não com células contendo valores de erro como #N/D, porque a conversão por CStr exigiria tratamento adicional.

3. Do While: repetir enquanto uma condição for verdadeira

O laço Do While é executado enquanto a condição for verdadeira. O teste, na forma apresentada abaixo, ocorre no início. Se for falso desde o começo, nenhuma repetição acontece.

Sub Aula6_DoWhile()
    Dim contador As Long

    contador = 1

    Do While contador <= 5
        Debug.Print "Etapa: " & contador
        contador = contador + 1
    Loop
End Sub

O VBA imprime Etapa: 1 até Etapa: 5. A instrução contador = contador + 1 é fundamental: sem ela, a condição continuaria verdadeira, causando uma repetição sem fim. Durante a prática, se precisar interromper uma macro presa em um loop, tente Ctrl + Break no Windows; a resposta depende do ambiente e do estado de execução.

4. Do Until: repetir até a condição ficar verdadeira

Do Until funciona de forma complementar: executa instruções enquanto a condição de encerramento ainda é falsa. Veja o exemplo:

Sub Aula6_DoUntil()
    Dim contador As Long

    contador = 1

    Do Until contador > 5
        Debug.Print "Etapa: " & contador
        contador = contador + 1
    Loop
End Sub

A saída também será de Etapa: 1 até Etapa: 5. A diferença é que o teste está escrito como condição de parada: quando contador > 5 for verdadeiro, a execução termina.

For Next, For Each, Do While ou Do Until: qual escolher?

EstruturaQuando utilizarExemplo de uso
For...NextHá um intervalo de contagem conhecidoAnalisar linhas 2 a 20
For EachVocê quer percorrer objetos de uma coleçãoVerificar cada célula de A2:A20
Do WhileRepetir enquanto uma condição permanecer verdadeiraContinuar enquanto houver registros
Do UntilRepetir até uma condição de parada ser atingidaParar quando alcançar o limite

Projeto prático: relatório de vendas com repetição e If

Vamos combinar o assunto da Aula 5 (If) com a Aula 6 (For). O projeto percorre uma lista de vendedores, escreve Meta atingida ou Abaixo da meta, valida dados problemáticos e calcula quantos vendedores atingiram a meta.

Passo 1 — Crie uma tabela de teste

Em uma planilha nova e vazia, preencha as colunas A e B com os dados a seguir. Deixe a coluna C vazia. A macro preencherá C1 até a última linha de vendedor encontrada na coluna A. Ela também escreverá um pequeno resumo em E1:F2; mantenha essa área vazia.

LinhaA: VendedorB: Vendas (R$)C: Resultado esperado
1VendedorVendasSituação
2Ana1800Meta atingida
3Bruno900Abaixo da meta
4Carla1200Meta atingida
5Diegodeixe vazioRevisar dado

Passo 2 — Cole a macro no Editor VBA

No módulo padrão, insira o código completo abaixo. Ele usa For...Next para percorrer os vendedores de A2 até a última linha preenchida da coluna A, If...ElseIf para classificar cada resultado e duas variáveis do tipo Long para contar linhas e metas atingidas.

Sub Aula6_RelatorioVendas()
    Dim aba As Worksheet
    Dim ultimaLinha As Long
    Dim linha As Long
    Dim valor As Variant
    Dim status As String
    Dim metasAtingidas As Long
    Dim registros As Long

    Set aba = ActiveSheet
    ultimaLinha = aba.Cells(aba.Rows.Count, "A").End(xlUp).Row

    If ultimaLinha < 2 Then
        MsgBox "Preencha ao menos um vendedor na coluna A.", vbExclamation
        Exit Sub
    End If

    metasAtingidas = 0
    registros = 0
    aba.Range("C1").Value = "Situação"

    For linha = 2 To ultimaLinha
        valor = aba.Cells(linha, "B").Value2
        registros = registros + 1

        If IsError(valor) Then
            status = "Revisar dado"
        ElseIf IsEmpty(valor) Then
            status = "Revisar dado"
        ElseIf Not IsNumeric(valor) Then
            status = "Revisar dado"
        ElseIf CDbl(valor) < 0 Then
            status = "Revisar dado"
        ElseIf CDbl(valor) >= 1000 Then
            status = "Meta atingida"
            metasAtingidas = metasAtingidas + 1
        Else
            status = "Abaixo da meta"
        End If

        aba.Cells(linha, "C").Value = status
    Next linha

    aba.Range("E1").Value = "Indicador"
    aba.Range("F1").Value = "Quantidade"
    aba.Range("E2").Value = "Metas atingidas"
    aba.Range("F2").Value = metasAtingidas

    MsgBox "Analisados: " & registros & vbNewLine & _
           "Metas atingidas: " & metasAtingidas, vbInformation
End Sub

Passo 3 — Execute e confira

  1. Deixe a planilha com os dados ativa. A macro usa ActiveSheet e não detecta automaticamente se você está na aba correta.
  2. No Editor VBA, coloque o cursor dentro de Aula6_RelatorioVendas e pressione F5.
  3. Na coluna C, confira os resultados indicados na tabela: Ana e Carla com Meta atingida; Bruno com Abaixo da meta; Diego com Revisar dado.
  4. Confira o resumo em F2. O resultado esperado é 2 metas atingidas, de 4 registros analisados.
  5. Em B5, digite 1100 e execute novamente. Agora F2 deverá mostrar 3 metas atingidas.
  6. Acrescente Eva em A6 e 500 em B6. Execute mais uma vez: a macro deverá processar a nova linha e informar 5 registros.

Por que esse exemplo é diferente de uma macro para linhas fixas?

A instrução ultimaLinha = aba.Cells(aba.Rows.Count, "A").End(xlUp).Row identifica a última linha não vazia da coluna A. O laço acompanha novos vendedores inseridos abaixo da lista original. Há um limite importante: a macro pressupõe que a coluna A identifica os registros e não foi projetada para tabelas com linhas intermediárias vazias, milhares de fórmulas retornando texto vazio ou múltiplas tabelas na mesma planilha.

Cuidados: o código sobrescreve as células de saída em C1:C(última linha) e E1:F2. Utilize uma planilha de testes. Alterações feitas por macros geralmente não podem ser desfeitas com Ctrl + Z. Os resultados descritos são os resultados esperados pela revisão do código; esta atividade ainda deve ser conferida no Excel desktop.

Erros comuns em laços de repetição VBA

Esquecer Next ou Loop

Toda estrutura For precisa de Next, e a estrutura Do While ou Do Until apresentada aqui precisa de Loop. Se faltar o fechamento, o VBA pode gerar erro de compilação.

Criar uma repetição sem fim

Em Do While e Do Until, garanta que alguma instrução atualize a variável ou a condição que controla o encerramento. Por exemplo, um contador que começa em 1 precisa ser incrementado para chegar a 6 e encerrar um teste contador <= 5.

Usar uma variável que não foi declarada

Com Option Explicit no topo do módulo, você precisa declarar contador As Long ou outra variável antes de usá-la. Isso ajuda a identificar nomes digitados de forma errada.

Modificar a planilha errada

Os exemplos com ActiveSheet executam na planilha ativa no instante da execução. Se a intenção for operar em uma planilha específica, referencie-a explicitamente, por exemplo com ThisWorkbook.Worksheets("Vendas"), depois de criar uma aba com esse nome.

Misturar valores inválidos e números

Células vazias, erros do Excel e textos precisam ser tratados antes de comparações numéricas. No projeto, IsError, IsEmpty e IsNumeric ajudam a evitar operações com entradas inadequadas. A verificação acontece em ramos separados de If...ElseIf, antes de executar CDbl.

Exercícios da Aula 6

Desafio 1 — Tabuada com For Next

Crie a macro TabuadaDoSete. Usando For...Next e uma variável do tipo Long, envie à Janela Imediata as multiplicações de 7 × 1 até 7 × 10. O último resultado deverá ser 70.

Solução possível do Desafio 1

Sub TabuadaDoSete()
    Dim n As Long

    For n = 1 To 10
        Debug.Print "7 x " & n & " = " & (7 * n)
    Next n
End Sub

Desafio 2 — Contador com Do While

Escreva uma macro que comece com o número 10, reduza de 2 em 2 e mostre 10, 8, 6, 4 e 2 na Janela Imediata. O laço deve terminar quando o valor chegar a zero ou abaixo dele. Tente primeiro sem olhar a resposta.

Solução possível do Desafio 2

Sub ContagemDezAteDois()
    Dim numero As Long
    numero = 10

    Do While numero > 0
        Debug.Print numero
        numero = numero - 2
    Loop
End Sub

Desafio 3 — Meta dinâmica no projeto de vendas

No procedimento Aula6_RelatorioVendas, crie uma variável meta As Currency, atribua meta = 1500 antes do laço e substitua a comparação com 1000 por CDbl(meta). Com os valores originais do exercício, somente Ana deverá atingir a nova meta. Desafio extra: leia a meta de uma célula como H2, validando seu conteúdo antes de compará-la.

Perguntas frequentes sobre For e Do While

Qual a diferença entre For Next e Do While?

For...Next é muito usado quando sabemos a contagem ou os limites do intervalo. Do While é útil quando a repetição depende de uma condição que pode mudar durante a execução. Ambos podem resolver problemas semelhantes, mas a legibilidade e a condição de parada importam.

É possível sair de um For antes da última repetição?

Sim. A instrução Exit For encerra imediatamente o laço For atual. Em uma estrutura Do, use Exit Do. Use essas saídas quando existir uma condição clara de encerramento antecipado.

For Each é mais rápido que For Next?

Não existe uma regra universal. A escolha depende da coleção, da quantidade de dados e do trabalho realizado a cada repetição. Ao processar milhares de células, acessos repetidos à planilha podem ser o principal custo; o uso de matrizes VBA pode ser mais eficiente em cenários avançados.

Por que o Excel travou durante um loop?

Uma condição de saída incorreta pode causar repetição sem fim. Loops grandes também podem deixar o Excel ocupado por algum tempo. Verifique os limites, teste primeiro com poucos registros e acompanhe o código com F8 no VBE.

Conclusão e próxima aula do curso

Nesta aula você aprendeu a repetir operações com For…Next, percorrer células com For Each, controlar repetições por condições com Do While e Do Until e combinar laços com If. O projeto de vendas mostrou uma aplicação de escritório baseada em dados de uma planilha.

Continue: revise a Aula 5 — If, ElseIf e Else ou consulte o índice completo do curso de VBA. Próxima aula prevista: Select Case, uma alternativa para organizar várias decisões em código VBA.

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Solicitar exportação de dados

Utilize este formulário para solicitar uma cópia dos seus dados neste site.

Solicitar remoção de dados

Utilize este formulário para solicitar a remoção dos seus dados neste site.

Solicitar retificação de dados

Utilize este formulário para solicitar a retificação dos seus dados neste site. Aqui você pode corrigir ou atualizar seus dados por exemplo.

Solicitar cancelamento de inscrição

Utilize este formulário para solicitar o cancelamento de inscrição do seu e-mail em nossas Listas de E-mail.