Você está na página 1de 23

Lgica de Programao - VBA

Estruturas de Controle

Estruturas de Controle
As estruturas de controle determinam o curso de aes de um algoritmo ou programa. A lgica do procedimento flui atravs das instrues da esquerda para a direita e de cima para baixo. As instrues de controle, ou seja, os comandos que controlam a tomada de decises e as iteraes podem alterar a ordem de execuo das instrues.

Estruturas de seleo
As instrues condicionais avaliam se uma condio verdadeira ou falsa, e em seguida especificam uma ou mais instrues a serem executadas, dependendo do resultado dessa avaliao. Comandos de seleo:
if...then / if...then...else/elseif / select...case...else

Seleo Simples
(If ... Then) testa uma condio nica e executa uma instruo ou um bloco de instrues. Sintaxe:
If condio Then Instrues End If

Exemplo
O procedimento abaixo obtm dois valores numricos, efetua a soma e apresenta a mensagem "soma maior que dez", caso o resultado da adio seja maior que 10. Sub Adio() 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

Seleo Composta
(If Then Else) testa uma condio nica e executa um entre dois blocos de instrues. Sintaxe:
If condio Then Instrues Else Instrues End If

Exemplo
O procedimento a seguir efetua o clculo da mdia aritmtica das notas de trs provas de uma aluno e avalia a situao quanto aprovao.
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

Seleo composta encadeada


(If Then ElseIf) testa mais de uma condio e executa um dos vrios blocos de instrues. Sintaxe: If condio Then Instrues ElseIf condio Then Instrues
...

Else Instrues End If

Exemplo
O procedimento abaixo calcula e mostra o valor do bonus com base no cargo e salrio do funcionrio. 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 instruo ElseIf testar a mesma expresso com valores diferentes mais prtico utilizar a seleo de mltipla escolha como no exemplo da prxima seo.

Seleo de mltipla escolha


(Select Case) testa uma condio nica e executa um dos vrios blocos de instrues. Sintaxe: Select Case var(1) Case expr(2): instrues ... Case Else: instrues End Select
(1)var

= varivel (2)expr = expresso numrica ou de sequncia de caracteres.

Exemplo
O procedimento abaixo calcula e mostra o valor do bonus com base no cargo e salrio do funcionrio. ( o mesmo exemplo da seo anterior apenas este apresenta mais opes de cargo e salrio.) 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 instruo Case pode avaliar valores separados por vrgula, sequncias de valores - de at - e comparar com outros valores como aparece no exemplo a instruo Case Is. Nota: Para melhor legibilidade, vale a pena usar a estrutura Select Case em lugar da If ... Then ... ElseIf quando a instruo ElseIf avaliar a mesma expresso vrias vezes.

Estruturas de repetio
Permitem a execuo de um grupo ou bloco de instrues repetidamente. As instrues podem ser repetidas at que uma condio seja falsa ou at que seja verdadeira. Tambm h loops que repetem instrues um nmero especfico de vezes ou em cada objeto de uma coleo.
Do...Loop Faz um loop enquanto ou at que uma condio seja verdadeira (True). For...Next Utiliza um contador para executar instrues um determinado nmero de vezes. For Each...Next Repete um grupo de instrues para cada objeto em uma coleo.

Repetio com teste no incio


Do While ... Loop testa uma condio no incio do loop e executa o loop enquanto a condio for verdadeira (True).
Sintaxe: Do While condio Instrues Loop

Exemplo
O procedimento abaixo multiplica dois valores fornecidos pelo usurio e apresenta o resultado, repetindo esse processamento por tantas vezes quantas o usurio 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. nmero") valor2 = InputBox("2o. nmero") produto = valor1 * valor2 MsgBox "Resultado: " & produto resp = MsgBox("Deseja continuar?", vbYesNo) Loop End Sub

A funo MsgBox, codificada em duas linhas neste procedimento, exibe na primeira o produto dos valores informados pelo usurio e na segunda mostra a mensagem "Deseja continuar?" e dois botes "Sim" e "No". A execuo s encerrada quando o usurio pressionar o boto "No".

Repetio com teste no incio


Do Until ... Loop testa uma condio no incio do loop e executa o loop enquanto a condio for falsa (False). Sintaxe:
Do Until condio Instrues Loop

Exemplo
O procedimento a seguir conta o nmero de vezes que ele executado pelo o usurio.
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 informao: Deseja continuar? e dois botes diferenciados pelos textos: "Sim" e "No". O sistema adiciona uma unidade na varivel soma e volta a exibir a caixa de mensagem at que o usurio clique no boto "No", quando ento a funo aps o comando Loop mostrar o contedo da varivel soma.

Repetio com teste no final


Do ... Loop While testa uma condio no final do loop e continua a execuo enquanto a condio for verdadeira (True). Sintaxe:
Do Instrues Loop While condio

Exemplo
O procedimento abaixo converte para o sistema binrio um nmero decimal informado pelo usurio.

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 diviso sResto = CStr(resto) ' converte o resto para o tipo string bin = sResto + bin ' concatena o resto com o contedo de bin dec = dec \ 2 ' retorna o quociente inteiro da diviso Loop While dec > 0 MsgBox "Valor em binrio: " & bin End Sub
O usurio informa um nmero decimal na caixa de entrada, caso no queira o valor default 19 sugerido e o sistema o converte para o binrio correspondente. A execuo do loop tem lugar enquanto a varivel dec for maior que zero.

Repetio com teste no final


Do ... Loop Until testa uma condio no final do loop e continua a execuo enquanto a condio for falsa (False). Sintaxe:
Do Instrues Loop Until condio

Exemplo
O procedimento abaixo calcula e mostra o fatorial de um nmero fornecido pelo usurio. 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 execuo prossegue at que a varivel ndice i for maior do que a varivel num, contedo informado na caixa de entrada.

Repetio com varivel de controle


For ... Next executa as instrues do loop enquanto a varivel contadora no atingir o valor especificado. Sintaxe:
For var = inicial To final [Step passo] Instrues Next var

Exemplo
O procedimento abaixo efetua a soma dos nmeros 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 varivel 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 no for especificado assumido o valor padro 1.

Saindo de loops e procedimentos


As instruo Exit permite abandonar uma estrutura de controle. Apesar dessa instruo ser conveniente, deve-se restringir seu uso uma vez que o excesso de sua utilizao pode dificultar a leitura e a depurao do cdigo. Para sair diretamente de uma estrutura de repetio For, utiliza-se a instruo Exit For e para sair diretamente de um repetio Do usa-se a instruo Exit Do. As instrues Exit Sub e Exit Function podem ser usadas para abandonar procedimento e funo.