Estruturas de Repetição VBA. Se você é um programador de Visual Basic, certamente já ouviu falar sobre as estruturas de repetição do VBA. Caso ainda seja um completo iniciante, fique sabendo que em algum momento você irar precisar desses eventos.
Nesse artigo irei apresentar 4 estruturas de repetição que uso em meus projetos. Para uma noção geral sobre todas as estruturas de repetição VBA. Recomendo que você leia e aumente sua base de conhecimento a respeito das estruturas de repetição do VBA.
Estruturas de Repetição VBA – O Que é, Quando e Qual Usar?
Mas do que somente entender as estruturas de repetição, o programador precisa saber quando e qual delas usar. Essa dúvida é muito frequente entre centenas de programadores VBA, mas fique tranquilo você não estar sozinho.
Mas a final o que é estrutura de repetição?
As estruturas de repetição também são conhecidas como laços (loops). São utilizados para executar repetidamente uma instrução, ou bloco de instrução enquanto determinada condição for verdadeira.
No mundo da programação não existe uma regra que te obriga a usar as estruturas de repetição. Mas haverá momentos em que você sentirá a necessidade de atribuir essas funções em seus projetos, tipo por exemplo:
• Preencher Caixas de Listagem
• Percorrer Por Um RecordSet
• Verificar Registros Do DataBase
• Limpar Caixas de Textos
Essas são algumas das formas distintas de se trabalhar com as estruturas de repetição, isso em qualquer linguagem de programação. Claro que com o tempo você descobrira novas necessidades, por isso é importante estudar a fundo sobre essas funções.
Nesse artigo nós iremos falar sobre quatro estruturas de repetição do VBA, e elas são:
• Do While
• For Next
• For Each
• Do Until
Mostraremos exemplos práticos em que você pode aplicar esses eventos, afim de tornar seus aplicativos mais produtivos. Na programação VBA os eventos de repetição que mais utilizo são; Do Until, For Next e o For Each.
Estruturas de Repetição VBA – Do While
A primeira estrutura é o Do While, talvez por ser a mais simples de entender. A tradução de Do While é Faça Enquanto, ou seja, irá executar enquanto uma condição for verdadeira. Vejamos um exemplo simples do código:
<code>Sub Contador() Dim Contar As Integer Contar = 1 Do While Contar <= 10 Contar = Contar + 1 Loop End Sub 1 2 3 4 5 6 7 8 9 10 11 Sub Contador() Dim Contar As Integer Contar = 1 Do While Contar <= 10 Contar = Contar + 1 Loop End Sub</code>

Para o exemplo mostrado criamos basicamente uma Sub Contador, e dentro dessa sub criamos uma variável contar. Definimos que essa variável é do tipo Inteira e que deve receber valores de 1 até 10. Observe que, enquanto o valor de nossa variável não é maior que 10, o evento Do While continua fazendo o loop sempre adicionando + 1 em nossa variável.
Se você analisar o evento novamente com atenção, verá que temos uma pequena diferença no valor final da variável. Note que declaramos uma condição que se o valor fosse menor ou igual a 10, o loop deveria parar de contar. Mais na prática isso só aconteceu, quando nossa variável recebeu um valor maior do que 10.
Mas como pode? Eu disse para contar até que fosse menor ou igual a 10?
Imagine que você tenha em seu projeto uma caixa de combinação(ComboBox) e que ela só pode receber numerações de 1 a 10. Para o exemplo mostrado “não seria ideal usar o Do While“. Isso porque nós definimos os operadores < e =, sendo assim, o Do While só encerrara o loop quando minha variável for maior que 10.
Isso acontece porque o Do While faz o loop enquanto a condição é verdadeira. Ou seja, se o máximo de loops é de 10x, e minha condição enquanto Contar for menor ou igual a 10, não tem jeito ele vai adicionar +1 . Certamente isso poderia ser resolvido de 3 formas; ou eu removeria o operador = da minha condição, ou definiria ao invés do número 10 o 9.
Ou se não faria assim:
<code>Sub Contador() Dim Contar As Integer Contar = 1 Do While Contar <= 10 if Contar <= 10 then ComBobox.AddItem Contar end if Loop End Sub</code>
Mas isso é muito relativo, depende do projeto em que você estará implementando a rotina. Estou citando esses pequenos detalhes, para que você entenda mais sobre a estrutura de repetição Do While.
Estruturas de Repetição VBA – Veja Esse Exemplo Com o Do While:
<code>Sub Contador() Dim Contar, Encontrados, Idade, linhaPlan As Integer Dim Pessoa As String linhaPlan = 2 Contar = 1 Idade = 14 Do While Contar <= 31 Pessoa = Sheets("Pessoas").Cells(linhaPlan, "A") If Sheets("Pessoas").Cells(linhaPlan, "B") <= Idade Then Debug.Print Pessoa & Space(3); Sheets("Pessoas").Cells(linhaPlan, "C") Range("A" & linhaPlan & ":C" & linhaPlan).Select Selection.Style = "Neutro" Encontrados = Encontrados + 1 End If linhaPlan = linhaPlan + 1 Contar = Contar + 1 Loop Debug.Print "-------------------------------" Debug.Print "Total de " & Encontrados & " Registros" Debug.Print "-------------------------------" End Sub</code>

Nesse exemplo utilizei a mesma sub Contar para aplicar uma rotina, que consiste em localizar critérios de minha tabela.
Como você pode reparar na imagem a cima, existem 31 registros no meu intervalo. A função do meu loop foi buscar nesse intervalo, quais pessoas teriam a idade menor ou igual a de 14 anos. Sendo assim o programa marcaria quais seriam os registros na planilha, retornando as informações para a janela de verificação imediata do Visual Basic.
Você poderia adaptar essa rotina em uma solução, que visaria controlar o pagamento de seus clientes. É claro que podemos melhorar muito mais essa rotina, espero que você entenda a base disso tudo.
Estruturas de Repetição VBA – Evento For Next
Outra estrutura de repetição é o For… Next. É uma estrutura mais apropriada quando há variável de controle, como nos exemplos anteriores. Vejamos como fica o mesmo código anterior usando o For… Next:
<code>Sub Contador() Dim Contar As Integer For Contar = 1 to 10 Next Contar End Sub</code>

Ao contrário das estruturas de repetição Do… Loop, em For… Next a variável de controle é inicializada na própria estrutura, bem como o incremento. Não é necessário adicionar 1 à variável contar porque o laço já faz isso automaticamente. Contar receberá valores de 1 a 10 e a estrutura será encerrada ao final da décima execução.
Em um exemplo simples, você poderia usar o For Next para preencher uma caixa de combinação dessa forma:
<code>Sub Contador() Dim Contar As Integer For Contar = 1 to 10 ComboBox.AddItem = Contar Next Contar End Sub</code>
Se você também observar nesse exemplo, a variável final recebeu uma diferença de 1. Porem ao contrário do evento Do While, o compilador só adicionaria na caixa de combinação valores que estão dentro da condição. Você com certeza irá utiliza-lo muito para fazer diversos tipos de ações como por exemplo, preencher itens de um Listbox:
<code>Dim Linha As Integer Dim i As Integer With ListBox1 For i = 1 To 25 .AddItem .List(Linha, 0) = "COLUNA 1" .List(Linha, 1) = "COLUNA 2" .List(Linha, 2) = "COLUNA 3" .List(Linha, 3) = "COLUNA 4" Linha = Linha + 1 Next i End With</code>

Estruturas de Repetição VBA – Evento Do Until
O Do Until também é muito usado no mundo dos programadores, essa é uma das funções que mais utilizo em meus projetos. A tradução de Do Until é; Faça Até, ou seja, irá executar até que a condição seja verdadeira, exemplo:
<code>Sub Contador() Dim Contar As Integer Contar = 1 Do Until Contar >= 10 Contar = Contar + 1 Loop End Sub</code>

O Do Until executa até que a condição seja verdadeira, nesse caso é preciso definir o operador (=) . Caso contrário, ele só terminará o loop após minha variável ser maior que 10. A muito a ser fazer com o Do Until, geralmente o utilizo para gerar relatórios ou até mesmo para verificar critérios em uma tabela do Excel. A seguir eu irei montar um pequeno exemplo que consiste no seguinte:
A rotina a seguir possui estruturas de condições, logo é preciso que você tenha uma noção básica de algorítimos.
Imagine que você tenha vários nomes cadastrados na coluna (A) de sua planilha. E que precise criar um loop para encontrar em qual linha da planilha estar registrado um determinado nome. Para esse exemplo buscaremos pelo nome de PEDRO, retornando à informação para a janela de verificação imediata do VBA.

<code>Sub EncontrarNome() Dim linhaPlan As Integer Dim vNome As String linhaPlan = 2 vNome = "PEDRO" Do Until Sheets("TabelaNomes").Cells(linhaPlan, "A") = "" If Sheets("TabelaNomes").Cells(linhaPlan, "A") = vNome Then Debug.Print "-------------------------------------" Debug.Print "Sim " + vNome + " estar cadastrado na linha " & linhaPlan Debug.Print "-------------------------------------" Exit Sub Else Debug.Print vNome + " Não estar cadastrado na linha " & linhaPlan End If linhaPlan = linhaPlan + 1 Loop End Sub</code>

Estruturas de Repetição VBA – Entendendo como Funciona Essa Rotina.
vNome recebe a String que deverá ser encontrada, aqui ela representou o critério PEDRO!
No exemplo nós criamos uma Sub que se chama EncontrarNome, essa sub possui duas variáveis linhaPlan e vNome. A variável linhaPlan recebe um número inteiro, esse número representa a linha da planilha que o loop dará inicio a contagem.
Usando o Do until estou dizendo para meu compilador contar até que a ultima linha da minha planilha COLUNA (“A”) seja igual a vazia. Dessa forma eu consigo percorre pela tabela localizando o critério buscado.
<code>Do Until Sheets("TabelaNomes").Cells(linhaPlan, "A") = ""</code>
Depois que definimos em qual coluna o loop deve percorrer, adicionamos algumas condições onde:
Se Verdadeiro Faça – Sim PEDRO estar cadastrado na linha 7
Se Falso Faça – PEDRO não estar cadastrado na linha e linhaPlan
<code>If Sheets("TabelaNomes").Cells(linhaPlan, "A") = vNome Then Debug.Print "-------------------------------------" Debug.Print "Sim " + vNome + " estar cadastrado na linha " & linhaPlan Debug.Print "-------------------------------------" Exit Sub Else Debug.Print vNome + " Não estar cadastrado na linha " & linhaPlan End If</code>
Se nossa condição for verdadeira, o loop é encerrado exibindo o critério na janela. Sendo falso, devemos definir o comando a seguir para o compilador buscar pela próxima linha da planilha veja:
<code>linhaPlan = linhaPlan + 1 Loop</code>
Com essa rotina você pode criar um controle de acesso de forma muito avançada. Onde o compilador através do loop verifica se o usuário existe na base de dados, permitindo trabalhar com múltiplos usuários.
Nada que te impeça de fazer o mesmo com o Do While, isso foi só um pequeno exemplo…
Note também que esse loop é muito parecido com o que criamos no começo do artigo utilizando o Do While. A diferença entre os dois é que, o Do While possui o controle de variável já o Do Until nesse contexto não.
Se observar na rotina de verificação de idades, notará que o Do While só faz 31 loops no máximo. Com isso “seria impossível” verificar uma tabela que tem mais de 31 registros. Pois o loop só percorrera 31x dentro de um determinado intervalo, isso de certa forma limitaria nosso trabalho em algumas atividades.
Mas porque não acontece o mesmo com o Do until?
Muito simples, pois o segredo dessa condição estar na linha de código a seguir:
<code>Do Until Sheets("TabelaNomes").Cells(linhaPlan, "A") = ""</code>
Foi o mesmo que dizer para o compilador: Faça até que minha planilha (“TabelaNomes”) e sua coluna (A) seja igual a vazia. Em outras palavras eu mandei meu loop continuar até encontrar a ultima linha vazia do meu intervalo.
Eu poderia ter feito a mesmo com o Do While, porem quis mostrar as diferenças entre controle de variáveis. É importante ressaltar que isso pode ser um grande problema, se o intervalo estiver vazio antes do fim do loop.
EXEMPLO: se você pretende percorrer por um intervalo que tem 100 registros, e a linha de número 50 for fazia já era. Pois o compilador entenderá que ali é o final do intervalo, então sera preciso melhorar essa rotina.
Estar com dúvidas? Comente o artigo que irei te ajudar! 😀
Estruturas de Repetição VBA – Evento For Each
Por fim, temos a estrutura For Each… Next, que é específica para trabalhar com coleções de objetos e arrays. For Each significa Para Cada, ou seja, executa o processamento para cada objeto que houver em uma coleção ou para cada item em um array.
Nesse exemplo irei usar o For Each para mostrar na janela de verificação, os registros de minha tabela pessoa veja:
<code>Sub ListarPessoas() Dim Intervalo As Range, Celula As Range Dim ContarCabeçalho As Integer Dim Cabeçalho As String ContarCabeçalho = 1 Set Intervalo = Range("A2:C32") For Each Celula In Intervalo Select Case ContarCabeçalho Case Is = 1 Cabeçalho = "NOME:" Case Is = 2 Cabeçalho = "IDADE:" Case Is = 3 Cabeçalho = "SEXO:" End Select Debug.Print Cabeçalho & Celula ContarCabeçalho = ContarCabeçalho + 1 If ContarCabeçalho > 3 Then ContarCabeçalho = 1 Debug.Print "---------------------------" End If Next End Sub</code>

Com o For Each nós podemos realizar centenas de atividades que facilitam muito nosso trabalho. Eu particularmente gosto muito de usar esse evento para limpar as caixas de texto de meu UserForm, segue o código:
<code>Dim vCtl As Control For Each vCtl In UserForm.Controls If TypeName(vCtl) = "TextBox" Or TypeName(vCtl) = "ComboBox" Then vCtl.text = "" End If Next vCtl</code>
Você também pode usar o For Each para listar registros de um intervalo para Listbox. Seguindo o exemplo anterior, criei uma rotina em For Each para preencher o Listbox com os dados da minha tabela pessoa:
<code>Sub PreenherListBox() Dim Intervalo As Range, Celula As Range Dim linha As Integer Dim item As Integer Set Intervalo = Range("a2:c33") item = 0 ListBox1.AddItem For Each Celula In Intervalo If Celula = "" Then ListBox1.RemoveItem ListBox1.ListCount - 1 Exit Sub End If With ListBox1 .List(linha, item) = Celula Select Case item Case Is = 2 .AddItem item = item - 3 linha = linha + 1 End Select End With item = item + 1 Next End Sub</code>

O rotina para preenche o Listbox com o For Next, utilizando o For Each basicamente faz a mesma coisa. Porem com O For Each, eu conseguir adaptar de forma que ele adicione as linhas automaticamente sem necessidade de fazer:
<code>.List(Linha, 0) = "COLUNA 1" .List(Linha, 1) = "COLUNA 2" .List(Linha, 2) = "COLUNA 3" .List(Linha, 3) = "COLUNA 4"</code>
Esse código pode facilitar muito sua vida, caso você tenha mais de 50 colunas a serem adicionadas em seu Listbox. Embora todos saibam que o Listbox só aceita no máximo 10 colunas, na pratica é possível contornar essa limitação! 😉
Estruturas de Repetição VBA – Conclusão Final
As estruturas de repetição quase sempre estarão presentes em nossos programas, por isso é importante domina-las. Isso fara com que você ganhe mais tempo e produtividade na hora de realizar determinadas tarefas.
Esse post abordou de uma forma simples cada evento, e suas fórmulas básicas. As estruturas de repetição do vba são de possibilidades infinitas, só depende de você para implementa-las em seu programa!
Espero que tenham gostado, não se esqueçam de compartilhar o artigo com seus amigos! 😀
Planilhas para a gestão do seu negócio em Excel
Gerar orçamento em Excel e salvar em PDF
Planilha simulador de parcelamento em Excel
Como controlar recebimentos em cartões de crédito
A Importância do Fluxo de Caixa nas Empresas
Sistema Controle de Contas a Pagar e Receber
Planilha agenda de contato corporativo em Excel