Os controles (Controls) possuem todos os tipos de propriedades e muitos eventos associados a eles, mas por enquanto veremos apenas alguns que são usados na programação em VBA.
Vamos começar adicionando 3 controles - Label, TextBox e CommandButton:
Edite o nome e as propriedades deste controle (usando a propriedade Caption que contém o texto) para obter o seguinte resultado:
Agora, quando digitamos o número e clicamos em OK, nada acontece.
Para criar uma ação, adicionaremos um evento que escreverá o valor inserido na caixa de texto na célula A1 e fechará o Formulário.
Você pode acessar as opções mostradas abaixo clicando duas vezes no controle:
Esta lista suspensa contém vários controles e este Formulário.
Selecione o botão (Button) e o evento Click:
Private Sub CommandButton_validate_Click()
Range("A1") = Textbox_number.Value
'Textbox_number é o nome da caixa de texto
'Value é uma propriedade que contém o valor da caixa de texto
Unload Me
'Descarregar fecha o formulário (UserForm)
'Usamos Me em vez do nome do formulário (porque este código está no meio de UserForm que queremos fechar)
End Sub
O valor inserido agora já estará salvo na célula A1 antes de fechar este Formulário (UserForm).
Adicione uma segunda legenda (Label) e edite as seguintes propriedades: Caption, Forecolor (cor: vermelho) e Visible (False para ocultar o controle padrão):
Agora vamos adicionar um evento que será disparado quando o valor no campo de texto for alterado pelo usuário. O evento exibirá uma mensagem de erro se o valor não for numérico.
Private Sub Textbox_number_Change()
If IsNumeric(Textbox_number.Value) Then 'SE é um valor numérico...
Label_error.Visible = False 'O título (Label) está oculto
Else 'DE OUTRA FORMA...
Label_error.Visible = True 'O nome é exibido
End If
End Sub
O valor inserido será testado cada vez que o próximo caractere for inserido.
Ainda precisamos adicionar a verificação (validação) dos valores inseridos no formulário. Mostraremos uma mensagem se o valor não for um número:
Private Sub CommandButton_validate_Click()
If IsNumeric(Textbox_number.Value) Then 'SE é um valor numérico...
Range("A1") = Textbox_number.Value 'Copiar para A1
Unload Me 'estou fechando
Else 'DE OUTRA FORMA...
MsgBox "Incorrect value" 'Valor inválido
End If
End Sub
Para não deixar o lado direito do formulário vazio quando não há mensagem de erro, podemos reduzir seu tamanho ajustando a propriedade Width deste formulário:
Private Sub Textbox_number_Change()
If IsNumeric(Textbox_number.Value) Then 'SE é um valor numérico...
Label_error.Visible = False 'O título (Label) está oculto
Me.Width = 156 'Largura do formulário
Else 'DE OUTRA FORMA...
Label_error.Visible = True 'O nome é exibido
Me.Width = 244 'Largura do formulário
End If
End Sub
Você pode baixar o arquivo Excel com exemplo: userform1.xls
Aqui está o resultado:

Aqui está um exemplo de como usar CheckBox:
Quando a caixa de seleção está marcada/desmarcada, o valor da célula associada pode ser alterado usando o evento Click:
Private Sub CheckBox1_Click() 'Número 1
If CheckBox1.Value = True Then 'SE selecionado...
Range("A2") = "Checked"
Else 'SE não for selecionado...
Range("A2") = "Unchecked"
End If
End Sub
Private Sub CheckBox2_Click() 'Número 2
If CheckBox2.Value = True Then 'SE selecionado...
Range("B2") = "Checked"
Else 'SE não for selecionado...
Range("B2") = "Unchecked"
End If
End Sub
Private Sub CheckBox3_Click() 'Número 3
If CheckBox3.Value = True Then 'SE selecionado...
Range("C2") = "Checked"
Else 'SE não for selecionado...
Range("C2") = "Unchecked"
End If
End Sub
Neste exemplo, as caixas de seleção ficam inicialmente desmarcadas quando o Formulário é aberto pela primeira vez.
Para marcar cada caixa de seleção quando o valor da célula correspondente for "Checked" ("Checked"), executaremos a verificação na ativação do formulário usando UserForm_Initialize:
Private Sub UserForm_Initialize() 'Se marcado
If Range("A2") = "Checked" Then
CheckBox1.Value = True
End If
If Range("B2") = "Checked" Then
CheckBox2.Value = True
End If
If Range("C2") = "Checked" Then
CheckBox3.Value = True
End If
End Sub
Aqui você pode ver um exemplo no arquivo Excel finalizado: userform2.xls
Ao usar botões de opção (Option Buttons ou, às vezes, também chamados de Radio Buttons), o usuário pode selecionar apenas uma opção por "grupo", diferentemente das caixas de seleção, onde o usuário pode marcar várias caixas de uma vez.
Para criar um "grupo", primeiro insira Frame e depois OptionButton:
Aqui você pode ver um exemplo no arquivo Excel finalizado: userform3.xls
Ao enviar o formulário, os dados serão inseridos na célula associada ao nome da coluna selecionada (column_value) e linha (row_value).
Para saber quais opções foram selecionadas, poderíamos fazer o mesmo que no exemplo anterior (com checkboxes), mas usaremos um loop para reduzir o tamanho do código.
Estaremos usando o loop For Each, que é um tipo de loop que não abordamos antes. Este loop permite executar instruções para cada objeto em um "grupo de objetos":
Private Sub CommandButton1_Click()
Dim column_value As String, row_value As String
'Loop para cada controle Frame_column
For Each column_button In Frame_column.Controls
'Se valor de controle = True (então se selecionado) ...
If column_button.Value Then
'A variável "column_value" assume o valor do texto do botão
column_value = column_button.Caption
End If
Next
'Ciclo para outro bloco
For Each row_button In Frame_row.Controls
If row_button.Value Then
row_value = row_button.Caption
End If
Next
Range(column_value & row_value) = "Cell chosen!" '"Célula selecionada!"
'Fechar (Descarregar) o formulário (Eu)
Unload Me
End Sub
Nosso formulário agora insere o valor "Célula selecionada!" na célula selecionada.
Para evitar um erro, precisamos verificar se o usuário escolheu corretamente entre dois conjuntos de opções.
Neste exemplo, quando o formulário ainda não estiver preenchido, o botão Confirmar ("Confirm") ficará esmaecido (desabilitado). Não é a solução mais fácil, mas é um bom exemplo de porque funções/procedimentos são úteis no meio de um formulário (UserForm).
Edite o texto e a propriedade Enabled para desabilitar o botão.
O resultado será o seguinte:
No código anterior, usamos dois loops For Each para obter os valores dos botões de opção (Option Buttons). Agora precisamos usar os mesmos valores para o botão Confirmar ("Confirm") e o evento Click para as dez opções.
Para fazer isso, não precisamos copiar os loops de cada evento, vamos chamá-los através de uma função.
Começando com o código anterior e modificando-o, alcançaremos este resultado:
Private Function column_value()
'Função que retorna um valor de texto para o botão selecionado (column_value)
For Each column_button In Frame_column.Controls
If column_button.Value Then
column_value = column_button.Caption
End If
Next
End Function
Private Function row_value()
'Uma função que retorna um valor de texto para o botão selecionado (row_value)
For Each row_button In Frame_row.Controls
If row_button.Value Then
row_value = row_button.Caption
End If
Next
End Function
Private Sub CommandButton1_Click() 'Ação que acontece quando você clica ("Confirme sua seleção")
Range(column_value & row_value) = "Cell chosen!" '"Célula selecionada!"
'column_value e row_value são os valores retornados por essas funções
Unload Me
End Sub
Resta apenas criar um procedimento que verifique se os botões de opção foram selecionados corretamente (chamando duas funções), e que ative esse botão quando necessário.
Novamente, a validação é feita em um procedimento separado para evitar copiar o código 10 vezes para cada evento de cada botão de opção:
Private Sub activate_button()
'Ativando o botão se a condição for testada com sucesso
If column_value <> "" And row_value <> "" Then
'column_value e row_value são os valores retornados por essas funções
CommandButton1.Enabled = True
CommandButton1.Caption = "Confirm your selection" '"Confirme sua escolha"
End If
End Sub
Private Sub OptionButton11_Click()
activate_button 'Iniciamos o procedimento "activate_button"
End Sub
Private Sub OptionButton12_Click()
activate_button
End Sub
Private Sub OptionButton13_Click()
activate_button
End Sub
Private Sub OptionButton14_Click()
activate_button
End Sub
Private Sub OptionButton15_Click()
activate_button
End Sub
Private Sub OptionButton16_Click()
activate_button
End Sub
Private Sub OptionButton17_Click()
activate_button
End Sub
Private Sub OptionButton18_Click()
activate_button
End Sub
Private Sub OptionButton19_Click()
activate_button
End Sub
Private Sub OptionButton20_Click()
activate_button
End Sub
Aqui você pode ver um exemplo no arquivo Excel finalizado: userform3b.xls