Capítulo 09: Vetores Unidimensionais Dinâmicos (ReDim, Preserve, UBound)
🎯 Objetivo da Aula
Nesta aula, você aprenderá a trabalhar com estruturas de dados na memória RAM utilizando Vetores Unidimensionais (Arrays) no VBA. Você entenderá a diferença entre vetores estáticos de tamanho fixo e vetores dinâmicos, dominará as instruções ReDim e ReDim Preserve, aprenderá a inspecionar os limites inferior e superior com as funções LBound e UBound, e liberará espaço na memória com o comando Erase.
Ao final desta aula, você terá desenvolvido o gerenciador de fila de ocorrências críticas do Centro de Controle Operacional (CCO) da FastLog S.A.
🏢 Cenário Prático (FastLog S.A.)
Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: O Centro de Controle Operacional (CCO) monitora mais de 1.200 carretas em trânsito rodoviário. Durante a madrugada, caminhões enfrentam imprevistos como panes mecânicas, sinistros ou retenções em postos fiscais da SEFAZ. A cada ocorrência registrada na estrada, o operador precisa incluir a placa e o status do veículo em uma lista de contingência prioritária. Um assistente tentava fazer isso inserindo linhas diretamente na planilha toda vez que um rádio chamava; as operações constantes de leitura e gravação em células (I/O em disco) deixavam a planilha lenta e travavam o atendimento do guincho.
Sua Missão: Construir o procedimento GerenciarFilaContingencia, que lê as ocorrências, armazena as placas em um vetor dinâmico na memória RAM utilizando ReDim Preserve, filtra os veículos que exigem socorro mecânico e despeja a fila consolidada na planilha com um único comando de alta performance.
🧠 Fundamentos: A Teoria Traduzida
1. Células da Planilha vs. Memória RAM
Acessar células do Excel (Range ou Cells) é uma das operações mais lentas da computação gráfica. Quando precisamos manipular centenas de valores, é infinitamente mais rápido carregar os dados para uma variável do tipo Vetor (Array) na memória RAM do computador:
flowchart TD
DISCO["📊 Planilha Excel (Células no Disco/Renderização)<br/>Lento: Leitura Célula por Célula"]
RAM["🧠 Vetor Dinâmico na Memória RAM<br/>Ultrarrápido: Milhões de operações/seg"]
DISCO -- "1. Carrega para a RAM" --> RAM
RAM -- "2. ReDim Preserve (Expande fila)" --> RAM
RAM -- "3. Despeja resultado final" --> DISCO
style DISCO fill:#217346,stroke:#fff,stroke-width:2px,color:#fff
style RAM fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff2. Vetores Estáticos vs. Vetores Dinâmicos
- Vetor Estático (Tamanho Fixo na Compilação):
- Vetor Dinâmico (Tamanho Definido em Execução):
3. A Importância da Palavra-Chave Preserve
Se você utilizar a instrução ReDim arr(20) em um vetor que já possuía dados, o VBA apaga todos os valores existentes e recria o vetor do zero!
Para expandir o vetor mantendo intactos os dados armazenados nas posições anteriores, você deve usar obrigatoriamente:
4. As Funções LBound e UBound
Para descobrir com segurança os limites de um vetor sem correr o risco de erro de estouro de índice (Subscript out of range), utilizamos:
LBound(vetor): Retorna o índice inicial (Lower Bound), geralmente 0 ou 1.UBound(vetor): Retorna o índice final (Upper Bound).
📖 Exemplo Guiado: Passo a Passo no Laboratório
No Excel, abra o VBE com Alt + F11.
Passo 1: Inserção do Módulo de Vetores
- No menu superior, clique em Inserir ➔ Módulo.
- Na janela de propriedades (
F4), renomeie o módulo para:modEstruturaVetores. - Confirme a presença de
Option Explicit.
Passo 2: Estruturação dos Dados de Ocorrências no Excel
Na primeira aba da planilha, configure os cabeçalhos na linha 1:
- A1:
ID_Ocorrencia| B1:Placa_Carreta| C1:Tipo_Incidente| D1:Localizacao| E1:Status - Preencha 5 registros de teste:
- Linha 2:
OC-101|ABC-1234|PANE MECANICA|BR-116 KM 84|CRITICO - Linha 3:
OC-102|XYZ-9988|PARADA REFEICAO|POSTO GRAAL|NORMAL - Linha 4:
OC-103|BRA-2E19|SUPERAQUECIMENTO|SP-330 KM 120|CRITICO - Linha 5:
OC-104|KTM-5544|RETENCAO FISCAL|POSTO FISCAL ITATIBA|RETIDO - Linha 6:
OC-105|JUR-8800|FURO DE PNEU|BR-101 KM 310|CRITICO
- Linha 2:
🛠️ Prática Obrigatória 1: Vetor Dinâmico com ReDim Preserve
Construiremos o algoritmo que varre os registros de ocorrência, identifica apenas os veículos com incidentes mecânicos críticos e os armazena dinamicamente na memória RAM com ReDim Preserve.
Passo a Passo no Computador:
- No módulo
modEstruturaVetores, digite a rotina: - Posicione o cursor dentro da macro e execute com
F5. - Veja surgir a nova aba vermelha
"Fila_Socorro"contendo perfeitamente os 3 veículos em estado crítico:- Posição 1:
ABC-1234 - PANE MECANICA (BR-116 KM 84) - Posição 2:
BRA-2E19 - SUPERAQUECIMENTO (SP-330 KM 120) - Posição 3:
JUR-8800 - FURO DE PNEU (BR-101 KM 310)
- Posição 1:
✅ Resultado Esperado (Prática 1):
A lista prioritária é filtrada e montada na memória RAM através do vetor dinâmico e despejada organizadamente na nova aba operacional.
🛠️ Prática Obrigatória 2: Busca Linear em Memória com Limpeza via Erase
Agora implementaremos uma rotina de busca de placas no vetor de memória, demonstrando a velocidade do processamento em RAM antes de desalocar os recursos com a instrução Erase.
Passo a Passo no Computador:
- No mesmo módulo, insira o procedimento de busca:
- Execute com
F5:- Digite a placa
"BRA-2E19". - O sistema busca instantaneamente na memória RAM e notifica que a placa está na posição 3 (linha 4 da planilha).
- Teste com uma placa inexistente (ex:
"XYZ-0000") e verifique a mensagem de aviso.
- Digite a placa
✅ Resultado Esperado (Prática 2):
A consulta opera em memória RAM sem realizar leituras repetidas na planilha física, liberando a memória ao final com o comando Erase.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_09_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse a plataforma Microsoft Teams.
- Abra a tarefa: “VBA - Cap 09: Vetores Unidimensionais Dinâmicos”.
- Anexe a pasta de trabalho e confirme o envio.
💡 Checkpoint de Gestão & TI
Em programação profissional, a eficiência algorítmica é mensurada pela notação Big-O. Consultas e filtros executados diretamente contra a interface gráfica da planilha possuem custo elevado de acesso a hardware e renderização de vídeo. Ao transferir conjuntos de dados para arrays em memória RAM, o código passa a operar na velocidade do barramento da CPU (nanossegundos), viabilizando sistemas que processam centenas de milhares de linhas sem travamento.
🔥 Desafio de Fixação: Estatística de Retenções Fiscais
Crie uma macro complementar chamada TotalizarRetencoesFiscais:
- Use um vetor dinâmico
arrRetidos() As String. - Varra a planilha e armazene apenas os caminhões cujo status seja
"RETIDO". - Se houver veículos retidos, exiba com
MsgBoxa quantidade total utilizandoUBound(arrRetidos)e liste as placas na mensagem separadas por quebra de linha (vbCrLf).
📝 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 é um Vetor (Array) no VBA e por que manipular dados em vetores na memória RAM é mais rápido do que manipulá-los nas células da planilha?
- Qual é a diferença sintática entre a declaração de um vetor estático e a de um vetor dinâmico?
- Para que serve a instrução
ReDimem um vetor dinâmico? - O que acontece com os dados anteriormente armazenados em um array se você executar
ReDimsem a palavra-chavePreserve? - Qual é a função exata do comando
UBound(meuVetor)? - O que o comando
LBound(meuVetor)retorna e qual é o seu valor habitual? - Qual é a finalidade do comando
Erasee quando ele deve ser executado no ciclo de vida de uma macro? - No algoritmo de busca linear em memória, por que utilizamos a instrução
Exit Forao localizar o elemento procurado? - Como a função
ReDim Preserve arrFilaSocorro(1 To intQtdCritica)permitiu construir uma fila de tamanho desconhecido a priori? - O que significa o erro de tempo de execução “Subscript out of range” (Subscrito fora do intervalo) e como preveni-lo ao trabalhar com vetores?