As estruturas de controle determinam o curso de ações de um algoritmo ou programa.
A lógica do procedimento flui através das instruções da esquerda para a direita e de cima para baixo. As instruções de controle, ou seja, os comandos que controlam a tomada de decisões e as iterações podem alterar a ordem de execução das instruções.
Estruturas de seleção
As instruções condicionais avaliam se uma condição é verdadeira ou falsa, e em seguida especificam uma ou mais instruções a serem executadas, dependendo do resultado dessa avaliação.
Comandos de seleção:
(If ... Then) — testa uma condição única e executa uma instrução ou um bloco de instruções.
Sintaxe:
If condição Then
Instruções
End If
Exemplo:
O procedimento abaixo obtem dois valores numéricos, efetua a soma e apresenta a mensagem "soma maior que dez", caso o resultado da adição seja maior que 10.
Sub Adição()
Dim num1 As Integer, num2 As Integer
Dim soma As Integer
num1= InputBox("Informe o 1o. valor")
num2 = InputBox("Informe o 2o. valor")
soma = num1 + num2
if (soma > 10) then
MsgBox "Soma maior que dez"
end if
End Sub
A instrução If do exemplo acima que contém mais de uma linha de código é conhecida como sintaxe de linha múltipla. O comando de linha única não usa a instrução End If. A instrução If desse exemplo também poderia ter sido codificada assim: If (soma > 10) then MsgBox "Soma maior que dez"
Seleção composta
(If … Then … Else) — testa uma condição única e executa um entre dois blocos de instruções.
Sintaxe:
If condição Then
Instruções
Else
Instruções
End If
Exemplo:
O procedimento a seguir efetua o cálculo da média aritmética das notas de três provas de uma aluno e avalia a situação quanto à aprovação.
Sub mediaProvas()
Dim nt1 As single, nt2 As Single
Dim nt3 As Single, media As Single
nt1 = InputBox("Informe a 1a. nota")
nt2 = InputBox("Informe a 2a. nota")
nt3 = InputBox("Informe a 3a. nota")
media = (nt1 + nt2 + nt3) / 3
if (media >= 6.0) then
MsgBox "Aprovado"
else
MsgBox "Reprovado"
end if
End Sub
Seleção composta encadeada
(If … Then … ElseIf) — testa mais de uma condição e executa um dos vários blocos de instruções.
Sintaxe:
If condição Then
Instruções
ElseIf condição Then
Instruções
. . .
Else
Instruções
End If
Exemplo:
O procedimento abaixo calcula e mostra o valor do bonus com base no cargo e salário do funcionário.
Sub mediaProvas()
Dim cargo As Integer
Dim salario As Currency, bonus As Currency
salario = InputBox("Informe o salario: ")
cargo = InputBox("Informe o cargo: ")
If cargo = 1 Then
bonus = salario * 0.15
ElseIf cargo = 2 Then
bonus = salario * 0.10
ElseIf cargo = 3 Then
bonus = salario * 0.08
Else
bonus = 0
End If
MsgBox "Cargo: " & cargo & " Bonus: " & bonus
End Sub
Nota: se cada instrução ElseIf testar a mesma expressão com valores diferentes é mais prático utilizar a seleção de múltipla escolha como no exemplo da próxima seção.
Seleção de múltipla escolha
(Select Case) — testa uma condição única e executa um dos vários blocos de instruções.
Sintaxe:
Select Case var(1)
Case expr(2): instruções
. . .
Case Else: instruções
End Select
(1)var = variável (2)expr = expressão numérica ou de sequência de caracteres.
Exemplo:
O procedimento abaixo calcula e mostra o valor do bonus com base no cargo e salário do funcionário. (É o mesmo exemplo da seção anterior apenas este apresenta mais opções de cargo e salário.)
Sub bonus()
Dim cargo As Integer
Dim salario As Currency, bonus As Currency
salario = InputBox("Informe o salario: ")
cargo = InputBox("Informe o cargo: ")
Select Case cargo
Case 1: bonus = salario * 0.15
Case 2: bonus = salario * 0.10
Case 3: bonus = salario * 0.08
Case 4, 5: bonus = salario * 0.05
Case 6 To 8: bonus = salario * 0.01
Case Is < 12: bonus = salario * 0.005
Case Else: bonus = 0
End Select
MsgBox ("Cargo: " & cargo & " Bonus: " & bonus)
End Sub
A instrução Case pode avaliar valores separados por vírgula, sequências de valores - de até - e comparar com outros valores como aparece no exemplo a instrução Case Is.
Nota: Para melhor legibilidade, vale a pena usar a estrutura Select Case em lugar da If ... Then ... ElseIf quando a instrução ElseIf avaliar a mesma expressão várias vezes.
Estruturas de repetição
Permitem a execução de um grupo ou bloco de instruções repetidamente. As intruções podem ser repetidas até que uma condição seja falsa ou até que seja verdadeira.
Também há loops que repetem instruções um número específico de vezes ou em cada objeto de uma coleção.
Do...Loop — Faz um loop enquanto ou até que uma condição seja verdadeira (True). For...Next — Utiliza um contador para executar instruções um determinado número de vezes. For Each...Next — Repete um grupo de instruções para cada objeto em uma coleção.
Repetição com teste no início
Do While ... Loop — testa uma condição no início do loop e executa o loop enquanto a condição for verdadeira (True).
Sintaxe:
Do While condição
Instruções
Loop
Exemplo:
O procedimento abaixo multiplica dois valores fornecidos pelo usuário e apresenta o resultado, repetindo esse processamento por tantas vezes quantas o usuário desejar.
Sub multiplica()
Dim produto As Integer, resp As Integer
Dim salario As Currency, bonus As Currency
resp = vbYes
Do while (resp = vbYes)
valor1 = InputBox("1o. número")
valor2 = InputBox("2o. número")
produto = valor1 * valor2
MsgBox "Resultado: " & produto
resp = MsgBox("Deseja continuar?", vbYesNo)
Loop
End Sub
A função MsgBox, codificada em duas linhas neste procedimento, exibe na primeira o produto dos valores informados pelo usuário e na segunda mostra a mensagem "Deseja continuar?" e dois botões "Sim" e "Não". A execução só é encerrada quando o usuário pressionar o botão "Não".
Do Until ... Loop — testa uma condição no início do loop e executa o loop enquanto a condição for falsa (False).
Sintaxe:
Do Until condição
Instruções
Loop
Exemplo:
O procedimento a seguir conta o número de vezes que ele é executado pelo o usuário.
Sub conta()
Dim soma As Integer
resp = vbYes
Do Until resp = vbNo
soma = soma + 1
resp = MsgBox ("Deseja continuar?", vbYesNo)
Loop
MsgBox "Total = " & soma
End Sub
O procedimento apresenta a caixa de mensagem com a informação: Deseja continuar? e dois botões diferenciados pelos textos: "Sim" e "Não". O sistema adiciona uma unidade na variável soma e volta a exibir a caixa de mensagem até que o usuário clique no botão "Não", quando então a função após o comando Loop mostrará o conteúdo da variável soma.
Repetição com teste no final
Do ... Loop While — testa uma condição no final do loop e continua a execução enquanto a condição for verdadeira (True).
Sintaxe:
Do
Instruções
Loop While condição
Exemplo:
O procedimento abaixo converte para o sistema binário um número decimal informado pelo usuário.
Sub converte()
Dim dec As Integer, bin As String
Dim resto As Integer, sResto As String
dec = InputBox("Informe um num.", , 19)
Do
resto = dec Mod 2 ' retorna o resto da divisão
sResto = CStr(resto) ' converte o resto para o tipo string
bin = sResto + bin ' concatena o resto com o conteúdo de bin
dec = dec \ 2 ' retorna o quociente inteiro da divisão
Loop While dec > 0
MsgBox "Valor em binário: " & bin
End Sub
O usuário informa um número decimal na caixa de entrada, caso não queira o valor default 19 sugerido e o sistema o converte para o binário correspondente. A execução do loop tem lugar enquanto a variável dec for maior que zero.
Do ... Loop Until — testa uma condição no final do loop e continua a execução enquanto a condição for falsa (False).
Sintaxe:
Do
Instruções
Loop Until condição
Exemplo:
O procedimento abaixo calcula e mostra o fatorial de um número fornecido pelo usuário.
Sub fatorial()
Dim num As Integer, fat As Integer, i As Integer
num = InputBox("Informe um num.", , 5)
fat = 1: i = 1
Do
fat = fat * i
i = i + 1
Loop Until i > num
MsgBox "Fatorial de " & num & ": " & fat
End Sub
A execução prossegue até que a variável índice i for maior do que a variável num, conteúdo informado na caixa de entrada.
Repetição com variável de controle
For ... Next — executa as instruções do loop enquanto a variável contadora não atingir o valor especificado.
Sintaxe:
For var = inicial To final [Step passo]
Instruções
Next var
Exemplo:
O procedimento abaixo efetua a soma dos números pares até 10.
Sub soma()
Dim total As Integer, j As Integer
For j = 2 To 10 Step 2
total = total + j
Next j
MsgBox "O total é " & total
End Sub
A variável j recebe o valor inicial 2 e a cada loop é incrementada de 2 unidades até atingir o valor final 10. O comando Step é opcional e se ele não for especificado é assumido o valor padrão 1.
Repetição com objetos de coleção
For Each... Next — executa as instruções do loop para cada objeto de uma coleção.
Sintaxe:
For Each var in grupo
Instruções
Next var
Exemplo:
O procedimento abaixo preenche com o valor 100 as células A1:D10 de Plan1 que apresentarem valor menor do que 1.
Sub preenche()
Dim intervalo As Range, c As Range
Set intervalo = Worksheets(1).Range("A1:D10")
For Each c In intervalo
If c.Value < 1 Then
c.Value = 100
End If
Next c
End Sub
As variáveis intervalo e c são declaradas como objeto Range. A instrução Set atribui à variável intervalo referências do objeto Range da primeira planilha. O loop da instrução For Each escreve em cada elemento da coleção c que se refere ao intervalo de células A1:D10 o valor 100 se o conteúdo do elemento da coleção for menor que 1.
Saindo de loops e preocedimentos
As intrução Exit permite abandonar uma estrutura de controle. Apesar dessa instrução ser conveniente, deve-se restringir seu uso uma vez que o excesso de sua utilização pode dificultar a leitura e a depuração do código.
Para sair diretamente de uma estrutura de repetição For, utiliza-se a instrução Exit For e para sair diretamente de um repetição Do usa-se a instrução Exit Do.
As instruções Exit Sub e Exit Function podem ser usadas para abandonar procedimento e função.
Exercícios
Elaborar um procedimento para calcular e escrever a média ponderada de três notas de um aluno e a mensagem de aprovado para média maior ou igual a 6,0 ou, caso contrário, a mensagem de reprovado.
Dados os valores dos lados de um triângulo, verificar se os lados realmente formam um triângulo (o valor de cada lado deve ser menor que a soma dos outros dois lados). Se esta condição for verdadeira, indicar que tipo de triângulo: isósceles, escaleno ou eqüilátero. Emitir uma mensagem, caso os valores dos lados fornecidos não formarem um triângulo.
Escrever um procedimento para calcular a soma dos N primeiros números naturais. (Soma = 0 + 1 + 2 + 3 + ... + N). O programa deve ler o valor de N, que equivale ao último número da série, através da função InputBox e apresentar o resultado em uma caixa de mensagem utilizando a função MsgBox.
Dado um conjunto de valores inteiros e positivos, como descritos na planilha abaixo, determinar qual o maior e menor valor do conjunto. Encerrar a leitura ao encontrar o valor 0. O maior e menor valor do conjunto deve ser exibido em uma caixa de mensagem por meio da função MsgBox.
Em uma pesquisa realizada junto aos habitantes de uma região foram coletados os seguintes dados: idade, sexo (M/F) e salário. Fazer um procedimento para calcular e informar:
maior e menor idade do grupo;
média salarial do grupo;
percentual de homens.
Encerrar a leitura de dados da planilha ao detectar zero na idade.
Fazer um programa para escrever a tabuada de 1 a 10 do número fornecido pelo usuário, utilizando as estruturas de repetição For...Next e Do while...Loop. Utilize o método InputBox para retornar um número que será informado pelo usuário. Mostrar o resultado de acordo com o exemplo contido na ilustração, utilizando a propriedade Cells do objeto Worksheets
Os exemplos dos exercícios acima foram desenvolvidos numa mesma planilha conforme ilustração abaixo. As informações na cor vermelha referem-se aos cabeçalhos e as informações em azul referem-se aos exemplos de dados para os procedimentos. Elas foram digitadas na planilha e, portanto, não são resultados dos procedimentos.