Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Lógica Condicional | Fundamentos de VBA
VBA do Excel para Automação Empresarial

Lógica Condicional

Deslize para mostrar o menu

Tudo até agora tratou de armazenar e testar valores. A lógica condicional é onde seu código realmente começa a tomar decisões — executando um bloco de instruções em vez de outro, dependendo do resultado desses testes.

If...Then

A forma mais simples: executa uma ação apenas se uma condição for atendida.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Se a condição do If for Falsa, o VBA simplesmente pula para o que vier após o End If — nada acontece e nenhum erro ocorre.

If...ElseIf...Else

Lida com mais de dois possíveis resultados encadeando condições:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

O VBA verifica essas condições de cima para baixo e para na primeira que for True — ele nunca verifica as demais, mesmo que uma condição posterior também fosse tecnicamente True. Por isso a ordem importa: se currentStock for 0, a primeira condição (= 0) captura e status se torna "Out of Stock" imediatamente. Observe que 0 também é tecnicamente menor que reorderLevel, então se a linha ElseIf currentStock < reorderLevel fosse verificada primeiro, ela reportaria incorretamente "Reorder Now" para um item que está completamente esgotado. Colocar a condição mais específica e urgente primeiro — e só depois recorrer a condições mais amplas — é o que faz uma cadeia como essa funcionar corretamente.

Select Case

Quando você está verificando uma única variável contra vários valores fixos possíveis, Select Case expressa o mesmo que uma longa cadeia de ElseIf, mas de forma mais clara:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

O Select Case também lida com intervalos de números de forma elegante, o que é mais difícil de ler em uma cadeia de comparações ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 corresponde a qualquer valor de 1 até 19 inclusive; Case Is >= 50 usa Is para comparar com a variável testada em vez de um intervalo fixo.

Tarefa

  1. Escreva um Sub com um bloco Select Case (como o exemplo acima) que atribua uma string de status com base em um número de estoque fixo.
  2. Teste três vezes dentro do mesmo Sub alterando o valor do estoque: tente 0, 15 e 134, imprimindo o resultado com Debug.Print a cada vez.
  3. Adicione uma quarta condição para exatamente 20 (o nível de reposição do Keyboard) e confirme qual Case a captura.
Dica
expand arrow

1. Escrevendo o Sub com Select Case

  • Declarar uma variável para armazenar o número do estoque e outra para armazenar o texto resultante (status).
  • Atribuir um valor fixo à variável de estoque primeiro (por exemplo, stockLevel = 0), depois executá-la com Select Case stockLevel — copiar a mesma estrutura de Case do exemplo da seção 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Cada Case deve atribuir um valor de texto diferente à variável status.

2. Testando três valores em um único Sub

  • Não é necessário criar três procedimentos separados — basta alterar o valor da variável, executar o bloco Select Case, imprimir o resultado, depois alterar o valor novamente e executar uma segunda vez, tudo dentro do mesmo Sub, um após o outro.
  • Após cada atribuição, Debug.Print status mostrará o resultado na Janela Imediata sem exibir pop-ups que interrompam os outros dois testes.

3. Adicionando um caso para exatamente 20

  • Volte ao exemplo original da seção 2.4 e observe atentamente onde termina o Case 1 To 19 e começa o Case 20 To 49 — um desses dois já inclui o 20.
  • Como o Select Case para na primeira correspondência, adicionar uma linha separada Case 20 só faz diferença se você colocá-la antes do caso que normalmente a capturaria.
  • Execute com stockLevel = 20 especificamente e verifique qual mensagem é exibida — isso mostra qual Case realmente capturou, sem precisar adicionar nada novo.
Solução
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Lógica Condicional

Tudo até agora tratou de armazenar e testar valores. A lógica condicional é onde seu código realmente começa a tomar decisões — executando um bloco de instruções em vez de outro, dependendo do resultado desses testes.

If...Then

A forma mais simples: executa uma ação apenas se uma condição for atendida.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Se a condição do If for Falsa, o VBA simplesmente pula para o que vier após o End If — nada acontece e nenhum erro ocorre.

If...ElseIf...Else

Lida com mais de dois possíveis resultados encadeando condições:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

O VBA verifica essas condições de cima para baixo e para na primeira que for True — ele nunca verifica as demais, mesmo que uma condição posterior também fosse tecnicamente True. Por isso a ordem importa: se currentStock for 0, a primeira condição (= 0) captura e status se torna "Out of Stock" imediatamente. Observe que 0 também é tecnicamente menor que reorderLevel, então se a linha ElseIf currentStock < reorderLevel fosse verificada primeiro, ela reportaria incorretamente "Reorder Now" para um item que está completamente esgotado. Colocar a condição mais específica e urgente primeiro — e só depois recorrer a condições mais amplas — é o que faz uma cadeia como essa funcionar corretamente.

Select Case

Quando você está verificando uma única variável contra vários valores fixos possíveis, Select Case expressa o mesmo que uma longa cadeia de ElseIf, mas de forma mais clara:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

O Select Case também lida com intervalos de números de forma elegante, o que é mais difícil de ler em uma cadeia de comparações ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 corresponde a qualquer valor de 1 até 19 inclusive; Case Is >= 50 usa Is para comparar com a variável testada em vez de um intervalo fixo.

Tarefa

  1. Escreva um Sub com um bloco Select Case (como o exemplo acima) que atribua uma string de status com base em um número de estoque fixo.
  2. Teste três vezes dentro do mesmo Sub alterando o valor do estoque: tente 0, 15 e 134, imprimindo o resultado com Debug.Print a cada vez.
  3. Adicione uma quarta condição para exatamente 20 (o nível de reposição do Keyboard) e confirme qual Case a captura.
Dica
expand arrow

1. Escrevendo o Sub com Select Case

  • Declarar uma variável para armazenar o número do estoque e outra para armazenar o texto resultante (status).
  • Atribuir um valor fixo à variável de estoque primeiro (por exemplo, stockLevel = 0), depois executá-la com Select Case stockLevel — copiar a mesma estrutura de Case do exemplo da seção 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Cada Case deve atribuir um valor de texto diferente à variável status.

2. Testando três valores em um único Sub

  • Não é necessário criar três procedimentos separados — basta alterar o valor da variável, executar o bloco Select Case, imprimir o resultado, depois alterar o valor novamente e executar uma segunda vez, tudo dentro do mesmo Sub, um após o outro.
  • Após cada atribuição, Debug.Print status mostrará o resultado na Janela Imediata sem exibir pop-ups que interrompam os outros dois testes.

3. Adicionando um caso para exatamente 20

  • Volte ao exemplo original da seção 2.4 e observe atentamente onde termina o Case 1 To 19 e começa o Case 20 To 49 — um desses dois já inclui o 20.
  • Como o Select Case para na primeira correspondência, adicionar uma linha separada Case 20 só faz diferença se você colocá-la antes do caso que normalmente a capturaria.
  • Execute com stockLevel = 20 especificamente e verifique qual mensagem é exibida — isso mostra qual Case realmente capturou, sem precisar adicionar nada novo.
Solução
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 4
some-alt