VBA - Artigo 010 - Estruturas de repetição


Estruturas de repetição

O VBA fornece seis formas de estrutura de repetição. Quatro delas são variantes das duas básicas (Do... Loop e For... Next), mas ainda assim são formas distintas de estrutura de repetição.

A primeira estrutura que costuma-se ensinar é o Do While... Loop, 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 de código:

Sub NumeroLinha()

    Dim Linha As Integer
    Linha = 1

    Do While Linha <= 10
        Cells(Linha, 1).Value = Linha
        Linha = Linha + 1
    Loop

End Sub

O código acima colocará o número da linha na primeira coluna da linha 1 até a 10. Na estrutura de repetição temos uma condição que define até quando a estrutura será executada (Linha <= 10). O laço será executado enquanto "Linha for menor ou igual a 10". Assim que a variável Linha assumir um valor superior, o laço deixará de ser executado.

Perceba que a variável foi inicializada com o valor 1 antes da estrutura de repetição. Se ela fosse inicializada com um valor superior a 10 a execução sequer entraria no laço Do While... Loop. Faça uma alteração no código, inicialize com 11 e teste, utilizando a depuração (tecla F8).

Há casos em que precisamos executar o laço pelo menos uma vez antes verificar a condição. Neste caso podemos usar a variante Do... Loop While. A diferença no código é a posição do While e a condição. Alterando o código anterior teremos:

Sub NumeroLinha()

    Dim Linha As Integer
    Linha = 1

    Do
        Cells(Linha, 1).Value = Linha
        Linha = Linha + 1
    Loop While Linha <= 10

End Sub

Executando o código veremos que o resultado é exatamente o mesmo da primeira versão do código. Qual a diferença então? A diferença é que a condição está sendo testada no final do laço, não no começo. Para entendermos melhor o que isso significa, vamos inicializar a variável Linha com o valor 11 e testar o código. Desta vez o laço foi executado uma vez e o valor 11 apareceu na décima primeira linha.

Como pode-se perceber, há diferença entre testar a condição no começo ou no final do laço. Testando ao final do laço garante pelo menos uma execução do processo. Há casos em que isso é necessário, assim como há casos em que só deve executar quando a condição for verdadeira. Cabe ao desenvolvedor perceber qual é a necessidade e codificar de acordo. Na maioria dos casos a condição é testada antes, o teste ao final costuma ser em casos bem específicos.

Temos também a estrutura Do Until... Loop, cuja tradução é Faça Até. Enquanto o Do While executa enquanto a condição seja verdadeira, o Do Until executa até que a condição seja verdadeira. Compreendeu a diferença? Veja o mesmo código anterior adaptado e perceba a diferença na forma de escrever a condição:

Sub NumeroLinha()

    Dim Linha As Integer
    Linha = 1
    
    Do Until Linha > 10
        Cells(Linha, 1).Value = Linha
        Linha = Linha + 1
    Loop

End Sub

A condição passou a ser Linha > 10. Traduzindo o código teremos a frase: "faça até que Linha tenha um valor maior que 10". Em termos lógicos, é exatamente o oposto da condição Linha <=10. Da mesma forma que temos o Do... Loop While, também temos o Do... Until Loop:

Sub NumeroLinha()

    Dim Linha As Integer
    Linha = 1
    
    Do
        Cells(Linha, 1).Value = Linha
        Linha = Linha + 1
    Loop Until Linha > 10

End Sub

Faça o mesmo teste de inicializar Linha com 11 e veja que o resultado é o mesmo obtido com Do... Loop While.

Quando usar Do While ou Do Until? Isso vai depender da necessidade do momento e da forma que você compreender melhor o código. Você pode optar por usar somente um deles, mas é importante conhecer os dois para o caso de precisar dar manutenção em código de outras pessoas. Se você utiliza outras linguagens de programação deve saber que algumas têm somente While ou Until.

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 NumeroLinha()

    Dim Linha As Integer

    For Linha = 1 To 10
        Cells(Linha, 1).Value = Linha
    Next Linha

End Sub

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 Linha porque o laço já faz isso automaticamente. Linha receberá valores de 1 a 10 e a estrutura será encerrada ao final da décima execução.

Nas estruturas Do... Loop podemos alterar o incremento alterando o valor para 2, por exemplo. A linha do incremento ficaria assim:

        Linha = Linha + 2

Na estrutura For... Next, adicionamos um parâmetro chamado Step (passo em inglês):

    For Linha = 1 To 10 Step 2

Podemos editar o loop de incremento para decremento. Na estrutura For... Next isso é feito em apenas uma linha:

    For Linha = 10 To 1 Step -1

Desta maneira a execução irá de 10 para 1, decrementando 1 a cada execução. Nas estruturas Do... Loop precisamos alterar a linha com a inicialização da variável, bem como a do incremento, passando para decremento. Por fim, precisamos mexer na condição também, para que reflita a alteração para decremento.

As estruturas Do... Loop demandam mais atenção, pois caso o código dentro da estrutura não permitir a saída do laço, o código será executado indefinidamente até que o Excel trave e interrompa a execução. Por essa razão é melhor que quem esteja iniciando na programação use a estrutura For... Next, que é menos propensa a erros.

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. O código abaixo gera o mesmo resultado dos anteriores:

Sub NumeroLinha()

    Dim Celula As Range
    Dim Intervalo As Range
    Set Intervalo = Range("A1:A10")
    
    For Each Celula In Intervalo
        Celula.Value = Celula.Row
    Next

End Sub

A variável Intervalo foi inicializada para conter as células entre A1 e A10. Por ser um objeto (do tipo Range), essa variável deve ser inicializada usando o comando Set. A estrutura For Each... Next percorre cada célula individual da coleção (um intervalo é uma coleção de células) e preenche o conteúdo da célula com o número da linha.


Vimos as seis estruturas de repetição disponíveis no VBA. Tirando o For Each... Next que é específico para coleções de objetos e arrays, as outras podem ser escolhidas de acordo com a necessidade ou mesmo pela sua compreensão do funcionamento. Eu recomendo que faça testes e exercícios com cada uma delas para praticar e conhecer melhor cada uma. Use a depuração (tecla F8) para executar passo a passo que ajuda a entender o funcionamento.

Pedro Martins


Formado em Tecnologia em Eletrônica Digital, já trabalhou como artefinalista, eletrotécnico, programador de CLP (para máquinas industriais) e analista de sistemas em sistema bancário, programando em COBOL.
Mexe com computadores e programação desde a segunda metade dos anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da disseminação do conhecimento.





Catálogo de aulas (NOVIDADE)

Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.


Postagem Anterior Próxima Postagem