Capítulo 18: VBA I - Sintaxe, Variáveis, Tipos de Dados e Condicionais

🎯 Objetivo da Aula

Nesta aula, você cruzará definitivamente a fronteira entre um usuário de planilhas e um desenvolvedor de software corporativo. Você aprenderá a escrever código VBA diretamente no editor de código (VBE), sem depender do gravador.

Ao final desta aula, você dominará:

  1. A anatomia de procedimentos: Sub (Sub-rotinas) vs Function (Funções Personalizadas).
  2. A importância da diretiva Option Explicit e a declaração de variáveis na memória RAM com Dim.
  3. A tabela completa de Tipos Primitivos de Dados em VBA (Long, Double, String, Boolean, Date).
  4. Estruturas de controle de fluxo condicional: If...Then...ElseIf...Else e Select Case.
  5. Caixas de diálogo interativas com MsgBox e InputBox.
  6. Técnicas profissionais de Depuração de Código utilizando a tecla F8 (Passo a Passo) e a Janela Imediata.

🏢 O Cenário Prático (Seu Desafio)

Situação: Na central de operações da FastLog, as solicitações de frete acima de R$ 10.000,00 representam alto risco de sinistro (roubo de carga ou acidentes com cargas valiosas) e necessitam de contratação mandatória de escolta armada. Fretes entre R$ 3.000,00 e R$ 10.000,00 exigem apenas rastreamento via satélite, e fretes abaixo de R$ 3.000,00 possuem liberação padrão.

Missão: Você deve programar um algoritmo em VBA que leia o valor do frete e o tipo da carga digitados na planilha, tome a decisão de segurança correta e exiba um alerta visual e sonoro para o operador logístico com botões de confirmação.


🧠 Fundamentos: A Teoria da Linguagem VBA

1. A Anatomia do Código: Sub vs Function

No VBA, todo bloco de execução é chamado de Procedimento. Existem dois tipos principais:

graph TD
    Proc[Procedimentos VBA] --> SubRoutine["Sub (Sub-rotina)"]
    Proc --> Func["Function (Função / UDF)"]
    
    SubRoutine --> SubDesc["Executa ações no Excel<br/>(Pinta células, abre telas, deleta dados)<br/>NÃO retorna valor para fórmulas"]
    Func --> FuncDesc["Realiza cálculos matemáticos ou de texto<br/>RETORNA um valor final<br/>Pode ser usada como fórmula personalizada na célula"]
    
    style SubRoutine fill:#217346,stroke:#fff,stroke-width:2px,color:#fff
    style Func fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
  • Exemplo de Sub:
    1
    2
    3
    
    Sub EmitirAlerta()
        MsgBox "Processo concluído com sucesso!"
    End Sub
  • Exemplo de Function (Fórmula Própria / UDF):
    1
    2
    3
    
    Function CalcularICMS(valor As Double) As Double
        CalcularICMS = valor * 0.18
    End Function
    (Você pode digitar na célula do Excel: =CalcularICMS(1000) e o Excel retornará 180!)

2. Variáveis, Memória e a Diretiva Option Explicit

Uma Variável é um endereço reservado na memória RAM do computador para armazenar temporariamente uma informação durante o processamento do código.

Para declarar uma variável em VBA, utilizamos a palavra-chave Dim (Dimension):

1
2
3
Dim nomeDoMotorista As String
Dim valorDoFrete As Double
Dim entregueComSucesso As Boolean

A Boa Prática de Ouro: Option Explicit
No topo de qualquer módulo de código, escreva sempre Option Explicit. Essa instrução obriga você a declarar formalmente todas as variáveis. Se você errar a digitação do nome de uma variável no meio de 500 linhas de código, o VBA avisará o erro na hora de compilar, evitando falhas silenciosas graves nos cálculos financeiros.


3. Tabela Completa de Tipos de Dados em VBA

Escolher o tipo de dado correto garante performance e economia de memória:

Tipo VBAO que armazena?Intervalo de ValoresExemplo de Uso Logístico
IntegerNúmero inteiro curto-32.768 até 32.767Contagem de caixas pequenas
LongNúmero inteiro longo-2.147.483.648 até 2.147.483.647Número da Linha da Planilha (O Excel tem 1.048.576 linhas)
DoubleDecimal de alta precisãoNúmeros com casas decimais (64 bits)Valores monetários, quilometragens, pesos
CurrencyMoeda de ponto fixoEvita erros de arredondamento financeiroBalanço patrimonial, Faturamento
StringTexto alfanuméricoLetras, símbolos e dígitos de textoNomes de cidades, placas, códigos de rastreio
BooleanValor lógicoApenas True (Verdadeiro) ou False (Falso)cargaEntregue = True, temSeguro = False
DateData e Hora01/01/0100 até 31/12/9999Prazos de entrega, horários de chegada
VariantTipo genérico (Curinga)Aceita qualquer tipo de dadoPadrão do VBA se você não declarar o tipo (consome mais memória)

4. Operadores da Linguagem VBA

A. Aritméticos

  • + (Soma), - (Subtração), * (Multiplicação), / (Divisão real)
  • \ (Divisão inteira: 7 \ 2 retorna 3)
  • Mod (Resto da divisão: 7 Mod 2 retorna 1)
  • ^ (Exponenciação: 2 ^ 3 retorna 8)

B. Relacionais e Lógicos

  • Comparação: =, <>, >, <, >=, <=
  • Lógicos: And (Todas verdadeiras), Or (Pelo menos uma verdadeira), Not (Inversão lógica)
  • Concatenação de Textos: Operador & (ex: "Olá, " & nomeMotorista)

5. Estruturas Condicionais no Código

A. Estrutura If ... Then ... ElseIf ... Else ... End If

Usada quando avaliamos regras com intervalos contínuos ou múltiplas portas lógicas:

1
2
3
4
5
6
7
If valorFrete >= 10000 Then
    nivelSeguranca = "Escolta Armada Obrigatória"
ElseIf valorFrete >= 3000 Then
    nivelSeguranca = "Monitoramento Satélite"
Else
    nivelSeguranca = "Liberação Padrão"
End If

B. Estrutura Select Case (A Escolha Múltipla Limpa)

Ideal para comparar uma única variável com múltiplos valores fixos específicos (como Estados, Categorias ou Modais de Transporte):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Select Case regiaoDestino
    Case "Sudeste"
        prazoEntrega = 2
    Case "Sul", "Centro-Oeste"
        prazoEntrega = 4
    Case "Nordeste", "Norte"
        prazoEntrega = 7
    Case Else
        prazoEntrega = 10 ' Região desconhecida
End Select

Quando o critério é uma faixa numérica aberta (por exemplo, “qualquer valor acima de X”), em vez de listar valores fixos, use a palavra-chave Case Is seguida de um operador de comparação:

1
2
3
4
5
6
Select Case pesoCarga
    Case Is > 14000
        veiculo = "Carreta / Articulado"
    Case Else
        veiculo = "Veículo Menor"
End Select

6. Caixas de Interação: MsgBox Avançado e InputBox

Ícones e Botões do MsgBox:

Ao exibir uma mensagem, você pode combinar ícones e botões somando suas constantes:

  • Ícones: vbInformation (Azul/Informativo), vbExclamation (Amarelo/Atenção), vbCritical (Vermelho/Erro Crítico).
  • Botões: vbOKOnly (Apenas OK), vbYesNo (Sim/Não), vbOKCancel (OK/Cancelar).
  • Captura de Resposta:
    1
    2
    3
    4
    5
    
    Dim confirmacao As VbMsgBoxResult
    confirmacao = MsgBox("Deseja aprovar o frete?", vbYesNo + vbQuestion, "Sistema FastLog")
    If confirmacao = vbYes Then
        ' Usuário clicou em Sim
    End If

7. Funções Úteis de Conversão, Texto e Formatação

Ao ler um valor digitado pelo usuário (via InputBox ou célula), ele geralmente chega como texto. O VBA oferece funções prontas para converter e formatar esses valores, usadas nos exemplos e práticas deste capítulo:

FunçãoO que fazExemplo
CInt(valor)Converte texto/número para IntegerCInt("15")15
CDbl(valor)Converte texto/número para DoubleCDbl("12500")12500
FormatCurrency(valor)Formata um número como moeda (R$)FormatCurrency(300)"R$ 300,00"
UCase(texto)Converte todo o texto para MAIÚSCULASUCase("eletrônicos")"ELETRÔNICOS"
Trim(texto)Remove espaços em branco nas pontas (o ARRUMAR do Excel, em VBA)Trim(" SP ")"SP"

O VBA também disponibiliza constantes prontas de texto e cor, sem precisar declará-las com Dim:

  • vbCrLf — insere uma quebra de linha dentro de uma MsgBox (equivale a apertar Enter no meio do texto).
  • vbRed, vbBlack, vbWhite — cores prontas para usar em Font.Color ou Interior.Color, como atalho para não precisar calcular com RGB().

O sinal _ no final da linha
Quando uma instrução VBA fica muito longa, você pode “quebrá-la” visualmente em várias linhas terminando cada uma com um espaço seguido de sublinhado (_). O VBA entende que o comando continua na linha de baixo — é só organização visual, não muda o que o código faz.


8. O Superpoder da Depuração: Execução Passo a Passo (F8)

Programadores profissionais não adivinham onde está o erro; eles assistem a execução em câmera lenta:

  1. Abra o VBE (Alt + F11) e clique dentro de qualquer Sub.
  2. Pressione a tecla F8 no teclado: uma linha amarela destacará a instrução atual.
  3. A cada novo toque no F8, o VBA executa rigorosamente apenas aquela linha.
  4. Passe o mouse em cima das variáveis para ver o valor que elas estão guardando em tempo real na memória.
  5. Abra a Janela de Verificação Imediata (Ctrl + G), digite ?valorFrete e aperte Enter para interrogar o sistema.

📖 Exemplo Guiado: Criando uma Calculadora de Diárias com Validação

Vamos criar uma rotina que pergunta a quantidade de dias viajados por um motorista e calcula o valor do reembolso, alertando se houver excesso de dias.

Passo a Passo

  1. Abra o editor VBA (Alt + F11).
  2. No menu superior, clique em Inserir > Módulo.
  3. Digite o código completo abaixo:
 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
Option Explicit

Sub CalcularReembolsoViagem()
    ' 1. Declaração de Variáveis Tipadas
    Dim diasViagem As Integer
    Dim valorDiaria As Double
    Dim totalReembolso As Double
    Dim respostaInput As String
    
    valorDiaria = 180# ' R$ 180,00 por dia
    
    ' 2. Entrada de Dados via InputBox
    respostaInput = InputBox("Informe a quantidade de dias em trânsito:", "Reembolso de Motoristas")
    
    ' Validação: se o usuário cancelou ou deixou vazio
    If respostaInput = "" Then
        MsgBox "Operação cancelada pelo operador.", vbExclamation, "Aviso"
        Exit Sub
    End If
    
    diasViagem = CInt(respostaInput)
    
    ' 3. Processamento Lógico com Condicional
    If diasViagem <= 0 Then
        MsgBox "Quantidade de dias inválida!", vbCritical, "Erro de Entrada"
        Exit Sub
    ElseIf diasViagem > 15 Then
        MsgBox "Viagens acima de 15 dias exigem autorização especial da diretoria!", vbExclamation, "Alerta de Compliance"
    End If
    
    totalReembolso = diasViagem * valorDiaria
    
    ' 4. Saída Formatada
    MsgBox "Total a reembolsar: " & FormatCurrency(totalReembolso), vbInformation, "Cálculo Finalizado"
End Sub

✅ Teste de Execução

Pressione F5 para rodar ou aperte F8 para acompanhar cada linha sendo executada passo a passo.


🛠️ Prática Obrigatória 1: Triagem Automática de Apólices de Carga

Passo 1: Estruturando a Planilha de Risco

Na Planilha 1, crie os campos de consulta nas células A1 até B4:

  • A1: === AVALIAÇÃO DE RISCO DE EMBARQUE ===
  • A3: Valor Declarado da Carga (R$): | B3: (Digite 12500)
  • A4: Categoria da Carga: | B4: (Digite Eletrônicos)

Passo 2: Codificando a Regra de Negócio no VBE

No Módulo 1, crie o procedimento de auditoria:

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

Sub AvaliarRiscoCarga()
    Dim valorCarga As Double
    Dim categoria As String
    Dim protocolo As Long
    Dim mensagemFinal As String
    
    ' Leitura das propriedades dos objetos Range
    valorCarga = Range("B3").Value
    categoria = UCase(Trim(Range("B4").Value))
    
    ' Lógica Composta
    If valorCarga >= 10000 Or categoria = "ELETRÔNICOS" Then
        protocolo = 90001
        mensagemFinal = "RISCO ELEVADO!" & vbCrLf & _
                        "• Exigência: Escolta Armada + Rastreador Satelital." & vbCrLf & _
                        "• Protocolo Gerado: #" & protocolo
        
        MsgBox mensagemFinal, vbCritical + vbOKOnly, "FastLog Risk Management"
        Range("B6").Value = "BLOQUEADO - AGUARDANDO ESCOLTA"
        Range("B6").Font.Color = vbRed
        Range("B6").Font.Bold = True
    Else
        mensagemFinal = "RISCO NORMAL." & vbCrLf & "• Embarque liberado na doca padrão."
        MsgBox mensagemFinal, vbInformation + vbOKOnly, "FastLog Risk Management"
        Range("B6").Value = "LIBERADO"
        Range("B6").Font.Color = RGB(33, 115, 70) ' Verde
        Range("B6").Font.Bold = True
    End If
End Sub

Passo 3: Criando o Botão de Disparo

Desenhe um retângulo na célula D3 com o texto 🛡️ AUDITAR RISCO e atribua a macro AvaliarRiscoCarga.

✅ Resultado Esperado (Prática 1)

Ao clicar no botão com valor 12500, o sistema exibirá uma janela de erro crítico com o protocolo de escolta armada e escreverá “BLOQUEADO - AGUARDANDO ESCOLTA” em vermelho na célula B6.


🛠️ Prática Obrigatória 2: Diálogo de Confirmação com vbYesNo

Passo 1: Construindo a Rotina de Zeramento Seguro

No Módulo 1, adicione uma rotina para limpar as cotações, exigindo confirmação explícita para evitar perda acidental de dados:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Sub LimparCotacoesComSeguranca()
    Dim confirmacaoUsuario As VbMsgBoxResult
    
    ' Dispara caixa de confirmação com dois botões
    confirmacaoUsuario = MsgBox("Atenção! Isso apagará todos os valores digitados na cotação atual." & vbCrLf & _
                                "Deseja realmente prosseguir?", _
                                vbYesNo + vbQuestion + vbDefaultButton2, _
                                "Confirmação de Exclusão")
    
    ' Avalia a resposta do operador
    If confirmacaoUsuario = vbYes Then
        Range("B3:B6").ClearContents
        MsgBox "Campos restaurados com sucesso!", vbInformation, "Limpeza Concluída"
    Else
        MsgBox "Operação cancelada pelo usuário.", vbInformation, "Operação Mantida"
    End If
End Sub

Passo 2: Vinculando a um Botão Secundário

Desenhe o botão 🔄 RESETAR FORMULÁRIO na célula D5 e atribua a macro LimparCotacoesComSeguranca.


📤 Instruções de Entrega (Microsoft Teams)

Após finalizar as duas práticas obrigatórias:

  1. Salve seu arquivo como Pasta de Trabalho Habilitada para Macro (.xlsm).
  2. Nome: Atividade_18_SeuNome_SeuSobrenome.xlsm
  3. No Microsoft Teams, acesse a equipe da disciplina > Tarefas.
  4. Envie o arquivo na tarefa “Capítulo 18 - Lógica com VBA I” e clique em Entregar.

💡 Checkpoint de Lógica: O Diagrama de Decisão Estruturada

Veja como o código que você escreveu se traduz exatamente no clássico grafo de fluxo de algoritmos de engenharia:

graph TD
    Start([Início: AvaliarRiscoCarga]) --> Read[Ler Valor e Categoria da Célula]
    Read --> Test{Valor >= 10000 OU<br/>Categoria == 'ELETRÔNICOS'?}
    Test -- Verdadeiro (True) --> Critical[Exibe MsgBox vbCritical<br/>B6 = 'BLOQUEADO']
    Test -- Falso (False) --> Normal[Exibe MsgBox vbInformation<br/>B6 = 'LIBERADO']
    Critical --> Finish([Fim da Sub])
    Normal --> Finish
    
    style Test fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style Critical fill:#e74c3c,stroke:#fff,stroke-width:2px,color:#fff
    style Normal fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

🔥 Desafio de Fixação: Classificação com Select Case

Crie uma nova Sub ClassificarVeiculo() que leia o peso da carga em quilogramas (ex: célula B3) e utilize a estrutura Select Case para classificar automaticamente a categoria do veículo necessário na célula B4:

  • De 1 até 1.500 kg: "Veículo Urbano de Carga (VUC)"
  • De 1.501 até 6.000 kg: "Caminhão Toco"
  • De 6.001 até 14.000 kg: "Caminhão Truck"
  • Acima de 14.000 kg: "Carreta / Articulado"

🔑 Gabarito do Desafio

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub ClassificarVeiculo()
    Dim peso As Double
    Dim veiculoRecomendado As String
    
    peso = Range("B3").Value
    
    Select Case peso
        Case 1 To 1500
            veiculoRecomendado = "Veículo Urbano de Carga (VUC)"
        Case 1501 To 6000
            veiculoRecomendado = "Caminhão Toco"
        Case 6001 To 14000
            veiculoRecomendado = "Caminhão Truck"
        Case Is > 14000
            veiculoRecomendado = "Carreta / Articulado"
        Case Else
            veiculoRecomendado = "Peso Inválido"
    End Select
    
    Range("B4").Value = veiculoRecomendado
    MsgBox "Veículo alocado: " & veiculoRecomendado, vbInformation
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 foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. Qual a diferença entre um procedimento Sub e uma Function em VBA?
  2. Para que serve a palavra-chave Dim e o que é uma variável?
  3. Por que é considerada boa prática usar Option Explicit no início de um módulo?
  4. Cite pelo menos quatro tipos de dados VBA e para que cada um é usado.
  5. Qual a diferença entre a estrutura If…ElseIf…Else e a estrutura Select Case?
  6. O que faz a função MsgBox e como capturamos a resposta do usuário (ex: vbYes/vbNo)?
  7. Para que serve a função InputBox?
  8. Como funciona a depuração passo a passo usando a tecla F8?
  9. Escreva um pequeno trecho de código VBA que declare uma variável do tipo Double e atribua um valor a ela.
  10. Qual a diferença entre os operadores lógicos And, Or e Not em VBA?