VBA – Creación de Formularios
In this Article
- Formularios en VBA
- Formularios Integrados
- Cuadro de Mensajes
- Cuadro de Entrada
- Obtener Nombre de Archivo
- Diálogos por Defecto de Excel
- Inserción de un Nuevo Formulario
- Uso de la Caja de Herramientas
- Añadir un Botón de Salida al Formulario
- Añadir un Control de Etiqueta a un Formulario
- Añadir un Control de Texto al Formulario
- Inicializar y Activar Eventos en un Formulario
- Guardando su Aplicación y Formularios
- Formularios Modales y No Modales
- Cerrar un Formulario
- Activación y Desactivación de Controles
Este tutorial tratará sobre Formularios en VBA.
Formularios en VBA
El Formulario (Userform) es una parte muy importante de la programación en VBA. Le permite construir una interfaz de usuario de aspecto profesional para comunicarse con los usuarios de su aplicación VBA. También le permite controlar totalmente al usuario en lo que están haciendo a su libro de trabajo.
Usted puede, por supuesto, usar celdas de la hoja de trabajo para aceptar parámetros del usuario, pero el formulario de usuario produce una experiencia de usuario mucho mejor.
Expandiendo la altura y la anchura de su formulario de usuario al tamaño de la ventana de Excel, puede hacer que su aplicación parezca una aplicación normal de Windows, sin que el usuario sea totalmente consciente de que está utilizando Excel como anfitrión.
Dispone de todos los controles normales de Windows, como desplegables, cuadros de lista y casillas de verificación. También dispone de una amplia gama de métodos, eventos y propiedades para mejorar la experiencia del usuario.
Un punto importante es que cuando se muestra un formulario de usuario integrado o modal, no se puede editar el código en el VBE ni acceder a ninguna funcionalidad de Excel. Sólo cuando se cierre el formulario aparecerá el cursor en tu código.
Formularios Integrados
Excel VBA tiene varios formularios incorporados que se pueden utilizar para comunicarse con el usuario.
Cuadro de Mensajes
Esta es la forma más comúnmente utilizada en VBA. Simplemente muestra un mensaje de texto, posiblemente informando a un usuario que ha introducido datos no válidos o que un proceso VBA ha terminado de ejecutarse. En su forma más simple, muestran una cadena de texto, pero también se puede añadir un icono, como un signo de interrogación o exclamación, y dar al cuadro de mensaje un título diferente.
Este es un ejemplo básico. Sólo hay que pulsar un botón y la barra de título dice «Microsoft Excel» El código para producir esto es muy sencillo:
Sub PruebaMsgBox()
MsgBox "Este proceso ha terminado!"
End Sub
Puedes utilizar diferentes parámetros para añadir botones, iconos y cambiar la barra de título
Sub Prueba_2_MsgBox()
Dim Ret As Variant
Ret = MsgBox("Estás Seguro?", vbYesNo Or vbQuestion, "Mi App")
If Ret = vbYes Then
'Colocar tu proceso aquí.
Else
Exit Sub
End If
End Sub
Este código añade un botón ‘Sí’ y ‘No’ y un icono de signo de interrogación, y establece la barra de título. Tenga en cuenta que puede combinar los estilos del cuadro de mensaje utilizando el operador «Or»
Además, cuando se devuelve un valor desde un cuadro de mensaje, la variable de retorno debe definirse como una variante o vbMsgBoxResult, y la declaración del cuadro de mensaje debe utilizar corchetes,
Cuadro de Entrada
Existe un cuadro de entrada muy sencillo integrado en VBA, aunque es bastante restrictivo en lo que se puede hacer con él. Si puede, es mejor diseñar un userform personalizado
Sub Prueba_CuadroDeEntrada()
Dim Ret As String
Ret = InputBox("Por favor introduzca su nombre", "Introduzca Nombre")
MsgBox Ret
End Sub
También puede añadir un valor por defecto para la entrada en los parámetros.
Obtener Nombre de Archivo
Esto le permite utilizar el diálogo de archivo de Windows dentro de su código VBA. Se ve muy impresionante para el usuario cuando se está ejecutando, pero es muy sencillo de incorporar y se obtiene automáticamente toda la funcionalidad de diálogo de archivo con él.
El código restringe al usuario a ver sólo archivos de Excel. Desafortunadamente, podrían escribir un nombre de archivo que no sea Excel en el cuadro Nombre de archivo y hacer clic en el botón Abrir, por lo que necesitaría algún código para asegurarse de que se ha seleccionado un archivo de Excel.
Utilice el comando ‘ChDir’ para cambiar el directorio por defecto a sus propios requisitos antes de mostrar el diálogo de archivos.
Observe el uso de comodines en el parámetro FileFilter. Los archivos Excel a mostrar pueden ser anteriores a 2007, tener macros o ser binarios, por lo que el filtro es ‘.xls*’.
Sub Prueba_FileDialog()
Dim MyFile As String
ChDir "C:\AUTOMATE EXCEL"
MyFile = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", , "Select a file")
MsgBox MyFile
End Sub
Si es necesario, puede permitir al usuario seleccionar varios archivos a la vez utilizando el parámetro MultiSelect. El valor predeterminado es False (sólo selección única)
Sub Prueba_2_FileDialog()
Dim MyFile As Variant
ChDir "C:\AUTOMATE EXCEL"
MyFile = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", , "Select a file", , True)
For Each f In MyFile
MsgBox f
Next f
End Sub
El usuario mantiene pulsada la tecla Mayúscula en el diálogo de archivos para seleccionar varios archivos. El bucle For Each muestra la ruta completa y el nombre de cada archivo seleccionado
Diálogos por Defecto de Excel
Dentro de Excel VBA, existe una colección Diálogos que puede utilizar para mostrar cualquier diálogo estándar de Excel. La desventaja es que no se puede acceder a los parámetros que el usuario ha elegido o cambiar la apariencia del diálogo, pero estos diálogos pueden ser útiles para dirigir al usuario a una función estándar de Excel, y lo que les permite elegir los parámetros específicos dentro del diálogo.
Un buen ejemplo de esto es mostrar el diálogo ‘Imprimir’ desde VBA:
Sub Prueba_PrintDialog()
Application.Dialogs(xlDialogPrint).Show
End Sub
Cuando abra los corchetes de la colección Diálogos, verá una lista con un gran número de constantes para los diálogos incorporados. Vale la pena experimentar con algunas de estas opciones dentro de tu código.
Inserción de un Nuevo Formulario
Puede diseñar sus propios formularios de usuario personalizados insertando un formulario de usuario en el Editor de Visual Basic (VBE)
Para ello, seleccione Insertar | Formulario de usuario en la barra de menús del VBE.
Haga clic en ‘UserForm’ y aparecerá un nuevo formulario en blanco listo para que lo desarrolle
El formulario en sí (mostrado como ‘UserForm1’) parece bastante pequeño, pero puede utilizar los tiradores que lo rodean para ampliarlo o reducirlo aún más arrastrando los tiradores con el cursor.
Hay una ventana de propiedades en la esquina inferior izquierda de la pantalla. Como el foco está directamente en el formulario, contiene todas las propiedades específicas de ese formulario.
Ten en cuenta que cuando empiezas a añadir controles como cuadros combinados y botones de comando, todos estos controles tienen su propio conjunto de propiedades, y pueden ser muy diferentes en lo que puedes hacer con cada uno de ellos.
Las propiedades que ves actualmente sólo se aplican al formulario en sí.
La propiedad ‘Name’ es el nombre utilizado para definir su objeto formulario dentro del código VBA. Es posible que desee utilizar algo más significativo para el nombre del objeto, de modo que cuando usted está revisando su código, es obvio que la forma que se está utilizando.
La propiedad ‘Name’ también se reflejará en la ventana ‘Explorador de Proyectos’ en la esquina superior izquierda de la pantalla.
Querrás modificar la barra de título de tu formulario a algo diferente de ‘UserForm1’, y puedes hacerlo escribiendo tu nuevo texto en la propiedad ‘Caption’
Puedes hacer un gran número de cambios en la forma en que tu formulario es visto por el usuario. Puedes alterar los colores, añadir imágenes, por ejemplo un logo corporativo, cambiar la posición usando ‘Left’ y ‘Top’, cambiar el tamaño usando ‘Height’ y ‘Width’, cambiar el puntero del ratón, y muchos más.
Todas estas propiedades también se pueden cambiar mediante programación para cualquier control que haya añadido a su formulario. Por ejemplo, un usuario puede seleccionar de un control de caja de lista, y usted puede querer desactivar u ocultar otros controles basados en la elección del usuario
Uso de la Caja de Herramientas
Observará que cuando hace clic en el formulario, aparece una caja de herramientas emergente. Si hace clic en cualquier otro lugar, por ejemplo, en el panel de propiedades, desaparecerá, pero volverá a aparecer cuando haga clic en el formulario.
La caja de herramientas proporciona la mecánica real del diseño del formulario. Esto le permite añadir a su formulario los controles normales de Windows con los que los usuarios están familiarizados.
Habrás notado que en el formulario hay una red de puntos. Esto es un ‘snapgrid’ de modo que cuando añades un control al formulario, automáticamente se alineará la posición a las filas y columnas de puntos. Esto ayuda enormemente a alinear los controles para que no tengan un aspecto irregular.
Si haces clic en un control y decides no utilizarlo, haz clic en el icono de la flecha situado en la esquina superior izquierda de la caja de herramientas y el cursor volverá a su posición normal.
Puedes añadir controles adicionales a la caja de herramientas utilizando Herramientas | Controles adicionales en el menú VBE. Hay un número considerable de ellos disponibles, pero dependiendo de las versiones de Windows y Excel, no siempre funcionan, por lo que a menudo es necesario experimentar.
Además, es posible que sus usuarios no tengan acceso a algunos de estos controles adicionales o que utilicen versiones antiguas de Windows y Excel, lo que puede causar problemas. En las grandes organizaciones, especialmente si son globales, no existe un PC estándar en el que se pueda confiar.
Añadir un Botón de Salida al Formulario
Es fácil añadir un botón de comando al formulario. Tiene el mismo aspecto que los botones que se ven en otros formularios de Windows, normalmente como un botón ‘Aceptar’ o ‘Cancelar’.
Haga clic en el icono del Botón de Comando en la caja de herramientas. Este es el segundo icono desde la izquierda en la fila inferior de iconos. Vea la imagen de arriba. Tiene las letras ‘ab’.
Puede mantener pulsado el botón del ratón y arrastrar el control a su formulario, o puede mover el cursor al formulario, donde cambiará a un cursor en forma de ‘cruz’ y podrá posicionar y dimensionar su botón.
Si arrastra el control al formulario, obtendrá el tamaño predeterminado del botón. Si mueve el cursor al formulario, podrá cambiar el tamaño del botón arrastrando el cursor en cruz por el formulario.
Tu formulario tendrá ahora este aspecto:
El botón tendrá un texto por defecto como título, pero usted querrá cambiarlo según sus propias necesidades. Puede hacer clic en el texto dentro del botón (‘CommandButton1’) y esto le permitirá editar el título directamente.
También puede cambiarlo en la ventana de propiedades (esquina inferior izquierda de la pantalla). Verá una propiedad llamada ‘Caption’ y podrá editar el valor de la misma. Cámbialo a «Salir»
Al igual que con las propiedades del formulario, la propiedad «Name» define el nombre que se utilizará en el código VBA. Es posible que desee utilizar un nombre que sea más significativo y obvio dentro de su código. Puedes introducirlo en la propiedad ‘Name’.
Puede cambiar la posición del botón arrastrándolo por el formulario, y puede cambiar su tamaño haciendo clic en los tiradores del botón (cuadros cuadrados blancos) y arrastrando los tiradores para hacerlo más grande o más pequeño.
También puede cambiar el tamaño del botón modificando los valores de altura y anchura en la ventana de propiedades.
Puede ver su formulario en Excel haciendo clic en el triángulo verde de la barra de herramientas VBE o pulsando F5
Puede llamar a su formulario desde código VBA dentro de un módulo utilizando el método ‘Show’
Sub ShowForm()
UserForm1.Show
End Sub
Su formulario de usuario es efectivamente un objeto global y puede ser llamado desde cualquier lugar dentro de su código
Actualmente, su botón de comando no hace nada porque no hay código VBA detrás de él. Tendrá que escribirlo usted mismo. Todo lo que puede pasar en este momento es que puedes hacer clic en la X de ‘Cerrar’ en la esquina superior derecha de tu formulario.
Para añadir código VBA, haga doble clic en el botón del formulario.
Esto te llevará a la ventana normal de código VBA, y mostrará el evento por defecto de clic.
También puede añadir cualquier otro código, como un cuadro de mensaje para confirmar al usuario lo que ha sucedido.
Observa que la ventana de código tiene dos desplegables en la parte superior. El primero te permite seleccionar tus controles de formulario, y el segundo muestra todos los eventos que están disponibles para que añadas código. El más obvio para un botón es el evento ‘Click’, pero hay otros como ‘Double Click’ o ‘Mouse Move’
Cuando ejecutas tu formulario ahora, el botón realmente hace algo. El formulario desaparece y se muestra un mensaje confirmando que el formulario está cerrado.
Por supuesto, puede ampliar el código de salida. Es posible que desee mostrar otro formulario, o tomar medidas sobre los parámetros que el usuario ha introducido en su formulario
Añadir un Control de Etiqueta a un Formulario
Los controles de etiqueta sirven para indicar al usuario qué tipo de datos debe introducir en un control del formulario, por ejemplo, un cuadro de texto, un desplegable, etc. Una etiqueta no tiene bordes por defecto, pero pueden añadirse a través de la ventana de propiedades si es necesario.
Como control, son de sólo lectura para el usuario y son simplemente una forma de poner texto en el formulario, ya sea un título en negrita, o una instrucción de qué introducir o elegir.
Para añadir una etiqueta, haga clic en el icono «A» de la caja de herramientas (fila superior, segunda por la izquierda) y haga doble clic sobre ella o desplace el cursor hasta el formulario y seleccione posición y tamaño.
Utilizando la propiedad «Captio» de la ventana de propiedades, o haciendo clic en el control de etiqueta, puede introducir el texto para el control de etiqueta.
Tenga en cuenta que el texto se ajustará al tamaño del control de etiqueta, y si la cadena de texto es demasiado larga, no aparecerá completamente en el formulario, por lo que debe tener cuidado con el tamaño del control de etiqueta.
Utilizando la ventana de propiedades, puede cambiar la apariencia del control de etiqueta, con diferentes colores, fuentes, estilo de fondo, por ejemplo, si se superpone a una imagen y desea que sea transparente.
No es necesario crear ningún código para un control de etiqueta. El objetivo principal es añadir texto al formulario para que el usuario pueda ver cómo funcionan los demás controles
Añadir un Control de Texto al Formulario
Un control de texto se utiliza para que el usuario introduzca texto, por ejemplo, un nombre o un comentario.
El control de texto se añade desde la caja de herramientas haciendo clic en el icono de control de texto (fila superior, tercera desde la izquierda) y haciendo doble clic o arrastrando el control hasta su posición en el formulario.
El control de texto se confunde a menudo con el control de etiqueta, pero el control de texto es el que se utiliza para la introducción de datos por parte del usuario.
El texto «Introduzca su nombre» es un control de etiqueta, como se ha descrito anteriormente, y ahora tenemos un cuadro de texto blanco listo para que el usuario escriba algo en él.
Mediante la ventana de propiedades, puede cambiar los colores, las fuentes, los efectos especiales o utilizar caracteres de contraseña para el cuadro de texto. La flexibilidad es enorme.
Una propiedad muy importante para un cuadro de texto es la propiedad ‘MultiLine’. Si desea que el usuario introduzca una gran cantidad de texto en el control de texto, por ejemplo, comentarios, entonces la propiedad ‘MultiLine’ debe ser True.
El valor por defecto es False, lo que significa que por muy grande que sea el cuadro de texto, el texto introducido permanecerá en una línea continua y se desplazará fuera del cuadro de texto. No se desplazará dentro de la caja.
No aparece ninguna ventana emergente al hacer clic con el botón derecho del ratón sobre el cuadro de texto cuando está en funcionamiento, pero CTRL+V funcionará para Pegar, y CTRL+C funcionará para Cortar, en caso de que el usuario desee cortar y pegar texto desde y hacia otras aplicaciones.
De nuevo, tienes que escribir tu propio código para manejar el texto que el usuario ha escrito. Es posible que desee transferirlo a una celda de una hoja de cálculo.
Puedes añadir este código en el evento ‘Change’ de la caja de texto
Private Sub TextBox1_Change()
Sheets("Hoja1").Range("A1").Value = TextBox1.Value
End Sub
También puede poner algún código de validación para comprobar que el usuario no está introduciendo basura que tendrá efectos desastrosos en su aplicación.
El evento ‘Change’ no es bueno para esto porque es llamado cada vez que el usuario teclea un nuevo caracter. El usuario podría empezar a escribir una cadena de texto y descubrir al instante que ha roto tus reglas de validación antes de haber completado un texto válido.
Utiliza el evento ‘Exit’. Se activa cuando el usuario mueve el foco a otro control del formulario, lo que significa que el usuario ya no está introduciendo datos.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNull(TextBox1.Value) Or Len(TextBox1.Value) < 4 Then
MsgBox "Nombre Inválido", vbCritical
TextBox1.SetFocus
End If
End Sub
Cuando el usuario hace clic en otro control del formulario, este código comprueba si hay un valor nulo en el cuadro de texto o menos de 4 caracteres. Si la prueba es verdadera, entonces aparece un cuadro de mensaje con un icono crítico para informar al usuario de que el nombre no es válido, y el foco se mueve de nuevo al cuadro de texto infractor para que el usuario lo corrija.
Tenga en cuenta que incluso si el usuario hace clic en el botón Salir, el evento de salida del cuadro de texto se ejecutará primero, por lo que esto evita que el usuario salga sin corregir la entrada
Inicializar y Activar Eventos en un Formulario
Cuando VBA crea y construye un formulario por primera vez, lanza un evento ‘Initialize’. Sin embargo, debido a que el formulario también se muestra en este punto, también desencadena un evento «Activate». A partir de ese momento, cada vez que el formulario aparece utilizando el método ‘Show’ o aparece como parte de una jerarquía de formularios, se dispara el evento ‘Activate’, pero no el evento ‘Initialize’.
El evento «Initialize» sólo ocurre una vez, pero el evento «Activate» puede ocurrir muchas veces.
En tu formulario puedes querer establecer valores por defecto de la hoja de trabajo en los controles de entrada, por ejemplo, cajas de texto, para que aparezcan en el primer uso del formulario, pero el usuario puede sobrescribir los valores por defecto y estos nuevos valores permanecerán en su lugar mientras el código se esté ejecutando.
Private Sub UserForm_Initialize()
TextBox1.Value = Sheets("Hoja1").Range("A1").Value
If TextBox1.Value = "" Then
TextBox1.Visible = False
Else
TextBox1.Visible = True
End If
End Sub
Puedes encontrar el evento ‘Initialize’ en el segundo desplegable de la ventana de código, y el nombre del formulario de usuario en el primer desplegable.
Este código utilizará el valor de la celda A1 de la ‘Hoja1’ como valor por defecto en el cuadro de texto creado anteriormente en este artículo. Cuando el formulario aparezca por primera vez, aparecerá el valor por defecto. El usuario puede entonces sobrescribir el valor por defecto y éste se mantendrá. Si la celdaA1 está en blanco, el cuadro de texto estará oculto, de lo contrario será visible.
El valor por defecto también puede ser codificado:
TextBox1.Value = "John Smith"
También puedes querer asegurarte de que los valores que el usuario ha introducido reaparecen cada vez que el usuario abre ese formulario dentro de esa sesión de Excel en particular. El código VBA puede escribir fácilmente los valores de vuelta a las celdas dentro del libro de trabajo usando el evento ‘Exit’ en un control, y reinstaurarlos usando el evento ‘Activate’ en el formulario
Private Sub TextBox1_Exit(ByVal Cancel as MSForms.ReturnBoolean)
Sheets("Hoja1").Range("A10").Value = TextBox1.Value
End Sub
Private Sub UserForm_Activate()
TextBox1.Value = Sheets("Hoja1").Range("A10").Value
End Sub
Este código hará que los valores del usuario sean persistentes y también se asegurará de que se guarden con el resto del libro de trabajo
Guardando su Aplicación y Formularios
Cuando guarde el libro de Excel que contiene sus formularios, todos los formularios y su código VBA se guardarán también. Sin embargo, cualquier valor que los formularios contengan mientras se muestran se perderá.
Es importante escribir el código de forma que cuando el usuario salga del libro o del formulario, los valores se vuelvan a escribir en las celdas del libro y se conserven.
Formularios Modales y No Modales
El propio formulario tiene una propiedad ‘ShowModal’. Por defecto está en True, pero puede cambiarse a False (no modal)
Si un formulario es modal, significa que no se puede acceder a ninguna de las funcionalidades de Excel mientras se está mostrando el formulario. Esto incluye su código en la ventana VBE. Puedes ver el código, pero el cursor y el teclado están desactivados.
En un formulario no modal, puedes acceder a toda la funcionalidad de Excel, incluida la ventana VBE, mientras se muestra el formulario.
Esto es importante desde el punto de vista del control del comportamiento del usuario
Cerrar un Formulario
Por muy bien que se escriba el código para obligar al usuario a seguir un determinado camino, éste puede eludirlo fácilmente haciendo clic en la X de «Cerrar» situada en la esquina superior derecha del formulario.
Puedes evitarlo modificando el evento ‘QueryClose’ del formulario
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
MsgBox "Esta acción está deshabilitada"
End Sub
El evento ‘QueryClose’ se activa cuando el usuario hace clic en la X de ‘Cerrar’ del formulario. Este código cancela la acción, por lo que el usuario se ve obligado a utilizar su botón ‘Salir’ y el código que tiene detrás.
Activación y Desactivación de Controles
Todos los controles de tu formulario tienen una propiedad llamada ‘Enabled’ que se establece en True o False. Si es False, entonces el control está en gris. Se puede ver pero no se puede utilizar.
También hay una propiedad llamada «Visible» que de nuevo se establece en True o False.
Puedes escribir código para inutilizar un determinado control, o para hacerlo totalmente invisible al usuario. Usando una sentencia ‘If’, puedes elegir las circunstancias en las que necesitas hacer esto.
Por ejemplo, podría desactivar el botón ‘Exit’ inicialmente, hasta que el usuario haya introducido un valor en el TextBox1 (Nombre)
Private Sub UserForm_Initialize()
CommandButton1.Enabled = False
End Sub
Private Sub TextBox1_Change()
If Len(TextBox1.Value) > 0 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
Este código utiliza el evento ‘Initialize’ del formulario para deshabilitar el botón de salida (Botón de Comando 1) cuando el formulario aparece por primera vez y luego utiliza el evento ‘Change’ en TextBox1 (nombre) para habilitar el botón Salir si se ha escrito algo o deshabilitarlo si la caja está en blanco.
El evento ‘Change’ se activa cada vez que se escribe o se borra un nuevo carácter de la caja de texto. Si el usuario intenta introducir texto para habilitar el botón y luego borra todo el texto, el botón se deshabilitará instantáneamente