Macros e VBA

Repetição de Ações Com um Loop no Excel VBA

Aprenda a criar repetição de ações com loop no Excel VBA. Guia completo com exemplos práticos de For, Do While, For Each e muito mais.

A automação de tarefas repetitivas é um dos principais motivos pelos quais profissionais recorrem ao VBA (Visual Basic for Applications) no Excel. A capacidade de realizar repetição de ações com loop no Excel VBA permite executar operações complexas em segundos, eliminando trabalho manual tedioso e propenso a erros.

Loops são estruturas de programação que executam um bloco de código múltiplas vezes até que uma condição específica seja atendida. No contexto do Excel, isso significa poder processar centenas ou milhares de linhas de dados, formatar células automaticamente, realizar cálculos em lote ou validar informações sem intervenção manual.

Dominar as diferentes estruturas de loop VBA é essencial para quem deseja criar macros eficientes e profissionais. Este tutorial completo abordará todos os tipos de loops disponíveis no VBA, desde estruturas básicas até técnicas avançadas de otimização, com exemplos práticos aplicáveis ao dia a dia corporativo.

O Que São Loops no VBA?

Gravar uma Macro no Excel 2015

Loops são instruções que permitem executar um conjunto de comandos repetidamente enquanto uma condição for verdadeira ou por um número determinado de vezes. No Excel VBA, loops são fundamentais para:

Processamento em Massa: Aplicar formatação, fórmulas ou validações em grandes volumes de dados sem processar célula por célula manualmente.

Iteração por Coleções: Percorrer planilhas, gráficos, tabelas dinâmicas ou intervalos de células de forma sistemática.

Cálculos Repetitivos: Realizar operações matemáticas complexas que requerem múltiplas iterações até atingir convergência.

Validação de Dados: Verificar automaticamente milhares de registros aplicando regras de negócio específicas.

Tipos de Loops no Excel VBA

1. Loop For...Next

O loop For...Next é ideal quando você sabe exatamente quantas vezes precisa repetir uma ação. É a estrutura mais utilizada para processar linhas ou colunas específicas.

Sintaxe básica:

For contador = início To fim Step incremento
    'Código a ser executado
Next contador

Exemplo prático - Numerar linhas:

Sub NumerarLinhas()
    Dim i As Long
    
    For i = 1 To 100
        Cells(i, 1).Value = i
    Next i
    
    MsgBox "Numeração concluída!", vbInformation
End Sub

Exemplo com Step - Processar linhas pares:

Sub ProcessarLinhasPares()
    Dim linha As Long
    
    For linha = 2 To 100 Step 2
        Cells(linha, 2).Interior.Color = RGB(200, 200, 200)
    Next linha
End Sub

Exemplo decrescente - Deletar linhas vazias:

Sub DeletarLinhasVazias()
    Dim i As Long
    
    'Loop reverso para evitar problemas ao deletar
    For i = 100 To 1 Step -1
        If WorksheetFunction.CountA(Rows(i)) = 0 Then
            Rows(i).Delete
        End If
    Next i
End Sub

2. Loop For Each...Next

O loop For Each é perfeito para iterar por coleções de objetos sem precisar conhecer o índice exato. Muito utilizado para percorrer células em um intervalo ou planilhas em uma pasta de trabalho.

Sintaxe básica:

For Each elemento In coleção
    'Código a ser executado
Next elemento

Exemplo - Formatar células com valores negativos:

Sub FormatarNegativos()
    Dim celula As Range
    
    For Each celula In Range("A1:A100")
        If IsNumeric(celula.Value) Then
            If celula.Value < 0 Then
                celula.Font.Color = vbRed
                celula.Font.Bold = True
            End If
        End If
    Next celula
End Sub

Exemplo - Proteger todas as planilhas:

Sub ProtegerTodasPlanilhas()
    Dim ws As Worksheet
    
    For Each ws In ThisWorkbook.Worksheets
        ws.Protect Password:="senha123"
    Next ws
    
    MsgBox "Todas as planilhas foram protegidas!", vbInformation
End Sub

Exemplo - Ocultar gráficos vazios:

Sub OcultarGraficosVazios()
    Dim grafico As ChartObject
    
    For Each grafico In ActiveSheet.ChartObjects
        If grafico.Chart.SeriesCollection.Count = 0 Then
            grafico.Visible = False
        End If
    Next grafico
End Sub

3. Loop Do While...Loop

O loop Do While executa o código enquanto uma condição específica for verdadeira. A verificação acontece antes da execução, então o código pode nunca ser executado se a condição inicial for falsa.

Sintaxe básica:

Do While condição
    'Código a ser executado
Loop

Exemplo - Encontrar última linha com dados:

Sub EncontrarUltimaLinha()
    Dim linha As Long
    linha = 1
    
    Do While Cells(linha, 1).Value <> ""
        linha = linha + 1
    Loop
    
    MsgBox "Última linha com dados: " & linha - 1, vbInformation
End Sub

Exemplo - Preencher até encontrar total:

Sub PreencherAtéTotal()
    Dim linha As Long
    linha = 2
    
    Do While Cells(linha, 1).Value <> "TOTAL"
        Cells(linha, 4).Formula = "=B" & linha & "*C" & linha
        linha = linha + 1
    Loop
End Sub

Exemplo - Limpar espaços duplicados:

Sub LimparEspacosDuplicados()
    Dim celula As Range
    Set celula = Range("A1")
    
    Do While celula.Value <> ""
        celula.Value = WorksheetFunction.Trim(celula.Value)
        Set celula = celula.Offset(1, 0)
    Loop
End Sub

4. Loop Do...Loop While

Similar ao Do While, mas a verificação da condição acontece após a execução do código, garantindo que o bloco seja executado pelo menos uma vez.

Sintaxe básica:

Do
    'Código a ser executado
Loop While condição

Exemplo - Validação de entrada:

Sub ValidarEntrada()
    Dim valor As String
    
    Do
        valor = InputBox("Digite um número entre 1 e 10:")
        If valor = "" Then Exit Sub
    Loop While Not IsNumeric(valor) Or valor < 1 Or valor > 10
    
    MsgBox "Valor válido: " & valor, vbInformation
End Sub

5. Loop Do Until...Loop

O loop Do Until executa o código até que uma condição se torne verdadeira. É o inverso lógico do Do While.

Sintaxe básica:

Do Until condição
    'Código a ser executado
Loop

Exemplo - Copiar dados até célula vazia:

Sub CopiarDadosAtéVazio()
    Dim origem As Long
    Dim destino As Long
    
    origem = 1
    destino = 1
    
    Do Until Cells(origem, 1).Value = ""
        If Cells(origem, 2).Value > 1000 Then
            Rows(origem).Copy Destination:=Worksheets("Destino").Rows(destino)
            destino = destino + 1
        End If
        origem = origem + 1
    Loop
End Sub

Comparação Entre Tipos de Loops

Tipo de LoopQuando UsarVerificaçãoExecução Mínima
For...NextNúmero exato de repetições conhecidoInício0 vezes (se início > fim)
For EachPercorrer coleções de objetosAutomática0 vezes (coleção vazia)
Do WhileCondição verificada antesAntes do código0 vezes
Do...Loop WhileCondição verificada depoisDepois do código1 vez (mínimo)
Do UntilAté condição se tornar verdadeiraAntes do código0 vezes
Do...Loop UntilExecução garantida mínimaDepois do código1 vez (mínimo)

Loops Aninhados no VBA

Loops aninhados são estruturas onde um loop está contido dentro de outro, permitindo processar dados bidimensionais como tabelas completas.

Exemplo - Preencher tabela de multiplicação:

Sub TabelaMultiplicacao()
    Dim linha As Integer
    Dim coluna As Integer
    
    For linha = 1 To 10
        For coluna = 1 To 10
            Cells(linha, coluna).Value = linha * coluna
        Next coluna
    Next linha
    
    Range("A1:J10").HorizontalAlignment = xlCenter
End Sub

Exemplo - Formatar todas as células de múltiplas planilhas:

Sub FormatarTodasPlanilhas()
    Dim ws As Worksheet
    Dim celula As Range
    
    For Each ws In ThisWorkbook.Worksheets
        For Each celula In ws.UsedRange
            If IsNumeric(celula.Value) Then
                celula.NumberFormat = "#,##0.00"
            End If
        Next celula
    Next ws
End Sub

Exemplo - Validar matriz de dados:

Sub ValidarMatriz()
    Dim i As Long
    Dim j As Long
    Dim erros As Long
    
    erros = 0
    
    For i = 2 To 100
        For j = 1 To 5
            If Not IsNumeric(Cells(i, j).Value) Then
                Cells(i, j).Interior.Color = vbYellow
                erros = erros + 1
            End If
        Next j
    Next i
    
    MsgBox "Total de erros encontrados: " & erros, vbInformation
End Sub

Controle de Fluxo em Loops

Exit For e Exit Do

Permitem sair prematuramente de um loop quando uma condição específica é atendida.

Exemplo - Buscar valor específico:

Sub BuscarProduto()
    Dim i As Long
    Dim produto As String
    
    produto = InputBox("Digite o nome do produto:")
    
    For i = 1 To 1000
        If Cells(i, 1).Value = produto Then
            MsgBox "Produto encontrado na linha " & i, vbInformation
            Exit For
        End If
    Next i
End Sub

Exemplo - Parar em condição crítica:

Sub VerificarEstoque()
    Dim linha As Long
    linha = 2
    
    Do While Cells(linha, 1).Value <> ""
        If Cells(linha, 3).Value < 0 Then
            MsgBox "ERRO: Estoque negativo na linha " & linha, vbCritical
            Exit Do
        End If
        linha = linha + 1
    Loop
End Sub

Otimização de Performance em Loops

Desabilitar Atualização de Tela

Sub ProcessamentoOtimizado()
    Dim i As Long
    
    'Desabilitar atualização de tela
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    For i = 1 To 10000
        Cells(i, 1).Value = i * 2
        Cells(i, 2).Value = i ^ 2
    Next i
    
    'Reabilitar
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    
    MsgBox "Processamento concluído!", vbInformation
End Sub

Usar Arrays ao Invés de Células

Trabalhar com arrays é significativamente mais rápido:

Sub UsarArrays()
    Dim dados() As Variant
    Dim i As Long
    
    'Ler dados para array
    dados = Range("A1:A10000").Value
    
    'Processar array
    For i = 1 To UBound(dados, 1)
        dados(i, 1) = dados(i, 1) * 1.1
    Next i
    
    'Escrever de volta
    Range("B1:B10000").Value = dados
End Sub

Exemplos Práticos Avançados

Exemplo 1: Consolidar Dados de Múltiplas Planilhas

Sub ConsolidarPlanilhas()
    Dim ws As Worksheet
    Dim destino As Worksheet
    Dim ultimaLinha As Long
    Dim linhaDestino As Long
    
    Set destino = Worksheets("Consolidado")
    linhaDestino = 2
    
    Application.ScreenUpdating = False
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Consolidado" Then
            ultimaLinha = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
            
            ws.Range("A2:E" & ultimaLinha).Copy _
                Destination:=destino.Cells(linhaDestino, 1)
            
            linhaDestino = destino.Cells(destino.Rows.Count, 1).End(xlUp).Row + 1
        End If
    Next ws
    
    Application.ScreenUpdating = True
    MsgBox "Consolidação concluída!", vbInformation
End Sub

Exemplo 2: Criar Relatório de Vendas por Vendedor

Sub RelatorioVendas()
    Dim i As Long
    Dim vendedor As String
    Dim total As Double
    Dim linhaRelatorio As Long
    
    Application.ScreenUpdating = False
    
    'Limpar relatório anterior
    Worksheets("Relatório").Range("A2:B1000").ClearContents
    linhaRelatorio = 2
    
    'Loop por vendedores únicos
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        vendedor = Cells(i, 1).Value
        total = 0
        
        'Somar vendas do vendedor
        For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            If Cells(j, 1).Value = vendedor Then
                total = total + Cells(j, 3).Value
            End If
        Next j
        
        'Escrever no relatório
        With Worksheets("Relatório")
            .Cells(linhaRelatorio, 1).Value = vendedor
            .Cells(linhaRelatorio, 2).Value = total
        End With
        
        linhaRelatorio = linhaRelatorio + 1
    Next i
    
    Application.ScreenUpdating = True
End Sub

Exemplo 3: Validar CPF em Massa

Sub ValidarCPFs()
    Dim i As Long
    Dim cpf As String
    Dim validos As Long
    Dim invalidos As Long
    
    validos = 0
    invalidos = 0
    
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        cpf = Cells(i, 1).Value
        
        If ValidarCPF(cpf) Then
            Cells(i, 2).Value = "Válido"
            Cells(i, 2).Interior.Color = RGB(144, 238, 144)
            validos = validos + 1
        Else
            Cells(i, 2).Value = "Inválido"
            Cells(i, 2).Interior.Color = RGB(255, 182, 193)
            invalidos = invalidos + 1
        End If
    Next i
    
    MsgBox "Validação concluída!" & vbCrLf & _
           "Válidos: " & validos & vbCrLf & _
           "Inválidos: " & invalidos, vbInformation
End Sub

Benefícios da Repetição de Ações com Loop VBA

1. Produtividade Exponencial

Elimine tarefas que levariam horas ou dias para serem concluídas manualmente, processando milhares de registros em segundos com código automatizado eficiente.

2. Precisão e Consistência

Loops executam instruções exatamente da mesma forma todas as vezes, eliminando erros humanos de digitação, formatação inconsistente ou esquecimento de etapas.

3. Escalabilidade de Processos

Códigos com loops se adaptam automaticamente ao volume de dados, funcionando igualmente bem com 10 ou 10.000 registros sem necessidade de ajustes.

4. Redução de Custos Operacionais

Automatizar processos repetitivos libera equipes para atividades estratégicas, reduzindo necessidade de trabalho manual e custos com retrabalho.

5. Padronização de Operações

Garanta que todos os dados sejam processados seguindo exatamente as mesmas regras de negócio, facilitando auditorias e conformidade regulatória.

Erros Comuns e Como Evitar

Loop Infinito

Problema:

'ERRO - Loop nunca termina
Do While x > 0
    Cells(1, 1).Value = x
Loop

Solução:

Do While x > 0
    Cells(1, 1).Value = x
    x = x - 1 'Incrementar/decrementar contador
Loop

Modificar Coleção Durante Iteração

Problema:

'ERRO - Deletar durante For Each causa problemas
For Each ws In Worksheets
    ws.Delete
Next ws

Solução:

'Usar loop reverso com For
For i = Worksheets.Count To 1 Step -1
    Worksheets(i).Delete
Next i

Não Declarar Variáveis

Problema:

'Sem Option Explicit - dificulta depuração
For i = 1 To 100
    total = total + Cells(i, 1).Value
Next i

Solução:

Option Explicit

Sub Procedimento()
    Dim i As Long
    Dim total As Double
    
    For i = 1 To 100
        total = total + Cells(i, 1).Value
    Next i
End Sub

Dicas de Boas Práticas

Use Option Explicit: Sempre declare essa instrução no início dos módulos para forçar declaração de variáveis e evitar erros.

Indente corretamente: Mantenha código organizado com indentação clara para facilitar leitura e manutenção.

Comente seu código: Adicione comentários explicando lógica complexa, especialmente em loops aninhados.

Teste com dados reduzidos: Antes de processar milhares de linhas, teste a lógica com 10-20 registros.

Implemente tratamento de erros: Use On Error Resume Next ou On Error GoTo para gerenciar situações inesperadas.

Monitore performance: Para loops longos, adicione barra de progresso ou mensagens de status.

Libere objetos: Use Set objeto = Nothing ao final para liberar memória.

Conclusão

Dominar a repetição de ações com loop no Excel VBA é fundamental para qualquer profissional que deseja automatizar processos e maximizar produtividade. As estruturas de loop apresentadas neste tutorial — For...Next, For Each, Do While, Do Until e suas variações — oferecem flexibilidade total para resolver desde tarefas simples até desafios complexos de processamento de dados.

A escolha do tipo correto de loop depende da natureza da tarefa: use For...Next quando souber o número exato de iterações, For Each para coleções de objetos, e loops Do para situações onde a condição de parada é dinâmica. Combinar essas estruturas com técnicas de otimização como desabilitar atualização de tela e trabalhar com arrays resulta em macros extremamente eficientes.

Implemente esses conceitos gradualmente em seus projetos, começando com automações simples e evoluindo para processos mais sofisticados. A prática consistente transformará você em um desenvolvedor VBA capaz de criar soluções robustas que agregam valor real ao negócio e economizam horas preciosas de trabalho manual.

Perguntas Frequentes

1. Qual é a diferença entre For e For Each no VBA?

O loop For...Next é usado quando você conhece o número exato de iterações, trabalhando com contadores numéricos. Já o For Each percorre automaticamente todos os elementos de uma coleção (células, planilhas, gráficos) sem necessidade de índices, sendo mais elegante e menos propenso a erros em coleções de objetos.

2. Como evitar loops infinitos no Excel VBA?

Sempre garanta que a condição de parada seja eventualmente atendida. Em loops Do While/Until, certifique-se de que a variável controladora seja modificada dentro do loop. Use contadores de segurança que forcem saída após determinado número de iterações ou implemente Exit Do/Exit For em condições críticas.

3. Loops VBA deixam o Excel lento, como otimizar?

Desabilite Application.ScreenUpdating e Application.Calculation antes do loop e reabilite depois. Trabalhe com arrays ao invés de ler/escrever células individualmente. Evite selecionar células desnecessariamente. Use variáveis para armazenar referências a objetos frequentemente acessados, reduzindo drasticamente o tempo de processamento.

4. Posso interromper um loop VBA manualmente durante execução?

Sim, pressione Esc ou Ctrl+Break durante a execução para interromper. Para maior controle, implemente verificação de tecla pressionada dentro do loop usando DoEvents e testando Application.EnableCancelKey. Considere adicionar botões de pausa ou barras de progresso com opção de cancelamento em processos longos.

Edivaldo

Edivaldo. Analista de funções e fórmulas de Excel, adoro fazer planilhas e compartilhar meus conhecimentos com as pessoas. Seja bem-vindo ao tudo Excel, onde você aprende de graça e tira suas dúvidas.

3 Comentários

  1. boa noite, criei uma planilha para contagem de estoque onde colocando o codigo do produto em uma coluna, o excel me traz em outra coluna com a " descrição - estoque físico", porém agora preciso fazer com que o excel pesquise na coluna onde tem a descrição do produto e a referência do produto e me diga qual é o código dele,
    alguém pode me ajudar?

    1. Olá. Seria melhor ler a postagem, que explica, como fazer planilha de controle de estoque, neste site.
      Usando fórmulas e funções, você terá menos dor de cabeça do que usar VBA. Aliás, eu coloquei alguns exemplos de VBA, mas particularmente não gosto de trabalhar com planilhas com macros, vba, etc, porque se precisar compartilhar, gera muita incompatibilidade.

  2. Criei este código o qual ao clicar no botão ele busca o registro em uma celula na planilha 2 e cola em uma outra celula na planilha 1.

    Ocorre que gostaria de criar uma repetição para caso clique novamente no botão ele buscasse registros da celula da linha seguinte e colasse na mesma celula da planilha 1.

    Segue meu cogido criado

    Sheets("DADOS").Select
    Range("A2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("AÇÃO").Select
    Range("C5").Select
    ActiveSheet.Paste

Deixe um comentário

Botão Voltar ao topo