Estruturas de repetição
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
artefinalista, eletrotécnico, programador de CLP (para máquinas
industriais) e analista de sistemas em sistema bancário,
programando em COBOL.
anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É
a favor da disseminação do conhecimento.