UserForms en VBA

Un Formulario de Usuario o UserForm es una interfaz que permite ordenar y mostrar de una forma amigable la información que se requiera según sea la necesidad del usuario. De esta manera se evita que el usuario escriba directamente sobre las hojas de trabajo o bases de datos, protegiendo de esta manera la información a la vez que se facilita la entrada de los datos.

Los UserForms son una excelente opción si tus aplicaciones están programadas en Excel/VBA, ya que pueden adecuarse a las necesidades de los usuarios y ser 100% personalizables.

En este tutorial desarrollaremos una interfaz de usuario sencilla, que genera un mensaje de saludo según la información introducida.

1. Cómo crear un Userform en VBA?

Primero busca en la barra de herramientas en el editor de Visual Basic (VBE) la opción “Insertar” luego selecciona  “UserForm”. Se creará el formulario por defecto en el espacio de trabajo.

En la parte inferior derecha del VBE aparecerá el cuadro de propiedades del formulario, es aquí donde podremos controlar todo el Userform y sus elementos internos.

2. Elementos internos del Userform – Botones, TextBox, ComboBox y otros

Son los elementos que permiten la interacción entre el Userform y usuario. Para añadirlos, una vez que has generado el formulario debes mostrar el cuadro de herramientas a través de la opción “Ver” del VBE.

Para agregar un elemento sólo debes seleccionarlo desde el cuadro de herramientas y arrastrarlo al Userform. Con el mouse podrás ubicarlo y ajustarle el tamaño según necesites; verás más adelante que también puedes hacerlo a través de las propiedades de cada elemento.

A continuación te mostramos una lista de los elementos más utilizados en la creación de UserForms. Todos los elementos sin excepción pueden ser configurados o actualizados vía código de programación.

2.1. Imagen (Image)

Es un campo no modificable por el usuario final, usado normalmente para insertar una imagen como la de un logotipo.

2.2. Etiqueta (Label)

Es un campo no modificable por el usuario final, usado normalmente para indicar o explicar la función de otro elemento dentro del Userform.

2.3. Cuadro de texto (TextBox)

Es un elemento modificable por el usuario final, usado para dar ingreso de datos. Todo valor que se ingrese vía cuadro de texto será reconocido por VBA como String. Si se deseas que sea reconocido como otro tipo (número, fecha u otro) deberás hacer la conversión del tipo de variable. Puedes revisar el tutorial de variables para más información.

2.4. Cuadro Combinado (ComboBox)

Este elemento es también conocido como drop-down. Su función es albergar una lista de opciones para que el usuario escoja sólo una de ellas.

2.5. Casilla (CheckBox)

Es un elemento booleano (toma valores True o False) que puede ser modificado por el usuario final.

2.6. Botón de opción (OptionButton)

Similar al CheckBox, es otro elemento booleano (toma valores True o False) que puede ser modificado por el usuario.

2.7. Botón de comando (CommandButton)

Es un elemento sobre el cual se asignan acciones que se quieren realizar en un programa, como ejecutar la macro, cerrar el Userform, abrir un archivo, entre otras.

3. Propiedades del Userform y de sus elementos

Los Userforms y sus elementos poseen propiedades que pueden ser modificadas directamente a través del cuadro de propiedades en el VBA. Algunas de estas propiedades son comunes a todos los elementos, como las relacionadas a la apariencia (ancho, largo, ubicación); otras propiedades son particulares para cada elemento. A continuación te mostramos una lista de las propiedades según el tipo de elemento.

Propiedad Descripción Aplica a:
(Name) Nombre del elemento. Es usado para identificar el elemento dentro del código VBA. Todos los elementos
Back Color Color de fondo Todos los elementos
Caption Texto de titulo Userform, Label, CheckBox, OptionButton, CommandButton
Enabled Activación Todos los elementos
Font Fuente del texto Userform, Label, TextBox, ComboBox, CheckBox, OptionButton, CommandButton
Height Valor de altura de elemento Todos los elementos
Left Ubicación horizontal Todos los elementos
Picture Imagen Userform, Image, Label, CheckBox, OptionButton, CommandButton
Picture-SizeMode Ajuste de tamaño de imagen Userform, Image, CommandButton*
TextAlign Alineación de texto Label, TextBox, ComboBox, Check Box, OptionButton
Top Ubicación vertical Todos los elementos
Visible Visibilidad Image, Label, TextBox, ComboBox, CheckBox, OptionButton, CommandButton
With Ancho Todos los elementos
Word-Wrap Ajuste de línea de texto Label, TextBox, Check Box, OptionButton, CommandButton

(*) La propiedad equivalente para el CommandButton se llama  Picture Position

4. Scripts en los Userforms

Estas son las instrucciones/acciones que se ejecutan cuando ocurra un evento sobre un elemento del Userform. Estos eventos pueden ser un click, el ingreso de datos en un TextBox, el cambio de selección en un ComboBox, entre otros.

Los script pueden ser interdependientes, es decir pueden ejecutarse en un elemento y tener efectos sobre otros elementos; por ejemplo, podemos programar que un TexBox se ha visible o invisible al activar o desactivar un CheckBox.

Te mostraremos algunos scripts típicos para desarrollar una interfaz que nos muestre un mensaje de saludo a partir de la información que ingresemos.

4.1. ComboBox.

Este tipo de elementos requieren que la lista que ellos despliegan sea previamente llenada, lo cual puede hacerse a través de los valores de una hoja de cálculo o indicando directamente los elementos que debe tomar la lista. Las instrucciones para ello serían:

Estructura With Nombre de ComboBox  
.AddItem elemento
End With

Ejemplo:

With ComboBox1
  .AddItem "Sr."
  .AddItem "Sra."
End With

A menos que se desee lo contrario o por requerimiento del código, es buena práctica colocar la instrucción de llenado del ComboBox en el evento de inicialización (Initialize) del UserForm, para que la información esté previamente cargada a la hora de que el usuario desee modificar el ComboBox. El código luciría como se muestra en el siguiente ejemplo:

Private Sub UserForm_Initialize()

With ComboBox1
.AddItem "Sr."
.AddItem "Sra."
End With

End Sub

El ComboBox de nuestro ejemplo tendrá 2 posibles selecciones: Sr. y Sra.

Para escribir un código de programación sobre un evento del Userform principal, basta con hacer doble click en el Userform y elegir el evento sobre el cual desea escribir. En nuestro caso, seleccionamos el evento “Initialize”. Los eventos pueden variar según el tipo de elemento. En la imagen verás la lista para el elemento Userform.

4.2 Checkbox / Option Button

Como te mencionamos anteriormente, este tipo de elementos toma valores True o False al activarlos o desactivarlos, respectivamente. Esta activación / desactivación la puedes aprovechar para generar efectos en otros parámetros o elementos del Userform.

En nuestro ejemplo, cuando el usuario haga click sobre el CheckBox1 para activarlo, el elemento ComboBox1 se habilitará; cuando el  CheckBox1 tenga el valor False (desactivado) el elemento ComboBox1 se deshabilitará, es decir, el usuario no tendrá acceso a los valores de la lista en el ComBobox1.

Estructura Condicional según el valor del elemento  
Nombre de elemento afectado.Enabled = True o False

Ejemplo:

If CheckBox1 = True Then
 ComboBox1.Enabled = True
Else
 ComboBox1.Enabled = False
 ComboBox1 = ""
End If

4.3 CommandButton

Normalmente sobre estos elementos es donde se asignan las rutinas más complejas. En este ejemplo asignaremos las instrucciones de generar le mensaje de saludo, que estará compuesto por la selección realizada en el elemento ComboBox1 y la palabra escrita en el elemento TextBox1.

Ejemplo:

MsgBox "Hola " & ComboBox1 & " " & TextBox1 & "." & vbCrLf & "Feliz Día!"

5. Mostrar y Ocultar Userforms

El llamado de un Userform se hace a través de la instrucción “Show” (mostrar).

Estructura NombreDeUserform.Show

Ejemplo:

UserForm1.Show

Para cerrar el Userform utilizaremos la instrucción “Unload”.

Estructura Unload NombreDeUserform

Ejemplo:

Unload UserForm1

Normalmente esta instrucción la colocamos en un CommandButton que ejecute la “Salida” del programa

6. Resultado

Una vez escritas todas las instrucciones que has aprendido en este tutorial, el resultado que obtendrás será un Userform como el siguiente, el cual muestra un mensaje de bienvenida luego de presionar el botón “Run!”.

Como puedes ver, la generación de interfaz de usuario es una actividad relativamente sencilla. Su complejidad variará dependiendo del funcionamiento de tu programa y de la interacción entre los elementos.

No tenemos dudas de que con lo aprendido en este tutorial podrás armar tu propia interfaz de usuario.

 

 

¿Quieres saber más? Contáctanos

Uso del condicional If en VBA (if, elseif, else, end if)

A partir de este tutorial empezaremos a explorar las bondades de programar, una de ellas es hacer que el computador “tome decisiones” y esto se hace a través de los condicionales.

¿Qué es un condicional?

Un condicional es un cuestionamiento que se hace en el flujo de la información (una o más variables) y en el cual se pude discernir si cumple o no con una condición que se establezca, y en función de esa respuesta se tomarán acciones.

Figura 1. Diagrama condicional.

Es muy común que encontremos situaciones en las que cuando no se cumpla la condición dada, la decisión conlleve a una acción que nos regrese al punto inicial de cuestionamiento.

Figura 2. Diagrama condicional con re-evaluación.

Aunque parezca lógico, es importante dejar en claro que la única limitación sobre el tipo de preguntas es que las mismas puedan ser respondidas con la información que se maneje en el programa que estemos desarrollando. En este sentido, es posible hacer preguntas independientemente del tipo de variables, por ejemplo:

Tipo de variable Pregunta ejemplo
String ¿El número de caracteres es menor que el máximo permitido?
Date ¿La fecha de finalización es posterior a la fecha tope?
Integer ¿Es esta persona mayor de edad?
Double ¿Es el volumen de un objeto menor a la capacidad una caja?

Para poder lidiar con estas preguntas es necesario tener la información adecuada para cada caso, y la más importante tener una definición clara de la condición que se desea cumplir.

 

 

 

¿Cómo escribir un condicional en VBA?

Para escribir un condicional (If en VBA) debemos hacer el cuestionamiento sobre la variable a evaluar y luego dar la instrucción de qué hacer si se cumple la condición dada. Este cuestionamiento se hace a través del uso de la función o comando If.

Opcionalmente se puede dar la instrucción de hacer algún tipo de actividad en caso de no cumplir con la condición; en caso de no dar esta instrucción sencillamente no se hará ninguna acción. Tomemos un ejemplo de las entradas al cine según las edades de las personas; si es para un niño (lo definiremos como: edad menor o igual a 12 años) será entonces una entrada “Preferencial”, de lo contrario (edad mayor o igual a 12 años) será una entrada “Regular”, tal y como se muestra a continuación en la siguiente estructura IF:

Ejemplos de condicional If en VBA

If Range(“B2”) <= 12 Then Cuestionamiento (obligatorio)
     Range(“C2”) = “Preferencial” Resultado si se cumple
Else En caso de no cumplir (opcional)
     Range(“C2”) = “Regular” Resultado si no se cumple
End If Cierre (obligatorio)
Figura 3. Estructura de la función condicional en VBA.
Sub Tutorial4a_Condicional()
Dim edad As Integer
If Range("B2") <= 12 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Condicionales If anidados en VBA

Es posible que luego de la evaluación de una variable, sea necesario hacer una segunda evaluación de otra condición; esto es lo que denominaríamos como “Condicional Anidado”, y la estructura será similar a la que mostramos a continuación:

Ejemplos de condicional If anidado en VBA

If Range(“B2”) > 12 Then Cuestionamiento 1 (obligatorio)
  If Range(“B2”) < 60 Then Cuestionamiento 2
Range(“C2”) = “Regular” Resultado si se cumple 2
Else En caso de no cumplir 2 (opcional)
Range(“C2”) = “Preferencial” Resultado si no se cumple 2
End If Cierre 2 (obligatorio)
Else En caso de no cumplir 1 (opcional)
  Range(“C2”) = “Preferencial” Resultado si no se cumple 1
End If Cierre 1 (obligatorio)

Para hacerlo más claro, retomemos el ejemplo de la entrada al cine: los tickets preferenciales pueden ser para niños o adultos de tercera edad; una forma de evaluar sería con este orden:

  • Que la persona sea un adulto: edad mayor a 12 años, lo cual excluye a los niños (entrada preferencial).
  • Que el adulto sea menor a 60 años, condición que excluye a las personas de tercera edad (entrada preferencial).

El cumplimiento positivo de estas dos condiciones elegirá a una persona entre 13 y 59 años, que son los que pagarían la entrada “Regular”. Ahora puedes verlo más claramente si lo llevamos a un diagrama de flujo y código en VBA:

Figura 4. Condicional VBA anidado .
Sub Tutorial4b_Condicional()
Dim edad As Integer
If Range("B2") > 12 Then
  If Range("B2") < 60 Then
    Range("C2") = "Regular"
  Else
    Range("C2") = "Preferencial"
  End If
Else
  Range("C2") = "Preferencial"
End If
End Sub

Condicionales múltiples (If Elseif) en VBA

Existe una modalidad que llamaremos múltiple condicional, que es muy parecida al condicional anidado, la diferencia principal es que el condicional secundario se hace sólo si NO se cumple el primer condicional. Esta opción se utiliza mediante la instrucción Elseif en VBA y debe ir seguido a un If principal, tal y como se muestra en la siguiente estructura:

Ejemplos de condicional múltiple en VBA

If Condición A Then Cuestionamiento A (obligatorio)
     Decisión positiva de A Resultado si se cumple
Elseif Condición B Then Cuestionamiento B (obligatorio)
     Decisión positiva de B Resultado si se cumple
Else En caso de no cumplir A o B (opcional)
     Decisión negativa de A y B Resultado si no se cumple
End If Cierre (obligatorio)

La cantidad de Elseif  o condicionales adicionales no tiene límites, todo depende de la evaluación y las decisiones que ese deseen tomar.

Conociendo ya la estructura, es momento de revisar el diagrama de flujo con el código VBA:



Figura 5. Condicional múltiple en VBA.
Sub Tutorial4c_Condicional()
If Range("B2") > 59 Then
  Range("C2") = "Preferencial"
ElseIf Range("B2") < 13 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Uso de Or y And (operadores lógicos) en condicionales VBA

En algunos casos es posible hacer que un mismo condicional evalúe dos o más requisitos a través de los comparadores lógicos And (“y”) y Or (“o”).

El operador And aprueba la condición solo si se cumple la primera “Y” la segunda condición a la vez. Por ejemplo: ¿Es la edad mayor a 12 años y menor a 60?

Ejemplos de uso de Or y And en condicionales de VBA



Figura 6. Uso del operador lógico “And” en VBA.
Sub Tutorial4d_Condicional()
If Range("B2") > 12 And Range("B2") < 60 Then
  Range("C2") = "Regular"
Else
  Range("C2") = "Preferencial"
End If
End Sub

Similarmente, el operador Or considerará cierta la condición evaluada si se cumple al menos una de las propuestas; por ejemplo: “la entrada Preferencial es para personas con edades menores de 13 años O mayores de 59 años.


Figura 7. Uso del operador lógico “Or” en VBA.
Sub Tutorial4e_Condicional()
If Range("B2") < 13 Or Range("B2") > 59 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Al igual que los condicionales anidados y múltiples, no existe limitación sobre la cantidad de operadores lógicos y sus combinaciones.

Como puedes ver, hay más de una forma de programar una instrucción de decisión en el computador, algunas maneras son más compactas que otras, como lo vimos en el ejemplo que desarrollamos durante este tutorial.

Con la práctica, irás adquiriendo destrezas que te permitirán hacer un código de programación más compacto y a prueba de errores.

Quieres saber más? Contáctanos…