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.
Índice
- O Que São Loops no VBA?
- Tipos de Loops no Excel VBA
- Comparação Entre Tipos de Loops
- Loops Aninhados no VBA
- Controle de Fluxo em Loops
- Otimização de Performance em Loops
- Exemplos Práticos Avançados
- Benefícios da Repetição de Ações com Loop VBA
- Erros Comuns e Como Evitar
- Dicas de Boas Práticas
- Conclusão
- Perguntas Frequentes
O Que São Loops no VBA?

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 Loop | Quando Usar | Verificação | Execução Mínima |
|---|---|---|---|
| For...Next | Número exato de repetições conhecido | Início | 0 vezes (se início > fim) |
| For Each | Percorrer coleções de objetos | Automática | 0 vezes (coleção vazia) |
| Do While | Condição verificada antes | Antes do código | 0 vezes |
| Do...Loop While | Condição verificada depois | Depois do código | 1 vez (mínimo) |
| Do Until | Até condição se tornar verdadeira | Antes do código | 0 vezes |
| Do...Loop Until | Execução garantida mínima | Depois do código | 1 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.






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?
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.
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