Capítulo 05: Estruturas Condicionais Complexas (If...Then...Else e Select Case)

🎯 Objetivo da Aula

Nesta aula, você aprenderá a implementar tomadas de decisão algorítmicas no VBA. Você dominará as estruturas condicionais simples, compostas e aninhadas com If...Then...ElseIf...Else, os operadores lógicos booleanos And, Or e Not, e a poderosa estrutura de chaveamento múltiplo Select Case, ideal para classificação de categorias e mitigação de código espaguete.

Ao final desta aula, você terá desenvolvido o motor de validação de risco aduaneiro e requisitos de transporte da FastLog S.A.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: O setor de gerenciamento de frotas e compliance precisa avaliar as viagens rodoviárias antes da emissão do Manifesto de Carga (MDF-e). Cada categoria de carga possui exigências legais e seguros específicos:

  • Perigosa / Química: Exige licença ambiental IBAMA e condutor com curso MOPP ativo.
  • Refrigerada / Farmacêutica: Exige monitoramento contínuo de termômetro e vistoria ANVISA.
  • Carga Valiosa (eletrônicos > R$ 300.000): Exige escolta armada e rastreador satelital redundante.
  • Geral / Seca: Procedimento padrão de vistoria básica.
    O despachante anterior tentava usar 8 fórmulas SE aninhadas na planilha, gerando erros constantes e multas rodoviárias por falta de escolta obrigatória.
    Sua Missão: Construir a rotina em VBA ClassificarRiscoOperacional, utilizando Select Case para classificar o tipo de transporte e If...And...Or para autorizar ou bloquear a emissão da viagem na planilha.

🧠 Fundamentos: A Teoria Traduzida

1. If...Then...ElseIf vs. Select Case

Quando temos múltiplas opções mutuamente exclusivas baseadas no valor de uma única variável, o encadeamento de múltiplos ElseIf torna o código ilegível. O Select Case oferece uma arquitetura limpa, modular e de altíssimo desempenho:

flowchart TD
    VAR["Tipo de Carga"] --> SC{"Select Case UCase(TipoCarga)"}
    SC -- "PERIGOSA" --> C1["Exige MOPP + Licença IBAMA"]
    SC -- "REFRIGERADA" --> C2["Exige ANVISA + Termômetro"]
    SC -- "VALIOSA" --> C3["Exige Escolta Armada"]
    SC -- Else --> C4["Liberação Padrão de Carga Seca"]

    style VAR fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style SC fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style C1 fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff
    style C2 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style C3 fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style C4 fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff

2. Sintaxe Comparativa

  • Estrutura com Select Case:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    Select Case UCase(strCategoria)
        Case "QUIMICA", "INFLAMAVEL"
            curTaxaRisco = 1500
            strRequisito = "Certificação MOPP"
        Case "PERECIVEL"
            curTaxaRisco = 600
            strRequisito = "Termógrafo Ativo"
        Case "ELETRONICOS"
            curTaxaRisco = 2200
            strRequisito = "Escolta Armada"
        Case Else
            curTaxaRisco = 0
            strRequisito = "Procedimento Padrão"
    End Select
  • Operadores Lógicos no If:

    • And (E): Todas as condições precisam ser verdadeiras (True).
    • Or (OU): Basta uma das condições ser verdadeira (True).
    • Not (NÃO): Inverte o valor booleano da expressão.

📖 Exemplo Guiado: Passo a Passo no Laboratório

No computador do laboratório, acesse o VBE (Alt + F11).

Passo 1: Inserção do Módulo de Decisão

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na janela de propriedades (F4), renomeie o módulo para: modRegrasNegocio.
  3. Confirme a presença de Option Explicit no topo.

Passo 2: Estruturação dos Dados de Teste no Excel

Alterne para a planilha e estruture a aba de trabalho na linha 1 com os cabeçalhos:

  • A1: ID_Frete | B1: Categoria_Carga | C1: Valor_Declarado | D1: Motorista_MOPP | E1: Exigencia_Seguranca | F1: Status_Emissao

🛠️ Prática Obrigatória 1: Classificação de Cargas com Select Case

Criaremos o procedimento que lê a categoria digitada e determina a exigência de segurança rodoviária.

Passo a Passo no Computador:

  1. No módulo modRegrasNegocio, digite a rotina:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    Option Explicit
    
    Sub ClassificarRiscoOperacional()
        Dim ws As Worksheet
        Dim strCategoria As String
        Dim curValor As Currency
        Dim strExigencia As String
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        ' Leitura das células B2 e C2
        strCategoria = UCase(Trim(ws.Range("B2").Value))
        curValor = CCur(ws.Range("C2").Value)
    
        ' Chaveamento com Select Case
        Select Case strCategoria
            Case "QUIMICA", "COMBUSTIVEL", "INFLAMAVEL"
                strExigencia = "MOPP + Vistoria Ambiental IBAMA"
    
            Case "PERECIVEL", "FARMACEUTICA", "CONGELADOS"
                strExigencia = "Termógrafo Calibrado + ANVISA"
    
            Case "ELETRONICOS", "CARGA VALIOSA"
                If curValor > 300000 Then
                    strExigencia = "Escolta Armada + Isca Satelital"
                Else
                    strExigencia = "Rastreador Híbrido com Trava de Baú"
                End If
    
            Case "CARGA SECA", "GRAOS", "MINERIOS"
                strExigencia = "Inspeção Visual Padrão"
    
            Case Else
                strExigencia = "CATEGORIA NÃO HOMOLOGADA - REQUER AUDITORIA"
        End Select
    
        ' Gravação do Requisito na Célula E2
        ws.Range("E2").Value = strExigencia
    
        ' Estilização visual
        With ws.Range("E2")
            .Font.Bold = True
            If strCategoria = "ELETRONICOS" Or strCategoria = "QUIMICA" Then
                .Interior.Color = RGB(255, 230, 230) ' Fundo avermelhado de alerta
                .Font.Color = RGB(180, 0, 0)
            Else
                .Interior.Color = RGB(230, 255, 230) ' Fundo verde tranquilo
                .Font.Color = RGB(0, 100, 0)
            End If
        End With
    
        ws.Columns("E").AutoFit
        MsgBox "Classificação concluída: " & strExigencia, vbInformation, "FastLog Compliance"
    End Sub
  2. Dados de Teste:
    • Na célula B2, digite: ELETRONICOS
    • Na célula C2, digite: 450000
    • Execute a macro com F5.

✅ Resultado Esperado (Prática 1):

A célula E2 é preenchida com "Escolta Armada + Isca Satelital" em negrito, com fundo vermelho claro de alerta.


🛠️ Prática Obrigatória 2: Trava de Bloqueio com Condicionais Compostas (And / Or)

Agora construiremos a trava de expedição: se a carga for do tipo "QUIMICA" e o motorista NÃO tiver curso MOPP ("NAO"), o despacho deve ser sumariamente bloqueado, impedindo a saída da frota.

Passo a Passo no Computador:

  1. No mesmo módulo, adicione o procedimento de liberação:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    Sub AvaliarLiberacaoViagem()
        Dim ws As Worksheet
        Dim strCategoria As String
        Dim curValor As Currency
        Dim strTemMOPP As String
        Dim blnBloqueado As Boolean
        Dim strMotivo As String
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        strCategoria = UCase(Trim(ws.Range("B2").Value))
        curValor = CCur(ws.Range("C2").Value)
        strTemMOPP = UCase(Trim(ws.Range("D2").Value))
    
        blnBloqueado = False
        strMotivo = ""
    
        ' Regra 1: Cargas químicas exigem condutor MOPP
        If (strCategoria = "QUIMICA" Or strCategoria = "COMBUSTIVEL") And strTemMOPP <> "SIM" Then
            blnBloqueado = True
            strMotivo = "Bloqueio: Motorista sem certificação MOPP obrigatória!"
        End If
    
        ' Regra 2: Cargas de altíssimo valor sem seguro homologado
        If curValor > 1000000 Then
            blnBloqueado = True
            strMotivo = strMotivo & " Bloqueio: Carga acima de R$ 1.000.000 exige aprovação direta da Diretoria!"
        End If
    
        ' Decisão Final na Planilha (Coluna F2)
        If blnBloqueado Then
            With ws.Range("F2")
                .Value = "BLOQUEADO: " & strMotivo
                .Font.Bold = True
                .Font.Color = RGB(255, 255, 255)
                .Interior.Color = RGB(192, 57, 43) ' Vermelho Alerta
            End With
            MsgBox "VIAGEM BLOQUEADA!" & vbCrLf & strMotivo, vbCritical, "Alerta de Não Conformidade"
        Else
            With ws.Range("F2")
                .Value = "LIBERADO PARA EXPEDIÇÃO"
                .Font.Bold = True
                .Font.Color = RGB(255, 255, 255)
                .Interior.Color = RGB(39, 174, 96) ' Verde Sucesso
            End With
            MsgBox "Viagem autorizada e em conformidade!", vbInformation, "Despacho Autorizado"
        End If
    
        ws.Columns("F").AutoFit
    End Sub
  2. Teste de Bloqueio:
    • Altere B2 para QUIMICA e D2 para NAO.
    • Execute a macro AvaliarLiberacaoViagem (F5).
    • Verifique o bloqueio automático e a coloração vermelha na célula F2!

✅ Resultado Esperado (Prática 2):

A planilha exibe o status de bloqueio com aviso na tela e pintura vermelha de alerta, impedindo infrações operacionais.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_VBA_SeuNome_SeuSobrenome.xlsm.
  2. Acesse a plataforma Microsoft Teams.
  3. Abra a tarefa: “VBA - Cap 05: Condicionais e Select Case”.
  4. Anexe a planilha e conclua a entrega.

💡 Checkpoint de Gestão & TI

No gerenciamento de riscos corporativos (Enterprise Risk Management - ERM), a automação de regras de compliance elimina a falha humana em postos críticos. Uma única carreta carregada de produtos químicos liberada sem curso MOPP acarreta multas superiores a R$ 50.000,00 da ANTT, além de retenção do veículo e perda da cobertura da apólice de seguros em caso de sinistro. O código VBA atua como um fiscal eletrônico incorruptível.


🔥 Desafio de Fixação: Taxa Adicional de Risco

Incremente a rotina adicionando o cálculo de uma taxa de sobreseguro:

  1. Crie uma variável curTaxaRisco As Currency.
  2. Se a categoria for ELETRONICOS e o valor for superior a R$ 200.000, aplique uma taxa de R$ 750,00.
  3. Se for QUIMICA, aplique uma taxa de R$ 1.200,00.
  4. Grave esse valor calculado na célula G2 formatado como moeda (R$ #,##0.00).

🔑 Revelar Gabarito Oficial de Laboratório (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código Consolidado (modRegrasNegocio):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Option Explicit

Sub ProcessarDespachoCompleto()
    Dim ws As Worksheet
    Dim strCategoria As String
    Dim curValor As Currency
    Dim strTemMOPP As String
    Dim strExigencia As String
    Dim curTaxaRisco As Currency
    Dim blnBloqueado As Boolean
    Dim strMotivo As String
    
    Set ws = ThisWorkbook.Worksheets(1)
    
    strCategoria = UCase(Trim(ws.Range("B2").Value))
    curValor = CCur(ws.Range("C2").Value)
    strTemMOPP = UCase(Trim(ws.Range("D2").Value))
    
    curTaxaRisco = 0
    blnBloqueado = False
    
    ' 1. Select Case para Requisitos e Taxas
    Select Case strCategoria
        Case "QUIMICA", "COMBUSTIVEL"
            strExigencia = "MOPP + Vistoria IBAMA"
            curTaxaRisco = 1200
            
        Case "PERECIVEL", "FARMACEUTICA"
            strExigencia = "Termógrafo Calibrado"
            curTaxaRisco = 450
            
        Case "ELETRONICOS"
            If curValor > 300000 Then
                strExigencia = "Escolta Armada + Isca"
                curTaxaRisco = 1800
            Else
                strExigencia = "Rastreador Híbrido"
                curTaxaRisco = 750
            End If
            
        Case "CARGA SECA"
            strExigencia = "Inspeção Padrão"
            curTaxaRisco = 0
            
        Case Else
            strExigencia = "NÃO HOMOLOGADA"
            blnBloqueado = True
            strMotivo = "Categoria inválida."
    End Select
    
    ' 2. Regra de Bloqueio MOPP
    If (strCategoria = "QUIMICA" Or strCategoria = "COMBUSTIVEL") And strTemMOPP <> "SIM" Then
        blnBloqueado = True
        strMotivo = strMotivo & " Falta MOPP."
    End If
    
    ' 3. Gravação de Resultados
    ws.Range("E2").Value = strExigencia
    ws.Range("G2").Value = curTaxaRisco
    ws.Range("G2").NumberFormat = "R$ #,##0.00"
    
    If blnBloqueado Then
        With ws.Range("F2")
            .Value = "BLOQUEADO: " & Trim(strMotivo)
            .Font.Bold = True
            .Font.Color = RGB(255, 255, 255)
            .Interior.Color = RGB(192, 57, 43)
        End With
    Else
        With ws.Range("F2")
            .Value = "LIBERADO"
            .Font.Bold = True
            .Font.Color = RGB(255, 255, 255)
            .Interior.Color = RGB(39, 174, 96)
        End With
    End If
    
    ws.Columns("A:G").AutoFit
End Sub

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que você estudou neste capítulo. Ao concluir, apresente o caderno ao professor para visto.

  1. Qual é a principal vantagem de legibilidade e manutenção ao utilizar a estrutura Select Case em comparação com múltiplos ElseIf?
  2. Como podemos agrupar múltiplos valores na mesma cláusula Case (por exemplo, testar "QUIMICA" ou "COMBUSTIVEL")?
  3. O que acontece se nenhum dos blocos Case corresponder ao valor testado e a cláusula Case Else tiver sido omitida?
  4. Explique a diferença lógica entre os operadores booleanos And e Or.
  5. Em que situação o operador lógico Not deve ser empregado em uma condicional?
  6. Como o aninhamento de instruções If dentro de um Case foi utilizado no laboratório para cargas eletrônicas?
  7. No Cenário da FastLog, que consequências regulatórias a empresa sofria ao despachar cargas químicas sem a checagem do curso MOPP?
  8. Por que é uma boa prática aplicar as funções UCase e Trim na variável testada antes de submetê-la ao Select Case?
  9. Como atribuímos simultaneamente a cor de fundo (Interior.Color) e a cor do texto (Font.Color) de uma célula no VBA?
  10. O que é uma variável do tipo Boolean e qual foi sua função na sinalização de bloqueio da viagem (blnBloqueado)?