Capítulo 08: Coleções de Objetos (For Each) e Otimização de Performance
🎯 Objetivo da Aula
Nesta aula, você aprenderá a percorrer coleções inteiras de objetos no Excel utilizando o poderoso laço For Each...Next. Além disso, dominará as técnicas profissionais de otimização de desempenho corporativo, aprendendo a desativar o consumo inútil de processamento com o “quarteto de ouro” do VBA (ScreenUpdating, Calculation, EnableEvents, DisplayAlerts) e a cronometrar a velocidade de execução com a função Timer.
Ao final desta aula, você será capaz de aplicar padronizações visuais e bloqueios de segurança em dezenas de planilhas simultaneamente em menos de 1 segundo.
🏢 Cenário Prático (FastLog S.A.)
Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: Toda virada de mês fiscal, a equipe de controladoria precisa inspecionar a pasta de trabalho de fechamento anual, contendo 12 abas (uma para cada mês do ano) mais as abas de consolidação. Para cada aba, o assistente precisava:
- Desbloquear a planilha.
- Inserir a data de homologação na célula
H1. - Ajustar a largura de todas as colunas (
AutoFit). - Reaplicar a proteção com a senha oficial da empresa.
O estagiário anterior escreveu um script que usava comandosSelecteActivateaba por aba sem desativar a atualização de tela. O Excel piscava descontroladamente por quase 1 minuto e, se houvesse fórmulas pesadas de PROCV, o computador travava por completo.
Sua Missão: Desenvolver o procedimentoPadronizarPastaTrabalho, utilizandoFor Each ws In Worksheetse o quarteto de alta performance, executando a tarefa completa em menos de 0,3 segundo.
🧠 Fundamentos: A Teoria Traduzida
1. O que são Coleções e o Laço For Each?
No VBA, uma Coleção (Collection) é um grupo ordenado de objetos do mesmo tipo mantidos pelo Excel. Por exemplo:
Worksheets: Todos os objetos de planilha da pasta.Workbooks: Todos os arquivos abertos no Excel.Range("A1:C10"): Coleção de células dentro de um intervalo.
Enquanto o laço For i = 1 To N exige controlar um contador numérico, o For Each extrai diretamente o próprio objeto a cada ciclo:
flowchart TD
COLL["📁 Coleção ThisWorkbook.Worksheets<br/>[Jan, Fev, Mar, ..., Dez]"] --> FE{"For Each ws In Worksheets"}
FE --> W1["Aba 'Janeiro': AutoFit + Proteger"]
FE --> W2["Aba 'Fevereiro': AutoFit + Proteger"]
FE --> W3["Aba 'Março': AutoFit + Proteger"]
FE --> WN["... Repete automaticamente até a última aba!"]
style COLL fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
style FE fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
style W1 fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style W2 fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style W3 fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style WN fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff2. O Quarteto de Alta Performance do VBA
Quando uma macro roda, o Excel tenta redesenhar cada pixel na tela, recalcular todas as fórmulas da pasta e disparar alertas do sistema. Desativar esses 4 itens antes do laço e reativá-los no final transforma rotinas lentas em execuções quase instantâneas:
Propriedade de Application | Estado Normal | Ao Iniciar a Macro | O que ela faz? |
|---|---|---|---|
.ScreenUpdating | True | False | Congela a atualização visual da tela, evitando redesenhos lentos. |
.Calculation | xlCalculationAutomatic | xlCalculationManual | Impede que o Excel recalcule todas as fórmulas a cada célula alterada. |
.EnableEvents | True | False | Evita disparar eventos acidentais em cadeia (Worksheet_Change). |
.DisplayAlerts | True | False | Suprime confirmações pop-up do Excel (ex: “Deseja excluir a planilha?”). |
📖 Exemplo Guiado: Passo a Passo no Laboratório
No computador do laboratório, acesse o VBE com Alt + F11.
Passo 1: Inserção do Módulo de Performance
- No menu superior, clique em Inserir ➔ Módulo.
- Na janela de propriedades (
F4), renomeie o módulo para:modOtimizacao. - Confirme a linha
Option Explicit.
Passo 2: Criação de Múltiplas Abas para Teste
Para testar o poder do For Each, precisamos de várias abas na pasta de trabalho:
- No Excel, clique no botão
+no rodapé da planilha e crie 5 abas com nomes quaisquer (ex:Aba1,Aba2,Aba3,Aba4,Aba5).
🛠️ Prática Obrigatória 1: Padronização em Massa com For Each
Criaremos a rotina que percorre todas as abas da pasta de trabalho, inserindo o carimbo institucional da FastLog e travando as planilhas com senha.
Passo a Passo no Computador:
- No módulo
modOtimizacao, digite o seguinte código: - Posicione o cursor no procedimento e tecle
F5. - Clique em cada uma das abas no rodapé do Excel:
- Observe que todas elas receberam o título azul escuro com seus respectivos nomes na célula A1 e foram travadas contra edição!
✅ Resultado Esperado (Prática 1):
Todas as abas da pasta de trabalho são formatadas e protegidas em lote de forma uniforme e sem repetição de código.
🛠️ Prática Obrigatória 2: O Quarteto de Otimização e Benchmark com Timer
Agora implementaremos o modelo de arquitetura de alta velocidade com cronometragem em milissegundos utilizando a função Timer.
Passo a Passo no Computador:
- No mesmo módulo, insira o procedimento corporativo otimizado:
- Execute com
F5:- Perceba que a tela permanece perfeitamente estável (sem tremer nem piscar).
- Uma caixa surge em fração de segundo indicando que centenas de células foram preenchidas, formatadas e protegidas em menos de 0,5 segundo!
✅ Resultado Esperado (Prática 2):
A macro executa uma carga massiva de trabalho sem oscilação visual na interface, registrando o tempo de processamento preciso no pop-up.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse a plataforma Microsoft Teams.
- Abra a tarefa: “VBA - Cap 08: For Each e Otimização de Performance”.
- Anexe sua pasta de trabalho e entregue.
💡 Checkpoint de Gestão & TI
No ambiente corporativo, a percepção de qualidade de um software não reside apenas em ele funcionar, mas em sua velocidade e estabilidade. Um script em VBA que faz a tela piscar repetidamente passa uma sensação de amadorismo e lentidão. Ao encapsular suas rotinas com o quarteto de otimização, seu código ganha o padrão de acabamento dos softwares comerciais de RPA (Robotic Process Automation).
🔥 Desafio de Fixação: Desproteção Global Interativa
Crie uma macro complementar de manutenção chamada DesprotegerTodasAsAbas:
- Use
InputBoxcom o título"Segurança FastLog"para solicitar a senha ao operador. - Se a senha digitada for diferente de
"FastLog2026", exibaMsgBox "Senha Incorreta!"com ícone de erro e encerre a rotina. - Se a senha estiver correta, percorra todas as abas com
For Each ws In Worksheetse executews.Unprotect Password:="FastLog2026". - Exiba uma notificação avisando que as planilhas estão liberadas para ediçã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 é uma Coleção (Collection) no VBA e como ela se diferencia de uma variável comum?
- Explique a sintaxe e a dinâmica de funcionamento do laço
For Each...Next. - Qual é a principal vantagem de usar
For Each ws In Worksheetsem vez de um laçoFor i = 1 To Worksheets.Count? - Quais são as quatro propriedades do objeto
Applicationque compõem o chamado “quarteto de ouro” de performance do VBA? - O que a propriedade
Application.ScreenUpdating = Falseevita durante a execução de uma macro? - Por que alterar
Application.CalculationparaxlCalculationManualacelera significativamente pastas com fórmulas pesadas? - O que acontece se uma macro falhar no meio e você não restaurar
Application.ScreenUpdating = True? - Qual função nativa do VBA é utilizada para capturar o tempo decorrido em frações de segundos?
- Como a instrução
ws.Protect Password:="Segredo"atua para proteger as células da planilha contra edições indevidas? - No Desafio de Fixação, de que forma o uso da estrutura condicional protegeu a empresa contra acessos não autorizados?