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
- Escreva um
Subcom um blocoSelect Case(como o exemplo acima) que atribua uma string de status com base em um número de estoque fixo. - Teste três vezes dentro do mesmo
Subalterando o valor do estoque: tente 0, 15 e 134, imprimindo o resultado comDebug.Printa cada vez. - Adicione uma quarta condição para exatamente 20 (o nível de reposição do Keyboard) e confirme qual Case a captura.
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 comSelect Case stockLevel— copiar a mesma estrutura deCasedo exemplo da seção 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Cada
Casedeve atribuir um valor de texto diferente à variávelstatus.
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 mesmoSub, um após o outro. - Após cada atribuição,
Debug.Print statusmostrará 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 19e começa oCase 20 To 49— um desses dois já inclui o 20. - Como o
Select Casepara na primeira correspondência, adicionar uma linha separadaCase 20só faz diferença se você colocá-la antes do caso que normalmente a capturaria. - Execute com
stockLevel = 20especificamente e verifique qual mensagem é exibida — isso mostra qualCaserealmente capturou, sem precisar adicionar nada novo.
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
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
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
- Escreva um
Subcom um blocoSelect Case(como o exemplo acima) que atribua uma string de status com base em um número de estoque fixo. - Teste três vezes dentro do mesmo
Subalterando o valor do estoque: tente 0, 15 e 134, imprimindo o resultado comDebug.Printa cada vez. - Adicione uma quarta condição para exatamente 20 (o nível de reposição do Keyboard) e confirme qual Case a captura.
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 comSelect Case stockLevel— copiar a mesma estrutura deCasedo exemplo da seção 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Cada
Casedeve atribuir um valor de texto diferente à variávelstatus.
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 mesmoSub, um após o outro. - Após cada atribuição,
Debug.Print statusmostrará 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 19e começa oCase 20 To 49— um desses dois já inclui o 20. - Como o
Select Casepara na primeira correspondência, adicionar uma linha separadaCase 20só faz diferença se você colocá-la antes do caso que normalmente a capturaria. - Execute com
stockLevel = 20especificamente e verifique qual mensagem é exibida — isso mostra qualCaserealmente capturou, sem precisar adicionar nada novo.
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
Obrigado pelo seu feedback!