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