TOP

VBA-Lección 12.2. Controles (Controls)

Los controles (Controls) tienen todo tipo de propiedades y muchos eventos asociados con ellos, pero por ahora veremos solo algunos que se usan en la programación en VBA.


Comencemos agregando 3 controles: Label, TextBox y CommandButton:

Edite el nombre y las propiedades de este control (usando la propiedad Caption que contiene el texto) para obtener el siguiente resultado:

Ahora, cuando ingresamos el número y hacemos clic en Aceptar, no pasa nada.

Para crear una acción, agregaremos un evento que escribirá el valor ingresado desde el cuadro de texto a la celda A1 y cerrará el formulario.

Puede acceder a las opciones que se muestran a continuación haciendo doble clic en el control:

Esta lista desplegable contiene varios controles y este formulario.

Seleccione el botón (Button) y el evento Click:

Private Sub CommandButton_validate_Click()

     Range("A1") = Textbox_number.Value
     'Textbox_number es el nombre del cuadro de texto
     'Value es una propiedad que contiene el valor del cuadro de texto
    
     Unload Me
     'Descargar cierra el formulario (UserForm)
     'Usamos Me en lugar del nombre del formulario (porque este código está en medio de UserForm que queremos cerrar)
End Sub

El valor ingresado ahora ya se guardará en la celda A1 antes de cerrar este formulario (UserForm).

Agregue un segundo título (Label) y edite las siguientes propiedades: Caption, Forecolor (color: rojo) y Visible (False para ocultar el control predeterminado):

Ahora agreguemos un evento que se activará cuando el usuario cambie el valor en el campo de texto. El evento mostrará un mensaje de error si el valor no es numérico.

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'SI es un valor numérico...
         Label_error.Visible = False 'El título (Label) está oculto
     Else 'DE LO CONTRARIO...
         Label_error.Visible = True 'El nombre se muestra
     End If
End Sub

El valor ingresado se probará cada vez que se ingrese el siguiente carácter.

Todavía necesitamos agregar la verificación (validación) de los valores ingresados en el formulario. Mostraremos un mensaje si el valor no es un número:

Private Sub CommandButton_validate_Click()
     If IsNumeric(Textbox_number.Value) Then 'SI es un valor numérico...
         Range("A1") = Textbox_number.Value 'Copiar a A1
         Unload Me 'estoy cerrando
     Else 'DE LO CONTRARIO...
         MsgBox "Incorrect value" 'valor no válido
     End If
End Sub

Para no dejar vacío el lado derecho del formulario cuando no hay mensaje de error, podemos reducir su tamaño ajustando la propiedad Width de este formulario:

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'SI es un valor numérico...
         Label_error.Visible = False 'El título (Label) está oculto
         Me.Width = 156 'Ancho del formulario
     Else 'DE LO CONTRARIO...
         Label_error.Visible = True 'El nombre se muestra
         Me.Width = 244 'Ancho del formulario
     End If
End Sub

Puede descargar el archivo de ejemplo Excel: formulario de usuario1.xls

Aquí está el resultado:

Checkboxes

Aquí hay un ejemplo de cómo usar CheckBox:

Cuando la casilla de verificación está marcada/desmarcada, el valor de la celda asociada se puede cambiar usando el evento Click:

Private Sub CheckBox1_Click() 'Numero 1
     If CheckBox1.Value = True Then 'SI seleccionado...
        Range("A2") = "Checked"
     Else 'SI no se selecciona...
        Range("A2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox2_Click() 'Número 2
     If CheckBox2.Value = True Then 'SI seleccionado...
        Range("B2") = "Checked"
     Else 'SI no se selecciona...
        Range("B2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox3_Click() 'Numero 3
     If CheckBox3.Value = True Then 'SI seleccionado...
        Range("C2") = "Checked"
     Else 'SI no se selecciona...
        Range("C2") = "Unchecked"
     End If
End Sub

En este ejemplo, las casillas de verificación están inicialmente desmarcadas cuando se abre el formulario por primera vez.

Para marcar cada casilla de verificación cuando el valor de la celda correspondiente es "Anotado" ("Checked"), ejecutaremos la verificación en la activación del formulario usando UserForm_Initialize:

Private Sub UserForm_Initialize() 'Si está 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

Aquí puede ver un ejemplo en el archivo Excel terminado: formulario de usuario2.xls

Botones de opción (Option Buttons)

Al usar los botones de opción (Option Buttons o, a veces, también llamados Radio Buttons) el usuario puede seleccionar solo una opción por "grupo" a diferencia de las casillas de verificación donde el usuario puede marcar varias al mismo tiempo.

Para crear un "grupo", primero inserte Frame y luego OptionButton:

Aquí puede ver un ejemplo en el archivo Excel terminado: formulario de usuario3.xls

Al enviar el formulario, los datos se ingresarán en la celda asociada con el nombre de la columna seleccionada (column_value) y la fila (row_value).

Para saber qué opciones se seleccionaron, podríamos hacer lo mismo que en el ejemplo anterior (con casillas de verificación), pero usaremos un bucle para reducir el tamaño del código.

Usaremos el bucle For Each, que es un tipo de bucle que no hemos cubierto antes. Este ciclo le permite ejecutar instrucciones para cada objeto en el "grupo de objetos":

Private Sub CommandButton1_Click()
     Dim column_value As String, row_value As String
     
     'Bucle para cada control de columna Frame_
     For Each column_button In Frame_column.Controls
         'Si el valor de elem. control = True (entonces si se selecciona) ...
         If column_button.Value Then
            'La variable "column_value" toma el valor del texto del botón
            column_value = column_button.Caption
         End If
     Next
     
     'Ciclo para otro bloque
     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) = "¡La celda está seleccionada!"
     
     'Cerrar (Descargar) el formulario (Yo)
     Unload Me
End Sub

Ahora nuestro formulario ingresa el valor "¡La celda está seleccionada!" en la celda seleccionada.

Para evitar un error, debemos verificar si el usuario ha elegido correctamente entre dos conjuntos de opciones.

En este ejemplo, cuando el formulario aún no está completo, el botón "Confirmación" ("Confirm") estará atenuado (deshabilitado). No es la solución más fácil, pero es un buen ejemplo de por qué las funciones/procedimientos son útiles en medio de un formulario (UserForm).

Edite el texto y la propiedad Habilitado para deshabilitar el botón.

El resultado será el siguiente:

En el código anterior, usamos dos bucles For Each para obtener los valores de los botones de opción (Option Buttons). Ahora necesitamos usar los mismos valores para el botón "Confirmación" ("Confirm") y el evento Click para las diez opciones.

Para hacer esto, no necesitamos copiar los bucles para cada evento, los llamaremos a través de una función.

Partiendo del código anterior y modificándolo, conseguiremos este resultado:

 Private Function column_value()
 'Una función que devuelve un valor de texto para el botón seleccionado (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()
 'Una función que devuelve un valor de texto para el botón seleccionado (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() 'Acción que ocurre cuando hace clic en ("Confirmar su selección")
     Range(column_value & row_value) = "¡La celda está seleccionada!"
     'column_value y row_value son los valores devueltos por estas funciones
     Unload Me
 End Sub

Todo lo que nos queda por hacer es crear una rutina que verifique si los botones de opción se han seleccionado correctamente (llamando a dos funciones) y que active ese botón cuando sea necesario.

Nuevamente, la validación se realiza en un procedimiento separado para evitar copiar el código 10 veces para cada evento de cada botón de radio:

Private Sub activate_button()
 'Activar el botón si la condición se prueba con éxito
     If column_value <> "" And row_value <> "" Then
     'column_value y row_value son los valores devueltos por estas funciones
         CommandButton1.Enabled = True
         CommandButton1.Caption = "Confirma tu elección"
     End If
End Sub

Private Sub OptionButton11_Click()
     activate_button 'Iniciamos el procedimiento "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

Aquí puede ver un ejemplo en el archivo Excel terminado: formulario de usuario3b.xls