As condições são muito úteis na programação porque nos permitem realizar ações dependendo dos critérios definidos (o mesmo princípio é usado na função IF Excel).
A instrução VBA If...Then...Else executa um conjunto de instruções dependendo se a condição especificada é verdadeira ou não. Se a condição (teste lógico) for atendida, um conjunto de ações será executado. Entretanto, se a condição for falsa, um conjunto alternativo de ações será executado.
No entanto, para facilitar a leitura, você pode usar a instrução Select Case em vez de vários níveis de instruções If...Then...Else aninhadas.
Então, a função mais importante que define a condição é IF e agora veremos como funciona:
If [TERMO AQUI] Then '=> SE a condição for verdadeira ENTÃO 'Instruções se for "verdadeiro" Else '=> CASO CONTRÁRIO 'Instruções se "mentir" End If
Vamos ser práticos e voltar ao exemplo que usamos na lição sobre variáveis. O objetivo deste procedimento era exibir uma caixa de diálogo que exibisse o valor da string especificada na célula F5:
Se você digitar uma letra na célula F5, ocorrerá um erro. Queremos evitar isso.
Sub variables() 'Declaração de variáveis Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuindo valores a variáveis row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Caixa de diálogo MsgBox last_name & " " & first_name & ", " & age & "anos" End Sub
Vamos adicionar uma condição que irá verificar se o valor inserido na célula F5 é um número antes de o código ser executado.
Usaremos a função IsNumeric para testar a condição:
Sub variables() 'Se o valor entre parênteses (célula F5) for numérico (portanto, a CONDIÇÃO IF É VERDADEIRA), então 'execute as instruções a seguir ENTÃO If IsNumeric(Range("F5")) Then 'Declaração de variáveis Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuindo valores a variáveis row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Caixa de diálogo MsgBox last_name & " " & first_name & ", " & age & "anos" End If End Sub
Também precisamos escrever instruções se a condição que definimos não for atendida:
Sub variables() If IsNumeric(Range("F5")) Then 'Se a condição for atendida 'Declaração de variáveis Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuindo valores a variáveis row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Caixa de diálogo MsgBox last_name & " " & first_name & ", " & age & "anos" Else 'Se a condição não for atendida 'Caixa de diálogo: aviso MsgBox "Valor inserido" & Range("F5") & "não é verdade!" 'Exclua o conteúdo da célula F5 Range("F5").ClearContents End If End Sub
Agora, um valor não numérico não causará problemas.
Trabalhando com nosso array que contém 16 linhas de dados, nosso próximo passo será verificar se a variável row_number é: “maior ou igual a 2” e “menor ou igual a 17”.
Mas primeiro, vejamos os operadores de comparação:
= | exatamente |
<> | não exatamente |
< | menor que |
<= | menos que ou igual a |
> | mais do que |
>= | Melhor que ou igual a |
e estes operadores úteis:
AND | [condição1] AND [condição2] Duas condições devem ser atendidas |
OR | [condição1] OR [condição2] Que pelo menos 1 das 2 condições deve ser cumprida |
NOT | NOT [condição1] A condição não deve ser cumprida |
Agora vamos adicionar uma das condições AND acima entre os operadores de comparação:
Sub variables() If IsNumeric(Range("F5")) Then 'Se um valor numérico Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Se o número correto last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "anos" Else 'Se o número não estiver correto MsgBox "Número inserido" & Range("F5") & "não está correto!" Range("F5").ClearContents End If Else 'Se não for um valor numérico MsgBox "Valor inserido" & Range("F5") & "não é verdade!" Range("F5").ClearContents End If End Sub
Se quisermos tornar nossa macro mais prática, podemos substituir 17 por uma variável que conteria o número de linhas. Isso nos permitiria adicionar e remover linhas do array sem ter que alterar esse limite todas as vezes.
Para fazer isso, precisamos criar uma variável nb_rows e adicionar esta função.
Neste caso, usaremos a função WorksheetFunction.CountA, que é análoga à função COUNTA no próprio Excel.
Queremos que esta função conte o número de células não vazias na primeira coluna e escreva o valor resultante na variável nb_rows:
Sub variables() If IsNumeric(Range("F5")) Then 'SE NÚMERO Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'A função de contar o número de linhas If row_number >= 2 And row_number <= nb_rows Then 'SE NÚMERO VÁLIDO last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "anos" Else 'SE O NÚMERO ESTIVER ERRADO MsgBox "Número inserido" & Range("F5") & "não está correto!" Range("F5").ClearContents End If Else 'SE NÃO NÚMERO MsgBox "Valor inserido" & Range("F5") & "não é verdade!" Range("F5").ClearContents End If End Sub
ElseIf torna possível adicionar condições adicionais após o comando IF:
If [CONDIÇÃO 1] Then '=> SE a condição 1 for verdadeira ENTÃO 'Instruções 1 ElseIf [CONDIÇÃO 2] Then '=> SE a condição 1 for falsa, mas a condição 2 for verdadeira ENTÃO 'Instruções 2 Else '=> CASO CONTRÁRIO 'Instruções 3 End If
Se a CONDIÇÃO 1 for verdadeira, a Instrução 1 executará e sairá da instrução IF (que começa com IF e termina com End If). Se a CONDIÇÃO 2 retornar falso, a Instrução 2 será executada e, se retornar falso, a Instrução 3 (em Else) será executada.
Aqui está um exemplo com notas de 1 a 6 na célula A1 e um comentário sobre essas notas na célula B1:
Sub scores_comment() 'Variáveis Dim note As Integer, score_comment As String note = Range("A1") 'Comentários com base na pontuação recebida If note = 6 Then score_comment = "Ótima pontuação!" ElseIf note = 5 Then score_comment = "Bom ponto" ElseIf note = 4 Then score_comment = "Pontuação satisfatória" ElseIf note = 3 Then score_comment = "Pontuação insatisfatória" ElseIf note = 2 Then score_comment = "Pontuação ruim" ElseIf note = 1 Then score_comment = "Pontuação terrível" Else score_comment = "Pontuação zero" End If 'Comente na célula B1 Range("B1") = score_comment End Sub
Existe uma alternativa ao uso de If com muitas instruções ElseIf, nomeadamente o comando Select Case, que é mais adequado para este tipo de situação.
Considere um exemplo de macro com o operador Select Case:
Sub scores_comment() 'Variáveis Dim note As Integer, score_comment As String note = Range("A1") 'Comentários com base na pontuação recebida Select Case note '=> pontuação do teste (pontos) Case Is = 6 '=> se valor = 6 score_comment = "Ótima pontuação!" Case Is = 5 '=> se valor = 5 score_comment = "Bom ponto" Case Is = 4 '=> se valor = 4 score_comment = "Pontuação satisfatória" Case Is = 3 '=> se valor = 3 score_comment = "Pontuação insatisfatória" Case Is = 2 '=> se valor = 2 score_comment = "Pontuação ruim" Case Is = 1 '=> se valor = 1 score_comment = "Pontuação terrível" Case Else '=> se o valor não for igual a nenhum dos acima score_comment = "Pontuação zero" End Select 'Comente na célula B1 Range("B1") = score_comment End Sub
Vale ressaltar que também poderíamos utilizar outros operadores de comparação:
Case Is >= 6 'se valor >= 6
Exemplos com significados diferentes:
Case Is = 6, 7 'se valor = 6 ou 7 Case Is <> 6, 7 'se o valor não for igual a 6 ou 7
Case 6 To 10 'if valor = qualquer número de 6 a 10