Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Introdução aos UserForms | Interação com o Usuário
VBA do Excel para Automação Empresarial

Introdução aos UserForms

Deslize para mostrar o menu

Note
Nota

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.

Figura 5.3

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.

Fluxo de Criação de Formulário

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
Explicação linha por linha
expand arrow
  • 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.Add adiciona 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.Value e 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.Value e os outros valores dos controles inacessíveis, já que os controles deixam de existir após o formulário ser descarregado.
Note
Nota

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.

Note
Nota

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

  1. Insira um novo UserForm, nomeie-o como frmAddCustomer e adicione três TextBoxes (txtCompanyName, txtContact, txtEmail) e dois ComboBoxes (cboCity, cboStatus), cada um com um Label correspondente.
  2. Adicione dois CommandButtons, cmdSave e cmdCancel, e escreva os procedimentos UserForm_Initialize e cmdCancel_Click exatamente como mostrado.
  3. Escreva cmdSave_Click conforme mostrado e, em seguida, adicione um botão temporário em outro local da planilha com o código frmAddCustomer.Show para testar a abertura do formulário.
  4. 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.
Dica
expand arrow

1. Construção do formulário

  • Inserir → UserForm no VBE, depois renomeie pelo campo (Name) na janela de Propriedades para frmAddCustomer — 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 em cmdCancel leva direto para cmdCancel_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 Sub de 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 tblCustomers depois para uma nova linha com um ID no estilo C00x.
Solução
expand arrow
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.

Testando o Formulário
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Introdução aos UserForms

Note
Nota

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.

Figura 5.3

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.

Fluxo de Criação de Formulário

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
Explicação linha por linha
expand arrow
  • 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.Add adiciona 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.Value e 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.Value e os outros valores dos controles inacessíveis, já que os controles deixam de existir após o formulário ser descarregado.
Note
Nota

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.

Note
Nota

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

  1. Insira um novo UserForm, nomeie-o como frmAddCustomer e adicione três TextBoxes (txtCompanyName, txtContact, txtEmail) e dois ComboBoxes (cboCity, cboStatus), cada um com um Label correspondente.
  2. Adicione dois CommandButtons, cmdSave e cmdCancel, e escreva os procedimentos UserForm_Initialize e cmdCancel_Click exatamente como mostrado.
  3. Escreva cmdSave_Click conforme mostrado e, em seguida, adicione um botão temporário em outro local da planilha com o código frmAddCustomer.Show para testar a abertura do formulário.
  4. 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.
Dica
expand arrow

1. Construção do formulário

  • Inserir → UserForm no VBE, depois renomeie pelo campo (Name) na janela de Propriedades para frmAddCustomer — 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 em cmdCancel leva direto para cmdCancel_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 Sub de 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 tblCustomers depois para uma nova linha com um ID no estilo C00x.
Solução
expand arrow
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.

Testando o Formulário
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 2
some-alt