Capítulo 14: Controles Avançados: Listas Suspensas (ComboBox) e Painéis (ListBox)
🎯 Objetivo da Aula
Nesta aula, você aprenderá a enriquecer seus formulários gráficos corporativos dominando os controles avançados da biblioteca MSForms: a caixa de combinação suspensa (ComboBox), o painel de listagem tabular multicolunas (ListBox), as caixas de seleção (CheckBox) e os botões de opção exclusiva (OptionButton). Você compreenderá a diferença entre popular listas via método .AddItem e via atribuição direta de matrizes com a propriedade .List.
Ao final desta aula, você terá construído o Console Interativo de Despacho de Cargas da FastLog S.A.
🏢 Cenário Prático (FastLog S.A.)
Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: No terminal de cargas, o assistente de expedição despachava dezenas de veículos por hora. O antigo formulário possuía apenas caixas de texto comuns; com isso, o operador frequentemente digitava o nome da filial com erro ortográfico ("Curitiba", "CWB", "Curitiba - PR"), o que quebrava os relatórios gerenciais da matriz. Além disso, o operador precisava alternar constantemente entre a tela do formulário e a planilha para conferir quais viagens já haviam sido expedidas no turno, gerando perda de tempo e erros de duplicidade de despacho.
Sua Missão: Desenvolver o formulário frmConsoleDespacho, contendo uma lista suspensa com auto-completar (ComboBox) para as filiais homologadas, botões de rádio para a modalidade de transporte (Frota Própria vs Terceirizado) e uma grade interna de 4 colunas (ListBox) que exibe na própria tela os despachos em tempo real.
🧠 Fundamentos: A Teoria Traduzida
1. Controles de Seleção Múltipla e Exclusiva
flowchart TD
subgraph CONTROLES["Biblioteca de Controles Avançados"]
CB["🔽 ComboBox (Lista Suspensa)<br/>Impede digitação livre; padroniza filiais"]
LB["📑 ListBox Multicolunas<br/>Visualizador de tabelas e relatórios dentro da tela"]
OB["🔘 OptionButtons em Grupo<br/>Escolha ÚNICA: Frota Própria OU Agregado"]
CK["☑️ CheckBox<br/>Opções binárias independentes: Seguro Especial Sim/Não"]
end
style CONTROLES fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
style CB fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
style LB fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style OB fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
style CK fill:#d35400,stroke:#fff,stroke-width:2px,color:#fff2. Formas de Popular um ComboBox
Existem duas maneiras fundamentais de alimentar uma lista suspensa:
- Método
.AddItem(Manual ou via laço): - Propriedade
.List(Carga instantânea em bloco via matriz):
3. Anatomia do ListBox Multicolunas
Para exibir uma grade tabular dentro do formulário, configuramos três propriedades essenciais do ListBox:
.ColumnCount = 4: Define a quantidade de colunas visíveis..ColumnWidths = "50 pt; 80 pt; 120 pt; 70 pt": Define a largura de cada coluna..List = varMatriz: Alimenta a grade inteira a partir de uma matriz de memória.
📖 Exemplo Guiado: Passo a Passo no Laboratório
No computador do laboratório, acesse o VBE com Alt + F11.
Passo 1: Inserção do Formulário de Despacho
- No menu superior, clique em Inserir ➔ UserForm.
- Na janela de propriedades (
F4), configure o formulário:(Name):frmConsoleDespachoCaption:FastLog S.A. - Console Integrado de ExpediçãoWidth:520Height:420
🛠️ Prática Obrigatória 1: Desenho e Configuração dos Controles Avançados
Desenharemos a interface avançada com listas, caixas de seleção e botões de opção.
Passo a Passo no Computador:
- Caixa de Combinação (
ComboBox):- Desenhe um rótulo com
Caption="Filial de Destino:"(Top: 20, Left: 20). - Desenhe um
ComboBoxao lado:(Name)=cboDestino| Top: 18, Left: 140, Width: 180.
- Desenhe um rótulo com
- Moldura (Frame) com Botões de Opção (OptionButtons):
- Desenhe um
Frame:(Name)=fraTipoFrota|Caption="Modalidade de Frota"| Top: 55, Left: 20, Width: 300, Height: 50. - Dentro do Frame, desenhe dois
OptionButtons:optPropria:Caption="Frota Própria"|Value = TrueoptTerceirizado:Caption="Terceirizado Agregado"
- Desenhe um
- Caixa de Seleção (
CheckBox):- Desenhe um
CheckBox:(Name)=chkSeguroEspecial|Caption="Carga com Cobertura de Seguro Especial (Ad Valorem)"| Top: 115, Left: 20, Width: 320.
- Desenhe um
- Campo de Valor do Frete (
TextBox):- Rótulo:
"Valor Frete (R$):"(Top: 145, Left: 20). TextBox:(Name)=txtValorFrete| Top: 143, Left: 140, Width: 100.
- Rótulo:
- Botão de Despacho:
CommandButton:(Name)=cmdDespachar|Caption="🚀 Despachar Carga"| Top: 140, Left: 260, Width: 140, Height: 30.
- Painel de Despachos Recentes (
ListBox):- Rótulo:
"HISTÓRICO RECENTE DE EXPEDIÇÕES:"| Top: 185, Left: 20, Font Bold = True. ListBox:(Name)=lstHistorico| Top: 205, Left: 20, Width: 465, Height: 150.- Na janela de propriedades de
lstHistorico:ColumnCount=4ColumnWidths=50 pt; 120 pt; 110 pt; 90 pt
- Rótulo:
🛠️ Prática Obrigatória 2: Programação dos Eventos e Sincronização da ListBox
Codificaremos o carregamento automático da lista suspensa, o disparo do despacho e a atualização imediata da grade de relatórios na tela.
Passo a Passo no Computador:
Dê um duplo clique no fundo do formulário para abrir o código de
UserForm_Initialize.Digite o procedimento de inicialização e a sub-rotina auxiliar de sincronização da ListBox:
Criação da Macro de Chamada no Módulo Padrão:
- Em
modProcessoExpedicao, crie:
- Em
Preparação da Planilha e Teste:
- Na Planilha 1, certifique-se de que a linha 1 possui os cabeçalhos:
- A1:
ID_Despacho| B1:Destino| C1:Modalidade| D1:Valor_Frete| E1:Seguro| F1:Data_Hora
- A1:
- Execute a macro
AbrirConsoleDespacho(Alt + F8). - A janela gráfica surgirá com a lista de filiais pré-carregada na ComboBox.
- Selecione
"Curitiba - Filial (PR)", marque"Terceirizado Agregado", digite o frete4500e clique em 🚀 Despachar Carga. - Veja que no mesmo milissegundo a nova viagem aparece listada no painel
ListBoxdentro do próprio formulário!
- Na Planilha 1, certifique-se de que a linha 1 possui os cabeçalhos:
✅ Resultado Esperado (Prática 2):
O formulário opera como um dashboard executivo interativo em tempo real, eliminando qualquer necessidade de fechar a janela para olhar a planilha.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_VBA_SeuNome_SeuSobrenome.xlsm. - Acesse o Microsoft Teams na sua turma.
- Abra a tarefa: “VBA - Cap 14: ComboBox e ListBox Multicolunas”.
- Anexe a pasta de trabalho e confirme a entrega.
💡 Checkpoint de Gestão & TI
No gerenciamento de transporte rodoviário (TMS - Transportation Management System), o uso de listas restritas (ComboBox) elimina erros de roteirização. Se um operador digitar manualmente “RJ” e o ERP esperar “Rio de Janeiro”, a emissão da nota fiscal eletrônica trava no Ministério da Fazenda. Além disso, a exibição de históricos em ListBox reduz duplicidade de lançamentos em até 85%, aumentando a confiança dos gestores nas operações diárias.
🔥 Desafio de Fixação: Totalizador de Fretes na Tela
Adicione um rótulo de rodapé no formulário chamado lblTotalDespachado:
- Toda vez que a rotina
AtualizarGradeHistoricofor executada, percorra as linhas daListBoxsomando a coluna 4 (Valor do Frete): - Teste adicionando novos fretes e veja o total financeiro acumulado atualizar sozinho no formulário!
📝 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.
- Qual é a finalidade do controle
ComboBoxe por que ele previne falhas de digitação em rotinas logísticas? - Como funciona o método
.AddItempara adicionar elementos a uma lista suspensa no VBA? - O que o comando
cboDestino.Clearrealiza e por que ele é executado antes de recarregar a lista? - Em que situação a propriedade
.Listé preferível ao método.AddItemao trabalhar comListBox? - Quais são as três propriedades essenciais que devem ser configuradas para criar uma
ListBoxcom múltiplas colunas? - Qual é a principal diferença conceitual de uso entre um
OptionButtone umCheckBox? - Por que agrupamos
OptionButtonsdentro de um controle do tipoFrame? - O que a propriedade
ListCountde umListBoxretorna? - Como recuperamos o valor de uma célula específica dentro de uma
ListBoxatravés de índices (linha, coluna)? - No Desafio de Fixação, de que forma o laço somou os valores monetários diretamente a partir da lista na tela?