Introdução aos UserForms
Deslize para mostrar o menu
Os UserForms têm funcionalidade limitada ou ausente no Excel para Mac — o IDE do VBA no Mac não oferece suporte completo ao design de UserForms em muitas versões, o que pode causar exatamente esse tipo de comportamento inexplicável.
MsgBox e InputBox atendem perguntas simples de sim/não e respostas de uma linha, mas adicionar um cliente realmente exige vários campos ao mesmo tempo — nome da empresa, contato, cidade, status. É para isso que serve um UserForm: uma pequena janela personalizada com seus próprios rótulos, caixas de texto, listas suspensas e botões, criada dentro do VBE e controlada inteiramente pelo seu código.
Criando um Formulário
No VBE, clique com o botão direito no seu projeto no Project Explorer e escolha Inserir → UserForm. Uma superfície de design em branco aparecerá, junto com uma Caixa de Ferramentas flutuante com controles que você pode arrastar para ela.
Labels, TextBoxes, ComboBoxes e Botões
Cada controle que você arrasta para o formulário recebe um nome padrão como TextBox1 ou CommandButton1 — funcional, mas sem significado quando o formulário possui seis ou sete controles. O hábito mais importante nesta seção está visível na janela de Propriedades: renomear cada controle imediatamente após adicioná-lo, usando um prefixo curto que identifica seu tipo (txt para TextBox, cbo para ComboBox, cmd para CommandButton, opt para OptionButton, chk para CheckBox, lst para ListBox) seguido de um nome descritivo. txtCompanyName é claro no código mesmo após três semanas; TextBox1 não é.
Labels são legendas de texto simples e não interativas ("Company Name:") — o usuário pode vê-las, mas nunca digita ou clica nelas. TextBoxes são onde o texto livre é digitado. ComboBoxes apresentam uma lista suspensa de opções, que é exatamente para isso que cboCity e cboStatus servem — restringir City e Status a uma lista conhecida, em vez de permitir que o usuário digite livremente "chicago", "Chicago,IL" e "CHI" para a mesma coisa em diferentes registros.
Escrevendo Código por Trás do Formulário
Clique duas vezes em qualquer controle na superfície de design para ir diretamente ao seu código — o VBA cria automaticamente um procedimento de evento chamado ControlName_EventName, e ao digitar código dentro dele, esse código será executado sempre que esse evento específico ocorrer para aquele controle específico. O evento padrão de um botão é Click:
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
UserForm_Initialize é um procedimento de evento especial que dispara automaticamente no momento em que o formulário é carregado — antes do usuário ver qualquer coisa — o que faz dele o local ideal para preencher ComboBoxes com .AddItem ao invés de digitar as opções manualmente na janela de Propriedades, especialmente quando essas opções podem mudar ou vir de uma planilha. Unload Me dentro de cmdCancel_Click fecha completamente o formulário; Me sempre se refere ao formulário em que o código está sendo executado, então essa linha funciona sem modificações, independentemente do nome que você der ao formulário depois.
Exemplo Prático: Salvando um Novo Cliente
Este é o procedimento por trás do botão Salvar — o que realmente grava uma nova linha em tblCustomers:
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
- O comando
tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")acessa diretamente do formulário até a pasta de trabalho — um UserForm é apenas outro trecho de código, então tudo sobre ListObjects se aplica a ele sem alterações; tbl.ListRows.Addadiciona uma nova linha genuína dentro dos limites da Tabela, em vez de escrever manualmente após a última célula usada;txtCompanyName.Value,cboCity.Valuee os demais leem o que o usuário digitou ou selecionou naquele controle específico —.Valueé comum à maioria dos tipos de controle, por isso o mesmo padrão funciona tanto para TextBoxes quanto para ComboBoxes;- A linha que gera o ID do Cliente é um exemplo simplificado para este exercício — a geração real de IDs precisaria verificar lacunas ou IDs reutilizados, o que essa linha não faz;
- Unload Me ao final fecha o formulário somente depois que a linha foi gravada — fechar antes tornaria
txtCompanyName.Valuee os outros valores dos controles inacessíveis, já que os controles deixam de existir após o formulário ser descarregado.
O rótulo "Company Name" do formulário é apenas uma legenda mais amigável para a coluna Customer da tabela — o código grava txtCompanyName.Value nessa coluna independentemente do texto do Label, pois apenas o nome do TextBox importa para o VBA, não sua legenda exibida na tela.
Customer ID não está no formulário porque é gerado automaticamente pelo código ("C0" & (tbl.ListRows.Count + 100)), em vez de ser digitado pelo usuário — isso reflete como sistemas reais numeram automaticamente novos registros em vez de depender de uma pessoa para escolher um ID exclusivo.
Tarefa
- Insira um novo UserForm, nomeie-o como
frmAddCustomere adicione três TextBoxes (txtCompanyName,txtContact,txtEmail) e dois ComboBoxes (cboCity, cboStatus), cada um com um Label correspondente. - Adicione dois CommandButtons,
cmdSaveecmdCancel, e escreva os procedimentosUserForm_InitializeecmdCancel_Clickexatamente como mostrado. - Escreva
cmdSave_Clickconforme mostrado e, em seguida, adicione um botão temporário em outro local da planilha com o códigofrmAddCustomer.Showpara testar a abertura do formulário. - Preencha o formulário para um sexto cliente fictício e clique em Salvar — confirme que uma nova linha aparece em tblCustomers com os valores inseridos.
1. Construção do formulário
- Inserir → UserForm no VBE, depois renomeie pelo campo
(Name)na janela de Propriedades parafrmAddCustomer— não pelo campo Caption, que só altera o texto da barra de título. - Arraste um par de Label + TextBox para cada um dos campos Nome da Empresa, Contato e Email; um par de Label + ComboBox para Cidade e Status.
- Renomeie cada controle imediatamente após adicioná-lo — este é o hábito enfatizado no capítulo. Labels não precisam de nomes amigáveis para código, pois nunca são referenciadas no código, mas todo TextBox/ComboBox/Botão sim.
2. UserForm_Initialize e cmdCancel_Click
- Dê um duplo clique no fundo em branco do formulário (não em um controle) para acessar
UserForm_Initialize— dar duplo clique emcmdCancelleva direto paracmdCancel_Click. - Ambos os procedimentos foram fornecidos exatamente no capítulo — digite-os sem alterações.
3. Testando com um botão temporário
- Este botão não precisa estar no formulário — coloque-o em qualquer planilha via Desenvolvedor → Inserir → Botão (Controle de Formulário), ou apenas execute um
Subde uma linha pelo VBE ao invés de adicionar um botão na planilha. frmAddCustomer.Showé todo o código necessário para exibir o formulário.
4. Testando um salvamento completo
- Preencha todos os campos e escolha valores em ambos os menus suspensos antes de clicar em Salvar — uma seleção vazia no ComboBox escreveria uma célula em branco.
- Verifique
tblCustomersdepois para uma nova linha com um ID no estiloC00x.
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Para testar, execute isto de qualquer módulo comum (não no próprio código do UserForm):
Sub ShowAddCustomerForm()
frmAddCustomer.Show
End Sub
Pressione F5 com o cursor dentro de ShowAddCustomerForm — o formulário deve abrir, e ao preenchê-lo e clicar em Salvar, uma nova linha será adicionada a tblCustomers.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Introdução aos UserForms
Os UserForms têm funcionalidade limitada ou ausente no Excel para Mac — o IDE do VBA no Mac não oferece suporte completo ao design de UserForms em muitas versões, o que pode causar exatamente esse tipo de comportamento inexplicável.
MsgBox e InputBox atendem perguntas simples de sim/não e respostas de uma linha, mas adicionar um cliente realmente exige vários campos ao mesmo tempo — nome da empresa, contato, cidade, status. É para isso que serve um UserForm: uma pequena janela personalizada com seus próprios rótulos, caixas de texto, listas suspensas e botões, criada dentro do VBE e controlada inteiramente pelo seu código.
Criando um Formulário
No VBE, clique com o botão direito no seu projeto no Project Explorer e escolha Inserir → UserForm. Uma superfície de design em branco aparecerá, junto com uma Caixa de Ferramentas flutuante com controles que você pode arrastar para ela.
Labels, TextBoxes, ComboBoxes e Botões
Cada controle que você arrasta para o formulário recebe um nome padrão como TextBox1 ou CommandButton1 — funcional, mas sem significado quando o formulário possui seis ou sete controles. O hábito mais importante nesta seção está visível na janela de Propriedades: renomear cada controle imediatamente após adicioná-lo, usando um prefixo curto que identifica seu tipo (txt para TextBox, cbo para ComboBox, cmd para CommandButton, opt para OptionButton, chk para CheckBox, lst para ListBox) seguido de um nome descritivo. txtCompanyName é claro no código mesmo após três semanas; TextBox1 não é.
Labels são legendas de texto simples e não interativas ("Company Name:") — o usuário pode vê-las, mas nunca digita ou clica nelas. TextBoxes são onde o texto livre é digitado. ComboBoxes apresentam uma lista suspensa de opções, que é exatamente para isso que cboCity e cboStatus servem — restringir City e Status a uma lista conhecida, em vez de permitir que o usuário digite livremente "chicago", "Chicago,IL" e "CHI" para a mesma coisa em diferentes registros.
Escrevendo Código por Trás do Formulário
Clique duas vezes em qualquer controle na superfície de design para ir diretamente ao seu código — o VBA cria automaticamente um procedimento de evento chamado ControlName_EventName, e ao digitar código dentro dele, esse código será executado sempre que esse evento específico ocorrer para aquele controle específico. O evento padrão de um botão é Click:
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
UserForm_Initialize é um procedimento de evento especial que dispara automaticamente no momento em que o formulário é carregado — antes do usuário ver qualquer coisa — o que faz dele o local ideal para preencher ComboBoxes com .AddItem ao invés de digitar as opções manualmente na janela de Propriedades, especialmente quando essas opções podem mudar ou vir de uma planilha. Unload Me dentro de cmdCancel_Click fecha completamente o formulário; Me sempre se refere ao formulário em que o código está sendo executado, então essa linha funciona sem modificações, independentemente do nome que você der ao formulário depois.
Exemplo Prático: Salvando um Novo Cliente
Este é o procedimento por trás do botão Salvar — o que realmente grava uma nova linha em tblCustomers:
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
- O comando
tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")acessa diretamente do formulário até a pasta de trabalho — um UserForm é apenas outro trecho de código, então tudo sobre ListObjects se aplica a ele sem alterações; tbl.ListRows.Addadiciona uma nova linha genuína dentro dos limites da Tabela, em vez de escrever manualmente após a última célula usada;txtCompanyName.Value,cboCity.Valuee os demais leem o que o usuário digitou ou selecionou naquele controle específico —.Valueé comum à maioria dos tipos de controle, por isso o mesmo padrão funciona tanto para TextBoxes quanto para ComboBoxes;- A linha que gera o ID do Cliente é um exemplo simplificado para este exercício — a geração real de IDs precisaria verificar lacunas ou IDs reutilizados, o que essa linha não faz;
- Unload Me ao final fecha o formulário somente depois que a linha foi gravada — fechar antes tornaria
txtCompanyName.Valuee os outros valores dos controles inacessíveis, já que os controles deixam de existir após o formulário ser descarregado.
O rótulo "Company Name" do formulário é apenas uma legenda mais amigável para a coluna Customer da tabela — o código grava txtCompanyName.Value nessa coluna independentemente do texto do Label, pois apenas o nome do TextBox importa para o VBA, não sua legenda exibida na tela.
Customer ID não está no formulário porque é gerado automaticamente pelo código ("C0" & (tbl.ListRows.Count + 100)), em vez de ser digitado pelo usuário — isso reflete como sistemas reais numeram automaticamente novos registros em vez de depender de uma pessoa para escolher um ID exclusivo.
Tarefa
- Insira um novo UserForm, nomeie-o como
frmAddCustomere adicione três TextBoxes (txtCompanyName,txtContact,txtEmail) e dois ComboBoxes (cboCity, cboStatus), cada um com um Label correspondente. - Adicione dois CommandButtons,
cmdSaveecmdCancel, e escreva os procedimentosUserForm_InitializeecmdCancel_Clickexatamente como mostrado. - Escreva
cmdSave_Clickconforme mostrado e, em seguida, adicione um botão temporário em outro local da planilha com o códigofrmAddCustomer.Showpara testar a abertura do formulário. - Preencha o formulário para um sexto cliente fictício e clique em Salvar — confirme que uma nova linha aparece em tblCustomers com os valores inseridos.
1. Construção do formulário
- Inserir → UserForm no VBE, depois renomeie pelo campo
(Name)na janela de Propriedades parafrmAddCustomer— não pelo campo Caption, que só altera o texto da barra de título. - Arraste um par de Label + TextBox para cada um dos campos Nome da Empresa, Contato e Email; um par de Label + ComboBox para Cidade e Status.
- Renomeie cada controle imediatamente após adicioná-lo — este é o hábito enfatizado no capítulo. Labels não precisam de nomes amigáveis para código, pois nunca são referenciadas no código, mas todo TextBox/ComboBox/Botão sim.
2. UserForm_Initialize e cmdCancel_Click
- Dê um duplo clique no fundo em branco do formulário (não em um controle) para acessar
UserForm_Initialize— dar duplo clique emcmdCancelleva direto paracmdCancel_Click. - Ambos os procedimentos foram fornecidos exatamente no capítulo — digite-os sem alterações.
3. Testando com um botão temporário
- Este botão não precisa estar no formulário — coloque-o em qualquer planilha via Desenvolvedor → Inserir → Botão (Controle de Formulário), ou apenas execute um
Subde uma linha pelo VBE ao invés de adicionar um botão na planilha. frmAddCustomer.Showé todo o código necessário para exibir o formulário.
4. Testando um salvamento completo
- Preencha todos os campos e escolha valores em ambos os menus suspensos antes de clicar em Salvar — uma seleção vazia no ComboBox escreveria uma célula em branco.
- Verifique
tblCustomersdepois para uma nova linha com um ID no estiloC00x.
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Para testar, execute isto de qualquer módulo comum (não no próprio código do UserForm):
Sub ShowAddCustomerForm()
frmAddCustomer.Show
End Sub
Pressione F5 com o cursor dentro de ShowAddCustomerForm — o formulário deve abrir, e ao preenchê-lo e clicar em Salvar, uma nova linha será adicionada a tblCustomers.
Obrigado pelo seu feedback!