Formas de Loop com For e For Each no VBA Excel – Guia completo
Esta publicação fornece um guia completo para quem quer aprender a criar um loop no VBA.
Caso estaja procurando informações sobre VBA While e VBA Do Loop acesse aqui! Mas caso deseje obter informações rápidas sobre Loop For, consulte a tabela na seção abaixo:
Um guia rápido para declarações de loop no VBA Excel
Formato Loop | Descrição | Exemplo |
For … Next | Percorre o elemento 10 vezes | For i = 1 To 10 Next |
For … Next | Percorre o elemento 5 vezes i = 2, 4, 6 etc | For i = 2 To 10 Step 2 Next |
For … Next | Executa na ordem inversa | For i = 10 To 1 Step -1 Debug.Print i Next |
For … Next | Percorre o elemento de uma coleção | For i = 1 To coll.Count Debug.Print coll(i) Next |
For … Next | Percorre o elemento de uma matriz | For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next i |
For … Next | Percorre o elemento de uma matriz 2D | For i = LBound(arr) To UBound(arr) For j = LBound(arr,2) To UBound(arr,2) Debug.Print arr(i, j) Next j Next i |
For Each … Next | Percorre o elemento de uma coleção | Dim item As Variant For Each item In coll Debug.Print item Next item |
For Each … Next | Percorre o elemento de uma matriz | Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Percorre o elemento de uma matriz 2D | Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Percorre o Dicionário | Dim key As Variant For Each key In dict.Keys Debug.Print key, dict(key) Next key |
Ambos os tipos | Loop de saída | For i = 1 To 10 If Cells(i,1) = “encontrado” Then Exit For End If Next i |
Introdução ao VBA For Loop
O loop é de longe o componente mais poderoso do VBA. É como se ele fosse o combustível das macros! Uma de suas caracteristicas é executar tarefas em milissegundos que levariam horas para serem realizadas por nós. Além disso, reduz drasticamente as linhas de código que os aplicativos precisam.
Para quem nunca trabalhou com loops antes, então este post é um ótimo lugar para começar. Eu escrevo aqui, um guia detalhado sobre loops, escrito de forma simples e sem o jargão.
O que significa For Loop no VBA?
Um loop é simplesmente uma maneira de executar as mesmas linhas de código várias vezes. Porém, obviamente, executar o mesmo código repetidamente daria o mesmo resultado.
Portanto, o que é importante entender é que as linhas de código normalmente contêm uma variável que muda cada vez que o loop é executado.
Por exemplo, um loop pode executar um código com os dados da célula A1, A2, A3 e assim por diante, na medida que as linhas forem se alterando.
Veja um exemplo de como isso funciona:
Exemplo 1
O código abaixo imprime os valores de 1 a 5 na Janela de Verificação Imediata (Ctrl + G para visualizar).
A Janela de Verificação Imediata
Caso você ainda não tenha trabalhado com a “Janela de Verificação Imediata” antes, deixo aqui uma breve explicação.
A função Debug.Print grava valores na janela de verificação imediata. Para visualizar esta janela, selecione Exibir > Janela ‘ Verificação imediata’ no menu do VBA ou então utilize o atalho Ctrl + G.
Exemplo 2
Agora imagine que se deseje imprimir os números de 1 a 20. A princípio, seria necessário adicionar mais 15 linhas no exemplo acima. Porém, usando um loop é necessário escrever Debug.Print só uma vez.
Temos como resultado:
Teste o código você mesmo:
Public Sub Mostrar_valor()
For i = 1 To 20
Debug.Print i
Next i
End Sub
Caso queira imprimir os números de 1 a 1000, apenas substitua o número 20 por 1000.
Normalmente, quando se escreve o código é comum usar uma variável em vez de um número como 20 ou 1000. Esta prática oferece maior flexibilidade. O usuário decide o número de vezes que deseja executar o loop quando o código estiver em execução. O exemplo a seguir explica isso:
Exemplo 3
Uma tarefa comum no Excel é ler todas as linhas com dados. Então, a maneira como se deve aborda esta tarefa é a seguinte:
- Encontre a última linha com dados;
- Armazene o valor na variável;
- Use a variável para determinar quantas vezes o loop é executado
O uso de uma variável no loop torna o código flexível. Ele funcionará, não importa quantas linhas existam.
Vamos dar uma olhada em um exemplo: Imagine que você recebe uma folha com uma lista de frutas com a venda diária delas. Deseja-se contar o número de laranjas vendidas, considerando que essa lista varia em tamanho, dependendo das vendas.
A imagem a seguir mostra um exemplo desta lista:


' https://engenheiradoexcel.com/ Sub Contar_Frutas()
' Obter a última linha com texto Dim ult_linha As Long ult_linha = Planilha1.Cells(Planilha1.Rows.Count, 1).End(xlUp).Row Dim i As Long, Total As Long ' Usar ultima linha no loop For i = 2 To ult_linha
' Checar se a célula obtem o texto "Laranja" If Planilha1.Cells(i, 1).Value = "Laranja" Then
' Adicione o valor de unidade vendida na coluna B para a variável Total Total = Total + Planilha1.Cells(i, 2).Value
End If
Next i ' Mostrar total Debug.Print "O total de laranjas vendidas é:"; Total
End Sub
Tente alterar o código inserindo mais itens (frutas) na coluna A, e veja como o código funciona bem!
Se aumentado o número de itens para um valor bem maior, como 10.000, dificilmente será notado a diferença no tempo de execução do código. É quase instantâneo, porque os loops são super rápidos, e é isso que os torna tão poderosos. Imagine realizar uma tarefa manual em 10.000 células. Levaria uma quantidade considerável de tempo.
Vantagens do VBA For Loop
Para concluir esta seção, listo abaixo as principais vantagens do uso de loops:
- Reduzem o código de linhas;
- São flexíveis;
- São rápidos.
Nas próximas seções, veremos os diferentes tipos de loops e como usá-los.
Padrão do VBA For Loop
O VBA For Loop é o loop mais comum que o pessoal usa no Excel. Utilizamos esta expressão quando é preciso determinar o número de vezes que um código será executado.
Formato padrão do VBA For Loop
O formatdo padrão da expressão For Loop é a seguinte:
For <variável> = <valor inicial> to <valor final> Next <variável>
Os valores inicial e final podem ser variáveis ou invés de números fixos. Além disso, usar a variável após o Next é opcional, porém eu recomendo usa-la porque ela é útil e deixa claro a qual For Loop ela pertence.
Como um funciona o For Loop
Temos aqui um exemplo simples que imprime os números de 1 a 3:
Isso quer dizer o seguinte:
Eu atribui o valor 1 a variavél “i”, ou seja, o valor de “i” agora passa a ser 1.
O valor de “i” (agora igual a 1) é impresso (na janela de Verificação Imediata).
Após executado o passo acima, o VBA atribui o valor 2 a variavel “i”, ou seja, neste momento “i” passa a valer 2.
O valor de “i” (agora igual a 2) é impresso (na janela de Verificação Imediata).
Após executado o passo acima, o VBA atribui o valor 3 a variavel “i”, ou seja, “i” passa a valer 3.
O valor de “i” (agora igual a 3) é impresso (na janela de Verificação Imediata).
Sem o loop, o código equivalente seria:
A linha i = i + 1 é usada para adicionar o valor 1 a variável “i”. É uma maneira comum na programação de atualizar um contador.
Usando a função Step com o VBA For Loop
Veja que o valor de “i” aumenta em um intervalo de um em um. Esse é o padrão! Caso queira especificar esse intervalo, use a palavra-chave Step junto com a expressão For Loop.
O próximo exemplo mostra como fazer isso:
Podemos ainda usar um número negativo no Step para contar no sentido inverso. Note a diferença:
Importante: se o passo for positivo, o número inicial deve ser menor que o número final. O loop a seguir não será executado porque o número inicial 20 é maior que 10. O VBA, portanto, pensa que já atingiu o valor alvo 10.
Se o Step for negativo, o número inicial deve ser maior que o número final.
Como sair do For Loop
Às vezes, dependendo do resultado de determinada condição, é possivel fazer com que o loop se encerre. Um bom exemplo disso, é quando se lê um dado incorreto. Observe:
Usando o For Loop com uma coleção do VBA
O loop também pode ser usado para ler itens de uma coleção. Por exemplo a seguir, é exibido o nome de todas as pastas de trabalho abertas:
Teste o código você mesmo:
Sub Exemplo_For()
Dim i As Long For i = 1 To Workbooks.Count
Debug.Print Workbooks(i).FullName
Next i
End Sub
Nessa situação, o primeiro loop passaria por cada pasta de trabalho. E cada vez que esse loop é executado, ele usa um segundo loop para percorrer todas as planilhas dessa pasta de trabalho.

' https://engenheiradoexcel.com/ Sub Lista_Worksheets()
Dim i As Long, j As Long ' O primeiro loop percorre todas as pastas de trabalho For i = 1 To Workbooks.Count
' O segundo loop percorre todas as planilhas da pasta de trabalho em "i" For j = 1 To Workbooks(i).Worksheets.Count
Debug.Print Workbooks(i).Name + ":" + Worksheets(j).Name
Next j
Next i
End Sub
Este código funciona da seguinte maneira:
- O primeiro loop define i como 1;
- O segundo loop usa a pasta de trabalho dentro de 1, para percorrer as planilhas;
- O primeiro loop define i como 2;
- O segundo loop usa a pasta de trabalho em 2 para percorrer as planilhas.
- E assim por diante.
Na próxima seção, usaremos o Loop For Each para executar a mesma tarefa.
Loop For Each no VBA
O Loop For Each é usado para ler itens de uma coleção ou matriz. Ele pode ser usado para acessar todas as pastas de trabalho abertas no Excel. Isso ocorre porque, o Application.Workbooks é uma coleção de pastas de trabalho abertas.
Este é um exemplo simples de uso do Loop For Each:
Código:
' https://engenheiradoexcel.com/ Sub Exemplo_Loop_For_Each()
Dim wk As Workbook For Each wk In Workbooks
Debug.Print wk.FullName
Next wk
End Sub
Formato do VBA para cada loop
Para criar um Loop For Each, precisamos usar uma variável do mesmo tipo que a coleção. No exemplo que será demostrado abaixo, criamos uma variável do tipo Workbook.
Se a coleção tiver diferentes tipos de itens, a variável pode ser declarada como uma variante.
O VBA contém uma coleção chamada Sheets. Esta é uma coleção de planilhas do tipo Worksheet. Para passar por essa coleção, é preciso declarar a variável como uma variante.
O código a seguir usa o For Each para imprimir o nome de todas as planihas na pasta de trabalho atual:
O código trabalhado acima é:
' https://engenheiradoexcel.com/ Sub Exemplo_Loop_For_Each()
Dim sh As Variant For Each sh In ThisWorkbook.Sheets
Debug.Print sh.Name
Next sh
End Sub
Podemos ver que o Loop For Each é mais fácil de escrever. No entanto, caso queira ler as planilhas em qualquer outra ordem, por exemplo, da direita para a esquerda, o Loop For deve ser usado de outra maneira:
Código:
' https://engenheiradoexcel.com/ Sub Exemplo_Loop_For()
' Lendo as planilhas da direita para a esquerda Dim i As Long For i = ThisWorkbook.Worksheets.Count To 1 Step -1
Debug.Print ThisWorkbook.Worksheets(i).Name
Next
End Sub
VBA For Each Loop com matrizes
Uma coisa que deve ser esclarecida, é o fato de que o Loop For Each usado como matriz executa somente leitura.
O exemplo a seguir demonstra isso:
No primeiro loop, tentamos atribuir a variável x a “Z”. Feito isso, significa que x agora está se referindo à string “Z” e não mais ao item na matriz.
No segundo loop, quando imprimimos a matriz , repare que nenhum dos valores mudou.
A verdade é que, quando se usa o Loop For é possível alterar o item da matriz. Caso for alterado o código anterior para uso do Loop For, será alterarado todos os valores da matriz para “Z”.
O código é:
' https://engenheiradoexcel.com/ Sub Exemplo_Loop_For_com_Matriz()
'Crie uma matriz e adicione três valores Dim arr() As Variant arr = Array("A", "B", "C")
Dim i As Long For i = LBound(arr) To UBound(arr)
' Altera o valor na posição para Z arr(i) = "Z"
Next ' Imprimir itens para mostrar que os valores da matriz foram alterados For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
Se a coleção estiver armazenando objetos, é possível alterar os itens usando um Loop For Each.
Loop For Each aninhado
Já vimos que é possível ter um loop dentro de outros loops. A princípio, temos um exemplo já demostrado acima:
Desta vez, usaremos o Loop For Each para executar a mesma tarefa:
Segue o código usado acima:
' https://engenheiradoexcel.com/ Sub Ler_todas_Worksheets()
Dim wk As Workbook, sh As Worksheet ' Ler cada pasta de trabalho (workbook) For Each wk In Workbooks
' Ler cada planilha na pasta de trabalho atribuida a wk For Each sh In wk.Worksheets ' Imprimir o nome da pasta de trabalho e o nome da planilha Debug.Print wk.Name + ": " + sh.Name Next sh
Next wk
End Sub
Esta é uma maneira mais clara de executar esta tarefa, ao invés de usar o Loop For:
O acima código é executado da seguinte maneira:
- Obter a primeira pasta de trabalho da coleção Workbooks;
- Percorra todas as planilhas nesta pasta de trabalho;
- Imprimir os detalhes da pasta de trabalho/planilha;
- Obter as próximas pastas de trabalho na coleção
- Repita as etapas 2 a 3;
- Continue até que não haja mais pastas de trabalho na coleção.
Como fazer um Loop através de um intervalo
No Excel VBA, o uso mais comum do Loop For é ler intervalos.
Entretanto, imagine que temos os dados definidos na imagem abaixo, e temos como tarefa escrever um código que leia os dados e copie os valores para a coluna J. Porém, vamos copiar apenas os valores maiores que R$ 200,00.
O exemplo a seguir mostra como fazemos isso:
O código apresentdo acima é:
' Ler um intervalo do Excel usando o VBA For Loop ' https://engenheiradoexcel.com/ Sub Mega_Exemplo()
' Obter planilha Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Planilha1") ' Obter intervalo Dim rg As Range Set rg = sh.Range("A1").CurrentRegion ' Excluir saída existente sh.Range("J1").CurrentRegion.ClearContents ' Defina a primeira linha de saída Dim lin As Long lin = 1 ' Leia todas as linhas usando o Loop For Dim i As Long For i = 2 To rg.Rows.Count
' Verifique se o valor é maior que 200,000 If rg.Cells(i, 4).Value > 200 Then
' Copiar valor para a coluna J sh.Cells(lin, "J").Value = rg.Cells(i, 4).Value ' Mover para a próxima linha de saída lin = lin + 1
End If
Next i
End Sub
Como resultado temos:
Este é um exemplo muito básico de como copiar dados usando o Excel VBA. Espero que tenha gostado!
Conclusão
Neste artigo vimos como trabalhar com as funções For e For Each no VBA.
Recomendo fortemente que você tome coragem de repetir todo o passo-a-passo. Eu penso que praticar é a melhor maneira de aprender e, embora pareça simples, é preciso se acostumar a navegar entre as telas para que no futuro você possa se tornar um usuário avançado.
Eu sei que não é comum ler um artigo deste, como tutorial, e repetir para aprender, mas recomendo fortemente que você tome coragem de repetir todo o passo-a-passo. Desenvolva seu próprio método, veja o que te ajuda, implemente-o para se tornar fluente na ferramenta Excel VBA.
O site deste pessoal aqui foi referência para este artigo. O site é muitoooo bacana com várias dicas legais de programação, mas infelizmente o conteúdo está em inglês, o que não deixa de ser uma boa referência para quem conseguir acompanhar. Eu recomendo.
Por fim, termino aqui este artigo, mas deixo linkado abaixo, outros conteudos relacionados a VBA para que você fique ligado! Até a próxima.
Como Automatizar Planilha com VBA no Excel com EXEMPLOS
Como Criar Macro no Excel – A FORMA MAIS FÁCIL
Como Declarar Variáveis no VBA
Encontre seus erros no VBA com DEBUG
Como Ler e Escrever em Células – Automatize sua planilha já
Como Selecionar Célula de Outra Planilha com VBA no Excel
Como Comentar Código no VBA Excel – Uma ou mais linhas
Como Usar Caixa de Texto para Ler Dados – Excel VBA InputBox
Um comentário sobre “Formas de Loop com For e For Each no VBA Excel”