TOP

VBA-Lição 12.2. Controles (Controls)

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:

Checkboxes

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

Botões de opção (Option Buttons)

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