Estruturas de repetição VBA – For, Do While, e For Each qual usar?

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 &lt;= 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 &lt;= 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 &lt;= 10
if Contar &lt;= 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 &lt;= 31
Pessoa = Sheets("Pessoas").Cells(linhaPlan, "A")
If Sheets("Pessoas").Cells(linhaPlan, "B") &lt;= Idade Then
Debug.Print Pessoa &amp; Space(3); Sheets("Pessoas").Cells(linhaPlan, "C")
Range("A" &amp; linhaPlan &amp; ":C" &amp; linhaPlan).Select
Selection.Style = "Neutro"
Encontrados = Encontrados + 1
End If
linhaPlan = linhaPlan + 1
Contar = Contar + 1
Loop
Debug.Print "-------------------------------"
Debug.Print "Total de " &amp; Encontrados &amp; " Registros"
Debug.Print "-------------------------------"
End Sub</code>
Processo em Execução

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>
Depuração do código até 10 como definido

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>
Código sendo executado um a um assim como e realizado.

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 " &amp; linhaPlan
Debug.Print "-------------------------------------"
Exit Sub
Else
Debug.Print vNome + " Não estar cadastrado na linha " &amp; 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 " &amp; linhaPlan
     Debug.Print "-------------------------------------"
   Exit Sub
Else
Debug.Print vNome + " Não estar cadastrado na linha " &amp; 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 &amp; 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

Planilha para Controlar de Dízimos e Ofertas em Excel

Planilhas em Excel para Abertura de Empresa