Capítulo 15: Automação Orientada a Eventos de Planilha e Pasta de Trabalho
🎯 Objetivo da Aula
Nesta aula, você aprenderá o paradigma da Programação Orientada a Eventos (Event-Driven Programming) no VBA. Você entenderá como fazer o Excel reagir de forma autônoma a ações naturais do usuário — como abrir a pasta de trabalho (Workbook_Open), salvar o arquivo (Workbook_BeforeSave) ou editar o conteúdo de uma célula (Worksheet_Change). Além disso, aprenderá a dominar o argumento Target e a proteção crucial contra laços recursivos infinitos utilizando Application.EnableEvents = False.
Ao final desta aula, você terá transformado uma planilha comum no sistema autônomo e reativo de gestão de pátio da FastLog S.A.
🏢 Cenário Prático (FastLog S.A.)
Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: No pátio de manobras, os fiscais registram caminhões o dia todo. O processo dependia de o fiscal lembrar de clicar em botões para atualizar relatórios e carimbar horários. Frequentemente, o fiscal esquecia de clicar no botão “Registrar Horário”, gerando inconsistências no tempo de permanência de carretas (Demurrage). Além disso, fiscais salvavam a planilha com campos obrigatórios em branco antes de ir embora no final do turno, prejudicando a auditoria noturna.
Sua Missão: Implementar gatilhos reativos orientados a eventos:
- Ao abrir o arquivo, o Excel calcula e exibe automaticamente um resumo executivo com a quantidade de veículos retidos no pátio.
- Ao salvar o arquivo, o VBA valida se há registros incompletos e cancela o salvamento se houver pendências graves.
- Ao digitar a placa na coluna B, o evento
Worksheet_Changedetecta a digitação, formata a placa em maiúsculas e insere o carimbo de data/hora na coluna C instantaneamente, sem nenhum clique de botão!
🧠 Fundamentos: A Teoria Traduzida
1. Onde Moram os Códigos de Eventos?
Diferente das rotinas comuns que escrevemos em módulos padrão (Módulo1), os procedimentos de eventos possuem locais sagrados dentro do VBE:
- Eventos de Pasta de Trabalho: Devem ser digitados exclusivamente dentro do objeto
EstaPasta_de_trabalho(ThisWorkbook). - Eventos de Planilha: Devem ser digitados exclusivamente dentro do objeto da folha correspondente (ex:
Planilha1 (Operacao_Patio)).
flowchart TD
subgraph ARQ["Arquitetura Orientada a Eventos"]
EV_OPEN["⚡ Workbook_Open<br/>Disparado na inicialização do arquivo"]
EV_SAVE["💾 Workbook_BeforeSave<br/>Disparado antes de gravar no disco; pode cancelar o salvamento!"]
EV_CHANGE["✍️ Worksheet_Change (Target)<br/>Disparado a cada tecla Enter/edição de célula"]
end
EV_OPEN --> A1["Exibe resumo gerencial de boas-vindas"]
EV_SAVE --> A2["Valida campos obrigatórios (Cancel = True)"]
EV_CHANGE --> A3["Carimba data/hora e formata texto em tempo real"]
style ARQ fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
style EV_OPEN fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
style EV_SAVE fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
style EV_CHANGE fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style A1 fill:#2c3e50,stroke:#fff,stroke-width:2px,color:#fff
style A2 fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff
style A3 fill:#d35400,stroke:#fff,stroke-width:2px,color:#fff2. O Evento Worksheet_Change e o Argumento Target
Toda vez que uma célula é alterada pelo usuário, o Excel dispara o evento passando o parâmetro:
- O objeto
Targetrepresenta exatamente a célula (ou intervalo de células) que acabou de ser editada!
3. A Função Intersect
Para evitar que a macro dispare quando o usuário editar qualquer célula aleatória, usamos a função Intersect para verificar se a célula editada pertence à nossa coluna de interesse (por exemplo, Coluna B):
4. O Perigo da Recursão Infinita e EnableEvents
Se o seu código alterar uma célula dentro do evento Worksheet_Change, o próprio Excel interpretará essa mudança como um novo evento de alteração, disparando o evento novamente sobre si mesmo em um laço infinito mortal (Stack Overflow)!
Para impedir isso, sempre desative os eventos antes de alterar células e reative-os logo após:
📖 Exemplo Guiado: Passo a Passo no Laboratório
No computador do laboratório, acesse o VBE com Alt + F11.
Passo 1: Localizando o Objeto EstaPasta_de_trabalho
- Na Janela de Projetos (Project Explorer), localize a pasta Objetos do Microsoft Excel.
- Dê um duplo clique sobre o item:
EstaPasta_de_trabalho(ou ThisWorkbook). - Uma folha de código vazia será aberta.
🛠️ Prática Obrigatória 1: Eventos Globais de Inicialização e Salvamento
Implementaremos o resumo de abertura de turno e a trava de segurança que bloqueia o salvamento de cadastros incompletos.
Passo a Passo no Computador:
- No código de
EstaPasta_de_trabalho, digite os dois procedimentos de eventos globais: - Teste da Trava de Salvamento:
- Volte à planilha do Excel.
- Na linha 1, configure os cabeçalhos:
- A1:
ID| B1:Placa_Veiculo| C1:Data_Hora_Chegada| D1:Status
- A1:
- Na célula A2, digite
1, mas deixe a célula B2 vazia. - Pressione o atalho de salvar:
Ctrl + B(ou clique no disquete de salvar). - Observe o pop-up vermelho surgir bloqueando o salvamento e impedindo a gravação do arquivo incompleto!
✅ Resultado Esperado (Prática 1):
O Excel assume controle ativo sobre o processo de persistência, protegendo o banco de dados contra registros incompletos.
🛠️ Prática Obrigatória 2: O Evento Reativo Worksheet_Change com Target
Agora programaremos a planilha para reagir em tempo real: assim que o fiscal digitar uma placa na coluna B e teclar Enter, o VBA higienizará o texto e carimbará o horário imediatamente na coluna C.
Passo a Passo no Computador:
- No Project Explorer do VBE (
Alt + F11), dê um duplo clique sobre o item:Planilha1 (Planilha1)(ou o nome da sua primeira aba). - Na janela de código da planilha, digite o evento reativo:
- Teste Prático na Planilha:
- Alterne para o Excel.
- Clique na célula B2 e digite a placa em letras minúsculas:
" bra-2e19 "e aperte Enter. - Veja a mágica do VBA em tempo real:
- A placa se transforma instantaneamente em
"BRA2E19". - O ID
1surge automaticamente na coluna A. - A data e hora exatas com segundos são carimbadas na coluna C.
- O status
"EM PÁTIO / AGUARDANDO DOCA"surge em negrito na coluna D!
- A placa se transforma instantaneamente em
- Digite outra placa na célula B3 (ex:
"abc1234"). O mesmo comportamento autônomo se repete instantaneamente!
✅ Resultado Esperado (Prática 2):
A planilha responde com inteligência em tempo real a cada toque do operador, eliminando trabalho braçal de carimbo e digitação redundante.
📤 Instruções de Entrega (Microsoft Teams)
- Salve sua pasta de trabalho corporativa com a extensão
.xlsm. - Nomeie o arquivo como:
Atividade_15_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse a plataforma Microsoft Teams.
- Abra a tarefa: “VBA - Cap 15: Automação Orientada a Eventos”.
- Anexe sua pasta de trabalho e entregue.
💡 Checkpoint de Gestão & TI
A programação orientada a eventos aproxima o Excel do comportamento dos modernos sistemas de gestão empresarial em tempo real (Real-Time Operations). Ao capturar ações no momento exato em que ocorrem, o sistema garante que auditorias fiscais e tempos operacionais reflitam a verdade exata dos fatos, impedindo fraudes de preenchimento retroativo de horários de chegada.
🔥 Desafio de Fixação: Alerta Visual de Cargas com Retenção
Incremente o evento Worksheet_Change:
- Adicione uma checagem na coluna D: se o operador alterar o status para
"RETIDO SEFAZ", pinte a linha inteira daquela carga de amarelo com texto vermelho: - Teste digitando esse status e observe a formatação condicional reativa em tempo de execução!
📝 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.
- O que é a programação orientada a eventos e em que ela difere da execução de macros tradicionais acionadas por botões?
- Em qual local do VBE devemos inserir o procedimento de evento
Workbook_Open? - Para que serve o argumento
Cancelno eventoWorkbook_BeforeSavee como ele impede o salvamento da pasta? - O que o objeto
Targetrepresenta dentro do procedimento de eventoWorksheet_Change? - Qual é a finalidade da função
Intersect(Target, Range("B2:B100"))? - O que acontece se alterarmos o valor de uma célula dentro do evento
Worksheet_Changesem utilizarApplication.EnableEvents = False? - Explique como funciona o método
.Offset(linhas, colunas)e como ele foi usado para carimbar as colunas vizinhas. - Por que a verificação
If Target.Cells.CountLarge > 100 Then Exit Subé uma boa prática de segurança em eventos de planilha? - O que ocorre se uma macro apresentar erro e terminar a execução sem restaurar
Application.EnableEvents = True? - No Cenário Prático da FastLog, que problema operacional a inserção automática de data e hora em tempo real eliminou?