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órmulasSEaninhadas na planilha, gerando erros constantes e multas rodoviárias por falta de escolta obrigatória.
Sua Missão: Construir a rotina em VBAClassificarRiscoOperacional, utilizandoSelect Casepara classificar o tipo de transporte eIf...And...Orpara 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:#fff2. Sintaxe Comparativa
Estrutura com
Select Case: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
- No menu superior, clique em Inserir ➔ Módulo.
- Na janela de propriedades (
F4), renomeie o módulo para:modRegrasNegocio. - Confirme a presença de
Option Explicitno 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:
- No módulo
modRegrasNegocio, digite a rotina: - Dados de Teste:
- Na célula B2, digite:
ELETRONICOS - Na célula C2, digite:
450000 - Execute a macro com
F5.
- Na célula B2, digite:
✅ 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:
- No mesmo módulo, adicione o procedimento de liberação:
- Teste de Bloqueio:
- Altere B2 para
QUIMICAe D2 paraNAO. - Execute a macro
AvaliarLiberacaoViagem(F5). - Verifique o bloqueio automático e a coloração vermelha na célula F2!
- Altere B2 para
✅ 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)
- Salve o arquivo como:
Atividade_05_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse a plataforma Microsoft Teams.
- Abra a tarefa: “VBA - Cap 05: Condicionais e Select Case”.
- 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:
- Crie uma variável
curTaxaRisco As Currency. - Se a categoria for
ELETRONICOSe o valor for superior a R$ 200.000, aplique uma taxa de R$ 750,00. - Se for
QUIMICA, aplique uma taxa de R$ 1.200,00. - Grave esse valor calculado na célula G2 formatado como moeda (
R$ #,##0.00).
📝 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.
- Qual é a principal vantagem de legibilidade e manutenção ao utilizar a estrutura
Select Caseem comparação com múltiplosElseIf? - Como podemos agrupar múltiplos valores na mesma cláusula
Case(por exemplo, testar"QUIMICA"ou"COMBUSTIVEL")? - O que acontece se nenhum dos blocos
Casecorresponder ao valor testado e a cláusulaCase Elsetiver sido omitida? - Explique a diferença lógica entre os operadores booleanos
AndeOr. - Em que situação o operador lógico
Notdeve ser empregado em uma condicional? - Como o aninhamento de instruções
Ifdentro de umCasefoi utilizado no laboratório para cargas eletrônicas? - No Cenário da FastLog, que consequências regulatórias a empresa sofria ao despachar cargas químicas sem a checagem do curso MOPP?
- Por que é uma boa prática aplicar as funções
UCaseeTrimna variável testada antes de submetê-la aoSelect Case? - Como atribuímos simultaneamente a cor de fundo (
Interior.Color) e a cor do texto (Font.Color) de uma célula no VBA? - O que é uma variável do tipo
Booleane qual foi sua função na sinalização de bloqueio da viagem (blnBloqueado)?