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