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:
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
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