Estrutura de Repetição
O VBA disponibiliza algumas estruturas que pode utilizar para controlar o fluxo da execução da rotina. Estas estruturas dão ao programador um poder enorme para construir rotinas bastante complexas e flexíveis.
Estruturas
VBA Control
|
|
If -Then - Else |
Testa uma condição e executa um determinado conjunto de instruções consoante o resultado dessa avaliação
|
For – Next |
Executa uma determinada tarefa um determinado número de vezes.
|
While-Wend |
Executa uma determinada tarefa enquanto que uma determinada condição permaneça verdadeira, com o valor True.
|
Do – Loop |
Executa uma determinada tarefa enquanto que a avaliação de uma condição permaneça True ou então até que seja True.
|
Select - Case |
Seleciona um dos segmentos de código a processar mediante a avaliação consecutiva de condições.
|
For – Each – Next |
Realiza uma determinada tarefa repetitiva em cada objeto de uma coleção ou em cada item de um array.
|
IF-THEN-ELSE
Função IF do Excel
Recorrendo à função IF do Excel, recorde:
=IF( <condição>, <se condição verdadeira>, <se condição falsa> )
A função IF tinha o seguinte comportamento:
1. Avalia a condição, que deverá ser uma expressão booleana colocada como primeiro parâmetro;
2. Se a condição for verdadeira, então (then) realiza as operações colocadas no segundo parâmetro;
3. Caso contrário (else), realiza as operações que formam o terceiro parâmetro
A estrutura IF do VBA tem o mesmo tipo de funcionamento, o que difere é a sintaxe.
Sintaxe da Estrutura If-Then-Else
If <Condição> Then
<se condição verdadeira>
[ Else
<se condição falsa> ]
End If
A palavra Else é opcional num If-Then-Else Statement, sendo que no caso de ser omitida, a avaliação negativa da condição implica uma saída automática da Instrução If.
Aplicação Prática
Sub Maior2Numeros()
Dim Numero1 As Integer, Numero2 As Integer
Numero1 = Application.InputBox("Digite o número 1:", , , , , , , 1)
Numero2 = Application.InputBox("Digite o número 2:", , , , , , , 1)
If Numero1 > Numero2 Then
MsgBox "O número1 é maior que o 2", vbInformation, "Aviso"
Else
MsgBox "O número2 é maior que o 1", vbInformation, "Aviso"
End If
End Sub
A rotina Maior2Numeros recebe 2 valores do operador e mediante a digitação realiza sua respectiva função.
Para uma maior clarificação do funcionamento do IF, verifique a explicação:
If indica o início da estrutura If-Then-Else
Numero1 > Numero2 --> É a condição que está sendo testada. Neste caso será avaliada se verdadeira ou falsa. No primeiro caso If Numero1 > Numero2 Then é o teste da condição verdadeira. Else (Caso contrário), isto é: senão será falsa, ou seja: o Numero1 < Numero2 e por fim é finalizado a estrutura com End If.
Instrução ElseIf
Esta instrução propõe uma condição alternativa se o teste da condição anterior tiver tido um resultado negativo. Veja exemplo abaixo:
Sub Prazo()
Dim Parcela As Integer, Periodo As Integer
Parcela = Application.InputBox("Prazo para pagamento:", , 0, , , , , 1)
If Parcela = 0 Then Exit Sub 'Senão informar nenhuma parcela a rotina é finalizada
If Parcela = 1 Then
Periodo = 30
ElseIf Parcela = 2 Then Periodo = 60
ElseIf Parcela = 3 Then Periodo = 90
ElseIf Parcela = 4 Then Periodo = 120
End If
MsgBox "O prazo para pagamento é de:" & Periodo & " dias"
End Sub
Explicando: Se pressionar Enter (If Parcela = 0 Then Exit Sub) não é executada as linhas abaixo.
Se informar que é uma parcela If Parcela = 1 Then então é processada a linha abaixo (Periodo = 30).
Senão será avaliada as linhas do ElseIf. Poderia-mos colocar após o último ElseIf uma instrução Else caso não seja informado entre 1 e 4, ou seja: Else Parcela=1.
For-Next
Executa um processo uma determinada quantidade de vezes.
Sintaxe
For <Inicialização do Contador> To <Valor > [ Step <Valor a Incrementar>]
<Instruções a realizar em cada iteração>
Next
Exemplo:
Sub NumerosAleatorios()
Dim Numero As Integer 'Declara a variável como inteiro
For A = 1 To 5 'Inicia em 1 indo até 5
Numero = Int(Rnd * 100) 'A função Rnd sorteia números aleatórios (randômicos)
Range("A" & A).Select 'Seleciona a célula A e na linha dependendo do valor de A
ActiveCell.FormulaR1C1 = Numero 'Mostra na célula atual o número sorteado
Next 'Vai até a linha do For, incrementando (somando) de um em um
End Sub
While-End
A estrutura While-Wend tem um funcionamento similar ao For-Next. Realiza um looping um determinado número de vezes, até que uma determinada condição seja verdadeira.
SintaxeWhile <Condição>
<Instruções a realizar>
Wend
Exemplo:
Dim Aposta As Integer
Aposta = Application.InputBox("Informe o Número:",,,,,,,1)
While Numero<> Aposta
Numero = Int ( 9 * Rnd() + 1 )
Num_Lanc = Num_Lanc +1
Beep
Wend
Do - Loop
Esta estrutura é parecida à estrutura While-Wend.
Do Loop permite ainda especificar se o loop se vai realizar enquanto (while) uma expressão for verdadeira ou até que (until) a condição seja verdadeira (facilidade conseguida através do operador Not)
Sintaxe:
Do [{While | Until} <condição>]
<Instruções a realizar>
Loop
Exemplos:
Sub NumerosAleatorios()
Dim A As Integer, Numero As Integer 'Declara as variaveis como inteiro
A = 1 'É atribuído 1 para a variável
Do While A < 6 'Faça enquanto A for menor do que 6
Numero = Int(Rnd * 100) 'A função Rnd sorteia números aleatórios (randômicos)
Range("A" & A).Select 'Seleciona a célula A e na linha dependendo do valor de A
ActiveCell.FormulaR1C1 = Numero 'Mostra na célula atual o número sorteado
A = A + 1 'Soma mais 1 em A e guarda nele mesmo
Loop 'Vai até a linha do Do While
End Sub
Select Case
É parecida com a instrução IF, porém em muitos casos fica mais simples e o código mais enxuto com o uso do Select Case.
Sintaxe
Select Case <Expressão a ser avaliada>
[Case <Valor da Expressão> [Instruções a realizar]]
... [Case Else [Instruções a realizar na situação residual]]
End Select
Exemplo:
Sub Programas()
Dim Programa As String, Resposta As String
Programa = Application.InputBox("Informe o Programa:", , , , , , , 2)
Select Case Programa
Case "Word"
Resposta = "Processador de Textos"
Case "Excel"
Resposta = "Planilha Eletrônica"
Case "Access"
Resposta = "Gerenciador de Banco de Dados"
Case "PowerPoint"
Resposta = "Apresentação"
Case Else
Resposta = "Não encontrado"
End Select
Range("A1").Select
ActiveCell.FormulaR1C1 = Resposta
End Sub
FOR – EACH – NEXT
A estrutura For-each-next é de longe a mais potente do VBA. De fato permite executar uma determinada instrução em todos os elementos de uma colecção de objetos, ou em todos os elementos de um array.
Esta estrutura quando aplicada em arrays não funciona para a atualização dos valores do array, mas somente para a extração do seu conteúdo. Contudo quando aplicada a coleções de objetos pode sê-lo para alteração das suas propriedades ou extração de valores.
Sintaxe
For Each <Variável do tipo dos elementos do grupo> In <Grupo>
<Instruções a realizar para cada elemento do grupo>
Next
Exemplo:
Sub Planilhas()
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
sheet.Select
sheet.Name = Application.InputBox("Nome da Planilha", , , , , , , 2)
Next
For Each sheet In ActiveWorkbook.Worksheets
sheet.Select
MsgBox sheet
Next
End Sub
Explicando:Ao ser executado, este procedimento solicitará o nome da primeira planilha. Como normalmente existem três dentro de uma pasta, ficará então o looping solicitando o nome da segunda e da terceira.