Capítulo 02: Tipagem Estática, Declaração Rigorosa (Option Explicit) e Depuração

🎯 Objetivo da Aula

Nesta aula, você aprenderá as regras fundamentais de engenharia de software aplicadas ao VBA: a obrigatoriedade da diretiva Option Explicit, a tipagem estática e eficiente de variáveis na memória RAM com a instrução Dim, o uso de operadores aritméticos e a técnica de inspeção em tempo real utilizando a Janela de Verificação Imediata (Ctrl + G) e o método Debug.Print.

Ao término deste laboratório, você terá construído o motor de cálculo tarifário da transportadora, eliminando falhas de digitação e assegurando precisão contábil com o tipo Currency.


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

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: No mês anterior, o setor de faturamento da FastLog sofreu um prejuízo contábil de R$ 42.000,00. Um assistente havia criado uma macro sem tipagem estática para calcular o frete rodoviário de cargas pesadas. Devido a um erro de digitação no código (ValorFrete foi digitado como ValorFrete_ em uma linha), o VBA criou automaticamente uma nova variável vazia com valor zero, isentando indevidamente a taxa de seguro de 12 carretas com eletrônicos de alto valor.
Sua Missão: Como desenvolvedor de automações corporativas, você ativará a diretiva Option Explicit para blindar o sistema contra variáveis fantasmas, declarará tipos de dados estritos (Long, Double, Currency, Date) e criará o procedimento CalcularFreteExpedicao, que lê os dados brutos da planilha, calcula o frete-peso, o seguro Ad Valorem e grava o valor total liquidado com precisão de centavos.


🧠 Fundamentos: A Teoria Traduzida

1. O Perigo do Tipo Variant e a Diretiva Option Explicit

Por padrão, se você não declarar uma variável no VBA, ele a cria automaticamente como Variant. O tipo Variant consome até 16 bytes de memória (contra apenas 4 bytes de um Long), é lento e aceita qualquer valor sem alertar sobre erros de digitação.

Para impedir isso, inserimos sempre na primeira linha do módulo:

1
Option Explicit

Essa diretiva força o compilador a recusar qualquer variável que não tenha sido previamente declarada com a palavra-chave Dim (Dimension).

flowchart TD
    CODIGO["Código VBA com Option Explicit"] --> COMP["Compilação / Execução"]
    COMP --> DEC{"A variável foi declarada com Dim?"}
    DEC -- SIM --> RAM["Alocação de Memória RAM Tipada<br/>(Long: 4B, Currency: 8B, String)"]
    DEC -- NÃO --> ERRO["❌ ERRO DE COMPILAÇÃO:<br/>'Variável não definida'<br/>Impede prejuízos financeiros!"]

    style CODIGO fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style COMP fill:#2c3e50,stroke:#fff,stroke-width:2px,color:#fff
    style DEC fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style RAM fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
    style ERRO fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff

2. Tabela de Tipos Primitivos do VBA Corporativo

Tipo de DadoTamanhoFaixa de ValoresCaso de Uso na Logística
Long4 bytes-2.147.483.648 a 2.147.483.647IDs de Carga, Número de Nota Fiscal, Linhas de Planilha (Row)
Double8 bytesPonto flutuante de precisão duplaPeso em kg (ex: 14250.75), Quilometragem, Densidade cúbica
Currency8 bytes-922 trilhões a +922 trilhões (4 decimais fixas)Valores monetários, Frete, Impostos, Pedágios (sem erro de arredondamento)
String10 bytes + tamTexto alfanuméricoPlacas de veículos, Nome de motoristas, Cidades de destino
Boolean2 bytesTrue ou FalseStatus de Carga Frágil, Seguro Aprovado, Veículo Liberado
Date8 bytes01/01/0100 a 31/12/9999Data de Emissão do CTe, Previsão de Entrega

No VBA antigo utilizava-se Integer (2 bytes, limitado a 32.767). Como as planilhas do Excel possuem 1.048.576 linhas, nunca utilize Integer para contadores ou linhas; utilize sempre Long!

3. Operadores Aritméticos Especiais do VBA

Além dos tradicionais soma (+), subtração (-), multiplicação (*) e divisão real (/), o VBA possui operadores matemáticos dedicados:

  • \ (Divisão Inteira): Retorna apenas a parte inteira da divisão (ex: 10 \ 3 = 3).
  • Mod (Resto da Divisão): Retorna o resto (ex: 10 Mod 3 = 1). Excelente para despachar frotas em lotes de caixas.
  • ^ (Exponenciação): Eleva à potência (ex: 2 ^ 3 = 8).

4. Depuração com Debug.Print e Janela Imediata

Para inspecionar cálculos sem travar a tela do usuário com centenas de caixas de mensagem (MsgBox), utilizamos:

1
Debug.Print "O frete apurado foi: " & curTotalFrete

O resultado é impresso diretamente na Janela de Verificação Imediata (Ctrl + G no VBE).


📖 Exemplo Guiado: Passo a Passo no Laboratório

No Excel, abra a pasta de trabalho criada no Capítulo 01 (.xlsm) ou crie uma nova pasta habilitada para macros.

Passo 1: Configuração Automática de Option Explicit

  1. Abra o VBE pressionando Alt + F11.
  2. No menu superior, clique em Ferramentas ➔ Opções.
  3. Na guia Editor, marque a caixa de seleção: ☑ Requer Declaração de Variável.
  4. Clique em OK.
    (A partir de agora, qualquer novo módulo criado virá automaticamente com Option Explicit no topo!).

Passo 2: Inserção de um Novo Módulo

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na Janela de Propriedades (F4), altere a propriedade (Name) de Módulo1 para: modCalculoFrete.

🛠️ Prática Obrigatória 1: Cálculo Tarifário de Fretes e Adicional de Seguro (F8)

Construiremos a rotina oficial de precificação de viagens rodoviárias da FastLog.

Passo a Passo no Computador:

  1. No módulo modCalculoFrete, digite o seguinte código completo:

     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
    
    Option Explicit
    
    Sub CalcularFreteExpedicao()
        ' 1. Constantes Tarifárias Homologadas
        Const TAXA_KG As Currency = 1.85           ' R$ 1,85 por kg transportado
        Const TAXA_KM As Currency = 4.2            ' R$ 4,20 por km rodado
        Const ALIQ_SEGURO As Double = 0.0035       ' 0,35% Ad Valorem sobre valor da mercadoria
    
        ' 2. Declaração Estrita de Variáveis (RAM)
        Dim strCargaID As String
        Dim dblPesoKg As Double
        Dim dblDistanciaKm As Double
        Dim curValorMercadoria As Currency
        Dim curCustoPeso As Currency
        Dim curCustoDistancia As Currency
        Dim curValorSeguro As Currency
        Dim curFreteTotal As Currency
        Dim dtmEmissao As Date
    
        ' 3. Leitura dos Dados Operacionais da Planilha Ativa
        strCargaID = Range("A2").Value
        dblPesoKg = Range("B2").Value
        dblDistanciaKm = Range("C2").Value
        curValorMercadoria = Range("D2").Value
        dtmEmissao = Date
    
        ' 4. Processamento Aritmético
        curCustoPeso = dblPesoKg * TAXA_KG
        curCustoDistancia = dblDistanciaKm * TAXA_KM
        curValorSeguro = curValorMercadoria * ALIQ_SEGURO
        curFreteTotal = curCustoPeso + curCustoDistancia + curValorSeguro
    
        ' 5. Gravação dos Resultados Formatados na Planilha
        Range("E2").Value = curCustoPeso
        Range("F2").Value = curCustoDistancia
        Range("G2").Value = curValorSeguro
        Range("H2").Value = curFreteTotal
        Range("I2").Value = dtmEmissao
    
        ' Formatação Moeda nas colunas de saída
        Range("E2:H2").NumberFormat = "R$ #,##0.00"
        Range("I2").NumberFormat = "dd/mm/yyyy"
    End Sub
  2. Preparação dos Dados na Planilha do Excel:

    • Alterne para o Excel (Alt + F11).
    • Na linha 1, configure as seguintes colunas:
      • A1: ID_Carga
      • B1: Peso_Kg
      • C1: Distancia_Km
      • D1: Valor_Mercadoria
      • E1: Custo_Peso
      • F1: Custo_Distancia
      • G1: Seguro_AdValorem
      • H1: Total_Frete
      • I1: Data_Calculo
    • Na linha 2, insira os dados do transporte de teste:
      • A2: CARGA-9941 | B2: 12500 | C2: 680 | D2: 350000
  3. Depuração com a Tecla F8 e Janela de Variáveis Locais:

    • No VBE, clique no menu Exibir ➔ Janela Variáveis Locais.
    • Posicione o cursor dentro de Sub CalcularFreteExpedicao() e tecle F8.
    • Observe a janela de variáveis locais: cada variável declarada surge com seu tipo exato e valor atualizado a cada linha percorrida!

✅ Resultado Esperado (Prática 1):

Na linha 2 da planilha, as colunas E, F, G e H são preenchidas automaticamente:

  • Custo Peso: R$ 23.125,00 (12.500 * 1,85)
  • Custo Distância: R$ 2.856,00 (680 * 4,20)
  • Seguro: R$ 1.225,00 (350.000 * 0,0035)
  • Total do Frete: R$ 27.206,00
  • Data do Cálculo: Data atual do computador.

🛠️ Prática Obrigatória 2: Inspeção de Variáveis na Janela Imediata (Debug.Print)

Agora você utilizará a ferramenta de console do VBE para registrar o log do cálculo e simular divisões de carga em pallets.

Passo a Passo no Computador:

  1. No VBE, pressione Ctrl + G para exibir a Janela de Verificação Imediata (na parte inferior do VBE).
  2. Adicione ao final do procedimento CalcularFreteExpedicao (antes de End Sub) as seguintes instruções de auditoria técnica:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
        ' 6. Auditoria de TI na Janela Imediata (Ctrl + G)
        Dim lngQtdPallets As Long
        Dim lngRestoVolumes As Long
    
        ' Cada pallet comporta no máximo 800 kg
        lngQtdPallets = CLng(dblPesoKg) \ 800
        lngRestoVolumes = CLng(dblPesoKg) Mod 800
    
        Debug.Print "================ RELATÓRIO TÉCNICO FASTLOG ================"
        Debug.Print "ID da Carga: " & strCargaID
        Debug.Print "Capacidade: " & lngQtdPallets & " pallets cheios."
        Debug.Print "Excedente fracionado: " & lngRestoVolumes & " kg restantes."
        Debug.Print "Frete Total Homologado: " & FormatCurrency(curFreteTotal)
        Debug.Print "Auditoria gerada em: " & Now
        Debug.Print "==========================================================="
  3. Pressione F5 para executar a rotina diretamente.
  4. Visualize o log técnico gerado na Janela Imediata!

✅ Resultado Esperado (Prática 2):

A Janela de Verificação Imediata exibe:

1
2
3
4
5
6
7
================ RELATÓRIO TÉCNICO FASTLOG ================
ID da Carga: CARGA-9941
Capacidade: 15 pallets cheios.
Excedente fracionado: 500 kg restantes.
Frete Total Homologado: R$ 27.206,00
Auditoria gerada em: 01/10/2026 10:45:00
===========================================================

📤 Instruções de Entrega (Microsoft Teams)

  1. Certifique-se de salvar a pasta de trabalho com suporte a macros (.xlsm).
  2. Nomeie o arquivo como: Atividade_02_VBA_SeuNome_SeuSobrenome.xlsm.
  3. Acesse o Microsoft Teams na equipe da sua turma.
  4. Abra a tarefa: “VBA - Cap 02: Tipagem Estática e Option Explicit”.
  5. Anexe sua planilha e envie.

💡 Checkpoint de Gestão & TI

A tipagem de dados não é mero capricho estético: em sistemas financeiros e logísticos, o uso do tipo de dados correto evita erros de estouro de memória (Overflow Error 6) e imprecisões de arredondamento de ponto flutuante. Ao utilizar Currency em vez de Double para tarifas, garantimos que operações com centavos não sofram com resíduos binários como 0,0000000000000001, preservando a conformidade fiscal com a Receita Federal e auditorias contábeis.


🔥 Desafio de Fixação: Cálculo de Pedágio e Arredondamento Bancário

Adicione ao cálculo o valor dos pedágios rodoviários:

  1. No trecho de constantes, adicione a taxa média de pedágio:
    1
    
    Const TAXA_PEDAGIO_POR_EIXO As Currency = 9.8
  2. Declare a variável lngEixosCaminhao As Long e leia o valor digitado na célula J2 (suponha um caminhão truck de 3 eixos).
  3. Calcule o custo de pedágio (lngEixosCaminhao * TAXA_PEDAGIO_POR_EIXO * (dblDistanciaKm \ 100) — considerando uma praça de pedágio a cada 100 km inteiros).
  4. Some o valor do pedágio à variável curFreteTotal e exiba o resultado na célula K2.

🔑 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 Oficial do Módulo (modCalculoFrete):

 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
Option Explicit

Sub CalcularFreteExpedicao()
    ' Constantes
    Const TAXA_KG As Currency = 1.85
    Const TAXA_KM As Currency = 4.2
    Const ALIQ_SEGURO As Double = 0.0035
    Const TAXA_PEDAGIO_POR_EIXO As Currency = 9.8
    
    ' Variáveis
    Dim strCargaID As String
    Dim dblPesoKg As Double
    Dim dblDistanciaKm As Double
    Dim curValorMercadoria As Currency
    Dim lngEixos As Long
    
    Dim curCustoPeso As Currency
    Dim curCustoDistancia As Currency
    Dim curValorSeguro As Currency
    Dim curValorPedagio As Currency
    Dim curFreteTotal As Currency
    Dim dtmEmissao As Date
    
    Dim lngQtdPallets As Long
    Dim lngRestoVolumes As Long
    
    ' Entrada de Dados
    strCargaID = Range("A2").Value
    dblPesoKg = CDbl(Range("B2").Value)
    dblDistanciaKm = CDbl(Range("C2").Value)
    curValorMercadoria = CCur(Range("D2").Value)
    lngEixos = IIf(Range("J2").Value = "", 3, CLng(Range("J2").Value))
    dtmEmissao = Date
    
    ' Cálculos
    curCustoPeso = dblPesoKg * TAXA_KG
    curCustoDistancia = dblDistanciaKm * TAXA_KM
    curValorSeguro = curValorMercadoria * ALIQ_SEGURO
    curValorPedagio = (dblDistanciaKm \ 100) * (lngEixos * TAXA_PEDAGIO_POR_EIXO)
    curFreteTotal = curCustoPeso + curCustoDistancia + curValorSeguro + curValorPedagio
    
    ' Saída na Planilha
    Range("E2").Value = curCustoPeso
    Range("F2").Value = curCustoDistancia
    Range("G2").Value = curValorSeguro
    Range("H2").Value = curFreteTotal
    Range("I2").Value = dtmEmissao
    Range("K2").Value = curValorPedagio
    
    ' Formatação
    Range("E2:H2").NumberFormat = "R$ #,##0.00"
    Range("K2").NumberFormat = "R$ #,##0.00"
    Range("I2").NumberFormat = "dd/mm/yyyy"
    
    ' Palletização e Auditoria Imediata
    lngQtdPallets = CLng(dblPesoKg) \ 800
    lngRestoVolumes = CLng(dblPesoKg) Mod 800
    
    Debug.Print "================ RELATÓRIO TÉCNICO FASTLOG ================"
    Debug.Print "ID da Carga: " & strCargaID
    Debug.Print "Pallets Estimados: " & lngQtdPallets & " (Resto: " & lngRestoVolumes & " kg)"
    Debug.Print "Pedágios Calculados: " & FormatCurrency(curValorPedagio)
    Debug.Print "Frete Total Final: " & FormatCurrency(curFreteTotal)
    Debug.Print "==========================================================="
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 é o papel da diretiva Option Explicit quando inserida na primeira linha de um módulo VBA?
  2. Por que confiar no tipo de dado padrão Variant é considerado uma prática de má qualidade e arriscada em ambientes corporativos?
  3. O que acontece em tempo de execução se você tentar rodar um código com Option Explicit contendo uma variável com erro de digitação?
  4. Qual é a diferença fundamental de capacidade e recomendação de uso entre os tipos de dados Integer e Long no Excel contemporâneo?
  5. Por que valores monetários e financeiros devem ser declarados com o tipo Currency em vez de Double?
  6. O que o operador aritmético de barra invertida (\) realiza no VBA e como ele se diferencia da barra comum (/)?
  7. Explique a finalidade do operador matemático Mod e cite um exemplo de aplicação prática na área de transportes.
  8. Qual atalho do teclado deve ser utilizado no ambiente VBE para abrir a Janela de Verificação Imediata?
  9. Qual é a utilidade do comando Debug.Print durante o desenvolvimento e teste de rotinas complexas?
  10. O que significa a palavra-chave Const e por que ela é indicada para valores de alíquotas de impostos e taxas contratuais?