Tenha em mãos as Melhores Planilhas! Paulo

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

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

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, deixarei esse link para complemento do artigo. Recomendo que você leia e aumente sua base de conhecimento a respeito das estruturas de repetição do vba.

Estruturas de repetição do VBA – O que é, quando e qual deles 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 um 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 do 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:

Sub Contador()

    Dim Contar As Integer
    Contar = 1


    Do While Contar <= 10
        Contar = Contar + 1
    Loop

End Sub

Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif1

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:

Sub Contador()
 Dim Contar As Integer
    Contar = 1


    Do While Contar <= 10
        if Contar <= 10 then 
             ComBobox.AddItem Contar
        end if 
    Loop

End Sub

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.

Veja Que Interessante Esse Exemplo Com o Do While:

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
Estruturas de repetição do VBA - For, Do, While, e for Each qual usar?

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

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 – 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:

Sub Contador()

    Dim Contar As Integer
    For Contar = 1 to  10
    Next Contar

End Sub

Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif3

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:

Sub Contador()

    Dim Contar As Integer
    For Contar = 1 to  10
          ComboBox.AddItem = Contar
    Next Contar

End Sub

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 copilador 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:

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
Estruturas de repetição do VBA - For, Do, While, e for Each qual usar?

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

Estruturas de repetição – 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:

Sub Contador()

    Dim Contar As Integer
    Contar = 1
 
 
    Do Until Contar >= 10
        Contar = Contar + 1
    Loop
 
End Sub

Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif5

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 um 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 a informação para a janela de verificação imediada do VBA.

Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif6

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

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

 

Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif7

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

Estruturas de repetição – Entendendo 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.

Do Until Sheets("TabelaNomes").Cells(linhaPlan, "A") = ""

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

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:

   linhaPlan = linhaPlan + 1
Loop

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:

Do Until Sheets("TabelaNomes").Cells(linhaPlan, "A") = ""

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 – 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:

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
Estruturas de repetição do VBA - For, Do, While, e for Each qual usar? gif8

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

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:

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

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:

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

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

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:

             .List(Linha, 0) = "COLUNA 1"
             .List(Linha, 1) = "COLUNA 2"
             .List(Linha, 2) = "COLUNA 3"
             .List(Linha, 3) = "COLUNA 4"

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! 😉

→Clique nesse link e saiba como adicionar mais de 10 colunas no listbox!

Estruturas de repetição – 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! 😀

Até mais!

 

Leita também sobre:

 

Sobre o autor | Website



Por gentileza, se deseja alterar o arquivo do rodapé,
entre em contato com o suporte.
google.com, pub-3449874674717021, DIRECT, f08c47fec0942fa0