TOP

VBA-Lição 7.1. Condições (Condições)

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.


Se...Então...Senão

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
NOTNOT [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

Caso contrário

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

Select Caso

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