Formas de usuario de VBA
El formulario de usuario es una parte muy importante de la programación en VBA. Le permite crear 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á haciendo con su libro de trabajo.
Por supuesto, puede 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.
Al expandir la altura y el ancho de su formulario de usuario al tamaño de la ventana de Excel, puede hacer que su aplicación se vea como una aplicación normal de Windows, sin que el usuario sepa que está usando Excel como anfitrión.
Todos los controles normales de Windows, como menús desplegables, cuadros de lista y casillas de verificación, están disponibles para usted. También tiene una amplia gama de métodos, eventos y propiedades que puede utilizar para mejorar la experiencia del usuario.
Un punto importante es que cuando muestra un formulario de usuario que está integrado o es modal, no puede editar su código en el VBE ni acceder a ninguna funcionalidad de Excel. Solo cuando el formulario esté cerrado aparecerá el cursor en su código.
Formas de usuario de VBA incorporadas
Excel VBA como varios formularios integrados que se pueden utilizar para comunicarse con el usuario.
Buzon de mensaje
Esta es la forma más utilizada en VBA. Simplemente muestra un mensaje de texto, posiblemente informando al usuario que ha ingresado una entrada no válida o que un proceso de VBA ha terminado de ejecutarse. En su forma más simple, muestran una cadena de texto, pero también puede agregar un ícono como una pregunta o un signo de exclamación, y darle al cuadro de mensaje un título diferente.
Este es un ejemplo básico. Solo hay un botón para hacer clic y la barra de título dice "Microsoft Excel"
El código para producir esto es muy sencillo:
123 | Sub TestMsgBox ()MsgBox "Este proceso se ha completado"End Sub |
Puede usar diferentes parámetros para agregar botones, íconos y cambiar la barra de título
123456789 | Sub TestMsgBox ()Dim Ret como varianteRet = MsgBox ("¿Está seguro?", VbYesNo o vbQuestion, "Mi aplicación")Si Ret = vbYes Entonces'Tu proceso aquíDemásSalir de SubTerminara siEnd Sub |
Este código agrega 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 mediante el operador "O"
Además, cuando devuelve un valor de un cuadro de mensaje, la variable de retorno debe definirse como una variante o vbMsgBoxResult, y la declaración del cuadro de mensaje debe usar corchetes,
Caja de entrada
Hay un cuadro de entrada muy simple integrado en VBA, aunque es bastante restrictivo en lo que puede hacer con él. Si puede, es mejor diseñar un formulario de usuario personalizado
12345 | Sub TestInputBox ()Dim Ret como cadenaRet = InputBox ("Por favor ingrese su nombre", "Ingrese nombre")MsgBox RetEnd Sub |
También puede agregar un valor predeterminado para la entrada en los parámetros.
Obtener nombre de archivo abierto
Esto le permite utilizar el cuadro de diálogo de archivo de Windows dentro de su código VBA. Parece muy impresionante para el usuario cuando se está ejecutando, pero es muy simple de incorporar y automáticamente obtiene toda la funcionalidad de diálogo de archivos con él.
El código restringe al usuario a ver solo archivos de Excel. Desafortunadamente, podrían escribir un nombre de archivo que no sea de 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 haya seleccionado un archivo de Excel.
Utilice el comando "ChDir" para cambiar el directorio predeterminado a sus propios requisitos antes de mostrar el cuadro de diálogo del archivo
Tenga en cuenta el uso de comodines en el parámetro FileFilter. Los archivos de Excel que se mostrarán pueden ser anteriores a 2007, tener macros o ser binarios, por lo que el filtro es ".xls *".
123456 | Sub TestFileDialog ()Atenuar MyFile como cadenaChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Archivos de Excel (* .xls *), *. Xls *", "Seleccionar un archivo")MsgBox MyFileEnd Sub |
Si es necesario, puede permitir que el usuario seleccione varios archivos a la vez mediante el parámetro MultiSelect. El valor predeterminado es Falso (solo selección única)
12345678 | Sub TestFileDialog ()Atenuar MyFile como varianteChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Archivos de Excel (* .xls *), *. Xls *", "Seleccionar un archivo",, True)Para cada f en MyFileMsgBox fSiguiente fEnd Sub |
El usuario mantiene presionada la tecla Mayús en el cuadro de diálogo del archivo para seleccionar varios archivos.
El bucle For Each muestra la ruta completa y el nombre de cada archivo seleccionado
Cuadros de diálogo predeterminados de Excel
Dentro de Excel VBA, hay una colección de Diálogos que puede usar para mostrar cualquier diálogo estándar de Excel. La desventaja es que no puede acceder a los parámetros que el usuario ha elegido o cambiar la apariencia del cuadro de diálogo, pero estos cuadros de diálogo pueden ser útiles para dirigir al usuario a una función estándar de Excel y permitirle elegir parámetros específicos dentro del cuadro de diálogo.
Un buen ejemplo de esto es mostrar el cuadro de diálogo "Imprimir" de VBA:
123 | Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint) .ShowEnd Sub |
Cuando abra los corchetes en la colección de Diálogos, verá una lista de una gran cantidad de constantes para los diálogos integrados. Vale la pena experimentar con algunas de estas opciones dentro de su código.
Insertar un formulario de nuevo usuario
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 | UserForm en la barra de menú de VBE.
Haga clic en "UserForm" y aparecerá un nuevo formulario en blanco listo para que lo desarrolle.
El formulario en sí (que se muestra como "UserForm1") parece bastante pequeño, pero puede usar los controladores que lo rodean para ampliarlo o hacerlo aún más pequeño arrastrando los controladores con el cursor.
Hay una ventana de propiedades en la esquina inferior izquierda de la pantalla. Como el foco está directamente en el formulario en sí, este contiene todas las propiedades del formulario específicas de ese formulario.
Tenga en cuenta que cuando comienza a agregar 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 puede hacer con cada uno de ellos.
Las propiedades que ve actualmente solo se aplican al formulario en sí.
La propiedad "Nombre" es el nombre que se utiliza para definir su objeto de formulario dentro del código VBA. Es posible que desee utilizar algo más significativo para el nombre del objeto, de modo que cuando esté revisando su código, sea obvio qué forma se está utilizando.
La propiedad "Nombre" también se reflejará en la ventana "Explorador de proyectos" en la esquina superior izquierda de la pantalla.
Querrá modificar la barra de título de su formulario a algo diferente de "UserForm1", y puede hacerlo escribiendo su nuevo texto en la propiedad "Título".
Puede realizar una gran cantidad de cambios en la forma en que el usuario ve su formulario. Puede modificar los colores, agregar imágenes, p. Ej. un logotipo corporativo, cambie la posición usando "Izquierda" y "Arriba", cambie el tamaño usando "Alto" y "Ancho", cambie el puntero del mouse y mucho más
Todas estas propiedades también se pueden cambiar mediante programación para cualquier control que haya agregado a su formulario. Por ejemplo, un usuario puede seleccionar de un control de cuadro de lista y es posible que desee deshabilitar u ocultar otros controles según la elección del usuario.
Usando la caja de herramientas
Notará que cuando hace clic en el formulario en sí, aparece una ventana emergente de caja de herramientas. Si hace clic en cualquier otro lugar, p. Ej. 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 agregar los controles normales de Windows con los que los usuarios están familiarizados en su formulario.
Notarás que en el formulario hay una red de puntos. Este es un "snapgrid" para que cuando agregue un control al formulario, alinee automáticamente la posición con las filas y columnas de puntos. Esto ayuda enormemente a alinear sus controles para que no tenga una apariencia irregular de los controles.
Si hace clic en un control y luego decide no usarlo, al hacer clic en el ícono de "Flecha" en la esquina superior izquierda de la caja de herramientas, el cursor volverá a la normalidad.
Puede agregar controles adicionales a la caja de herramientas mediante Herramientas | Controles adicionales en el menú VBE. Hay un número considerable de estos disponibles, pero dependiendo de sus versiones de Windows y Excel, no siempre funcionan, por lo que a menudo se requiere algo de experimentación.
Además, es posible que sus usuarios no tengan acceso a algunos de estos controles adicionales o que estén ejecutando versiones anteriores de Windows y Excel, lo que puede causar problemas. En las grandes organizaciones, especialmente si son globales, no existe una PC de construcción estándar en la que pueda confiar.
Agregar un botón de salida a su formulario
Un botón de comando es fácil de agregar al formulario. Tiene el mismo aspecto que los botones que ve en otros formularios de Windows, generalmente 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 de la izquierda en la fila inferior de iconos. Vea la imagen de arriba. Tiene las letras "ab".
Puede mantener presionado el botón del mouse y arrastrar el control a su formulario, o puede mover el cursor al formulario, donde cambiará a un cursor en forma de "cruz" y puede colocar y ajustar el tamaño del botón.
Si arrastra el control al formulario, obtendrá el tamaño predeterminado del botón. Mover el cursor al formulario le permite cambiar el tamaño del botón arrastrando el cursor en forma de cruz a lo largo de su formulario.
Su formulario ahora se verá así:
El botón tendrá un texto predeterminado como título, pero querrá cambiarlo según sus propios requisitos. 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 "Título" y puede editar el valor para esto. Cambiar esto a "Salir"
Al igual que con las propiedades del formulario, la propiedad "Nombre" define el nombre que se utilizará en su código VBA. Es posible que desee utilizar un nombre que sea más significativo y obvio dentro de su código. Puede ingresar esto en la propiedad "Nombre".
Puede reposicionar el botón arrastrándolo por el formulario, y puede cambiar su tamaño haciendo clic en los controladores de botón (cuadros cuadrados blancos) y arrastrando los controladores para agrandar o reducir
También puede cambiar el tamaño del botón cambiando los valores de Alto y Ancho en la ventana de propiedades
Puede ver su formulario en Excel haciendo clic en el triángulo verde en la barra de herramientas de VBE o presionando F5
Puede llamar a su formulario desde el código VBA dentro de un módulo mediante el método "Mostrar"
123 | Sub ShowForm ()UserForm1.ShowEnd Sub |
Su formulario de usuario es efectivamente un objeto global y se puede llamar desde cualquier lugar dentro de su código.
Actualmente, su botón de comando no hace nada porque no hay ningún código VBA detrás de él. ¡Tienes que escribir esto tú mismo! Todo lo que puede suceder en este momento es que puede hacer clic en la X "Cerrar" en la esquina superior derecha de su formulario.
Para agregar código VBA, haga doble clic en el botón en el formulario
Esto lo llevará a la ventana de código VBA normal y mostrará el evento predeterminado de clic.
Utiliza el método "Ocultar" para cerrar el formulario y también puede agregar cualquier otro código, como un cuadro de mensaje para confirmarle al usuario lo que sucedió.
Tenga en cuenta que la ventana de código tiene dos menús desplegables en la parte superior. El primero le permite seleccionar los controles de su formulario y el segundo muestra todos los eventos que están disponibles para que agregue código. El obvio para un botón es el evento "Clic", pero hay otros como "Doble clic" o "Movimiento del mouse"
Cuando ejecuta su formulario ahora, el botón realmente hace algo. El formulario desaparece y se muestra un cuadro de mensaje que confirma 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 ingresado en su formulario.
Agregar un control de etiqueta a un formulario
Los controles de etiqueta son para indicarle al usuario qué tipo de datos necesita ingresar a un control en el formulario, p. cuadro de texto, menú desplegable, etc. Una etiqueta no tiene bordes por defecto, pero estos se pueden agregar a través de la ventana de propiedades si es necesario.
Como control, son de solo lectura para el usuario y son simplemente una forma de poner texto en el formulario, ya sea un encabezado en negrita o una instrucción de qué ingresar o elegir.
Para agregar una etiqueta, haga clic en el icono "A" en la caja de herramientas (fila superior, segunda desde la izquierda) y haga doble clic en él o mueva el cursor al formulario y seleccione la posición y el tamaño.
Usando la propiedad "Título" en la ventana de propiedades, o haciendo clic en el control de etiqueta, puede ingresar el texto para el control de etiqueta.
Tenga en cuenta que el texto se ajustará según el 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.
Usando la ventana de propiedades, puede cambiar la apariencia del control de etiqueta, con diferentes colores, fuentes, estilo de fondo, p. si se superpone a una imagen y quieres que sea transparente
No es necesario crear ningún código para un control de etiqueta. El propósito principal es agregar texto al formulario para que el usuario pueda ver cómo funcionan todos los demás controles.
Agregar un control de texto al formulario
Se utiliza un control de texto para permitir al usuario ingresar texto, por ejemplo, ingresar un nombre o comentarios
El control de texto se agrega desde la caja de herramientas haciendo clic en el ícono de control de texto (fila superior, tercero desde la izquierda) y haciendo doble clic o arrastrando el control a su posición en su formulario.
El control de texto a menudo se confunde con el control de etiqueta, pero el control de texto es el que se utiliza para la entrada del usuario.
El texto "Ingrese su nombre" es un control de etiqueta, como se describió anteriormente, y ahora tenemos un cuadro de texto blanco listo para que el usuario ingrese algo en
Usando la ventana de propiedades, puede cambiar los colores, fuentes, efectos especiales o usar caracteres de contraseña para su cuadro de texto. Hay una enorme flexibilidad disponible
Una propiedad muy importante para un cuadro de texto es la propiedad "MultiLine". Si desea que el usuario ingrese una gran cantidad de texto en el control de texto, p. Ej. comentarios, la propiedad "MultiLine" debe establecerse en True.
Es un valor predeterminado de Falso, lo que significa que, por muy grande que sea su cuadro de texto, el texto ingresado permanecerá en una línea continua y se desplazará fuera del cuadro de texto. No se envolverá dentro de la caja.
No hay ninguna ventana emergente cuando hace clic derecho en su cuadro de texto cuando se está ejecutando, pero CTRL + V funcionará para Pegar, y CTRL + C funcionará para Cortar, si el usuario desea cortar y pegar texto desde y hacia otros aplicaciones
Nuevamente, debe escribir su propio código para manejar el texto que el usuario ha escrito. Es posible que desee transferirlo a una celda en una hoja de trabajo.
Puede agregar este código en el evento "Cambiar" para el cuadro de texto
123 | Cuadro de texto secundario privado1_Change ()Hojas ("Hoja1"). Rango ("A1"). Valor = Cuadro de texto1.ValorEnd Sub |
Es posible que también desee poner algún código de validación para verificar que el usuario no esté ingresando basura, lo que tendrá efectos desastrosos en su aplicación.
El evento de cambio no es bueno para esto porque se llama cada vez que el usuario escribe un nuevo carácter. El usuario puede comenzar a escribir una cadena de texto y descubrir instantáneamente que ha roto sus reglas de validación antes de haber completado un texto válido.
Utiliza el evento "Salida". Esto se activa cuando el usuario mueve el foco a otro control en el formulario, lo que significa que el usuario ya no ingresa datos.
123456 | Private Sub TextBox1_Salir (ByVal Cancelar como MSForms.ReturnBoolean)Si IsNull (TextBox1.Value) o Len (TextBox1.Value) <4 EntoncesMsgBox "El nombre no es válido", vbCriticalTextBox1.SetFocusTerminara siEnd Sub |
Cuando el usuario hace clic en otro control del formulario, este código prueba un valor nulo en el cuadro de texto o menos de 4 caracteres. Si la prueba es verdadera, aparece un cuadro de mensaje con un icono crítico para informar al usuario que el nombre no es válido y el foco se mueve de nuevo al cuadro de texto ofensivo 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 realizará 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, desencadena un evento "Initialize". Sin embargo, debido a que el formulario también se muestra en este punto, también desencadena un evento "Activar". A partir de ese momento, cada vez que el formulario aparece con el método "Mostrar" o aparece como parte de una jerarquía de formularios, se activa el evento "Activar", pero no el evento "Inicializar".
El evento "Initialize" solo ocurre una vez, pero el evento "Activate" puede ocurrir muchas veces
En su formulario, es posible que desee configurar valores predeterminados de la hoja de trabajo en los controles de entrada, p. cuadros de texto, de modo que estos aparezcan en el primer uso del formulario, pero el usuario puede sobrescribir los valores predeterminados y estos nuevos valores permanecerán en su lugar mientras el código se esté ejecutando
12345678 | Sub UserForm_Initialize privado ()TextBox1.Value = Hojas ("Hoja1"). Rango ("A1"). ValorSi TextBox1.Value = ”” EntoncesTextBox1.Visible = FalsoDemásTextBox1.Visible = VerdaderoTerminara siEnd Sub |
Puede encontrar el evento "Inicializar" en el segundo menú desplegable de la ventana de código y el nombre del formulario de usuario en el primer menú desplegable.
Este código usará el valor en la celda A1 en "Hoja1" como el valor predeterminado en el cuadro de texto creado anteriormente en este artículo. Cuando el formulario aparece por primera vez, aparecerá el valor predeterminado. A continuación, el usuario puede sobrescribir el valor predeterminado y se mantendrá. Si CellA1 está en blanco, el cuadro de texto se ocultará; de lo contrario, será visible
El valor predeterminado también podría estar codificado:
1 | TextBox1.Value = "John Smith" |
También es posible que desee asegurarse de que los valores que el usuario ha ingresado vuelvan a aparecer cada vez que el usuario abre ese formulario dentro de esa sesión de Excel en particular. El código de VBA puede escribir fácilmente los valores en las celdas dentro del libro de trabajo usando el evento "Exit" en un control, y restablecerlos usando el evento "Activar" en el formulario.
123 | Private Sub TextBox1_Salir (ByVal Cancelar como MSForms.ReturnBoolean)Hojas ("Hoja1"). Rango ("A10"). Valor = Cuadro de texto1.ValorEnd Sub |
123 | Sub UserForm_Activate privado ()TextBox1.Value = Hojas ("Hoja1"). Rango ("A10"). ValorEnd Sub |
Este código hará que los valores del usuario sean persistentes y también garantizará que se guarden con el resto del libro de trabajo.
Guardar su solicitud y formularios
Cuando guarda su libro de Excel que contiene sus formularios, todos los formularios y su código VBA también se guardan. Sin embargo, se perderán los valores que retengan los formularios mientras se muestran.
Es importante escribir código para que cuando el usuario salga del libro de trabajo o del formulario, los valores se vuelvan a escribir en las celdas del libro de trabajo y, por lo tanto, se conserven.
Formas modales y no modales
El formulario en sí tiene una propiedad "Mostrar modal". Esto se establece de forma predeterminada en Verdadero, pero se puede cambiar a Falso (no modal)
Si un formulario es modal, significa que no se puede acceder a ninguna de las funciones de Excel mientras se muestra el formulario. Esto incluye su código en la ventana VBE. Puede ver el código, pero el cursor y el teclado están desactivados.
En un formulario no modal, puede 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
Independientemente de lo bien que escriba su código para obligar al usuario a seguir una ruta determinada, puede eludirlo fácilmente haciendo clic en la X "Cerrar" en la esquina superior derecha del formulario.
Puede evitar que esto suceda modificando el evento "QueryClose" del formulario
1234 | Private Sub UserForm_QueryClose (Cancelar como entero, CloseMode como entero)Cancelar = VerdaderoMsgBox "Esta acción está deshabilitada"End Sub |
El evento "QueryClose" se activa cuando el usuario hace clic en la X "Cerrar" del formulario. Este código cancela la acción, por lo que el usuario se ve obligado a usar su botón "Salir" y el código que tiene detrás.
Habilitación y deshabilitación de controles
Todos los controles de su formulario tienen una propiedad llamada "Habilitado" que se establece en Verdadero o Falso. Si es Falso, entonces el control está atenuado. Se puede ver pero no se puede utilizar.
También hay una propiedad llamada "Visible" que nuevamente se establece en Verdadero o Falso.
Puede escribir código para inutilizar cierto control o para hacerlo totalmente invisible para el usuario. Con una declaración "Si", puede elegir las circunstancias en las que necesita hacer esto
Por ejemplo, puede deshabilitar el botón "Salir" inicialmente, hasta que el usuario haya ingresado un valor en el TextBox1 (nombre)
123 | Sub UserForm_Initialize privado ()CommandButton1.Enabled = FalsoEnd Sub |
1234567 | Cuadro de texto secundario privado1_Change ()Si Len (TextBox1.Value)> 0 EntoncesCommandButton1.Enabled = VerdaderoDemásCommandButton1.Enabled = FalsoTerminara siEnd Sub |
Este código usa el evento 'Inicializar' del formulario para deshabilitar el botón de salida (Botón de comando 1) cuando el formulario aparece por primera vez y luego usa el evento 'Cambiar' en TextBox1 (nombre) para habilitar el botón Salir si se ha escrito o deshabilitado algo si el cuadro está en blanco.
El evento "Cambiar" se activa cada vez que se escribe o se elimina un carácter nuevo del cuadro de texto. Si el usuario intenta ingresar texto para habilitar el botón y luego borra todo el texto, el botón se deshabilitará instantáneamente