Está en la página 1de 76

VBA Excel

UserForms

By

Luis E Brito

Copyright 2016
Copyright © 2016 by Luis E Brito
All rights reserved. This book or any portion thereof may not be reproduced or
used in any manner whatsoever without the express written permission of the
publisher except for the use of brief quotations in a book review.
Tabla de Contenidos
Otros Libros Publicados por Luis E Brito
Introducción
Capítulo 1 - UserForms
Capítulo 2 - Controles: Cajas de Texto, Etiquetas y Botones de Comando
Capítulo 3 - Controles: Casilla de Verificación, Botón de Opción, Botón de
Alternar y Marcos
Capítulo 4 - Controles: Lista y Cuadro Combinado
Capítulo 5 - Controles: Barra de Desplazamiento, Botón de Número
Capítulo 6 - Control: Multi Páginas, Imagen y RefEdit
Capítulo 7 - Herramientas de Formato
Capítulo 8 - Eventos
Capítulo 9 - Interacción Entre Formularios, VBA y Hojas de Excel
Resumen
Acerca del Autor
Otros Libros Publicados por Luis E Brito

Amazon US
https://www.amazon.com/dp/B01M8K5120
Amazon México
https://www.amazon.com.mx/dp/B01M8K5120
Amazon US
https://www.amazon.com/dp/B01M674D09
Amazon México
https://www.amazon.com.mx/dp/B01M674D09
Introducción
Los formularios (UserForms) y sus controles constituyen una de las
herramientas que proporciona VBA para el intercambio de información:
Entrada de datos y salida de resultados. Proporcionan la facilidad de diseñar y
crear formularios que son agradable a la vista, y que enfocan la visión del
usuario en los datos que son requeridos para la ejecución de los
procedimientos.
La mayoría de los usuarios no conocen esta utilidad, a pesar de que son fáciles
de diseñar y que proporcionan una interfaz gráfica agradable que mejora la
experiencia del usuario a la hora de ingresar datos a la aplicación. Pueden ser
utilizados como forma de entrada para incorporar datos a una base de datos, o
simplemente para recoger datos que serán utilizados para realizar cálculos y
devolver resultados como si fuesen una aplicación independiente.
En este libro trataremos sobre los formularios, los controles, sus propiedades
y métodos, como diseñar y construir un formulario, como programar los
controles, asociándolos a eventos para que ejecuten los procedimientos que se
requieran.
Finalmente les expreso, a pesar que el material es extenso, que existe una gran
cantidad de propiedades y métodos, que existe una gran cantidad de eventos,
podemos sacar provecho de los formularios (UserForms) si nos enfocamos en
algunos elementos que son importantes. A medida que vayamos avanzando en
el aprendizaje de los elementos fundamentales podemos ir incorporando
nuevos elementos cuando sean requeridos. Una fuente de ayuda muy importante
es el examinador de objetos, se puede recurrir a él para verificar los objetos,
sus propiedades, métodos y la sintaxis.
Sin más, solamente deseo que este libro sea de utilidad y cumpla con su
objetivo de ayudar al lector a comprender y a utilizar los formularios en VBA
Excel.
Capítulo 1 - UserForms
UserForms (Formas o Formularios)
Una forma o formulario (UserForm) es esencialmente una caja de dialogo
construida al gusto y necesidad del usuario, de allí su nombre en inglés: User:
usuario y Form. Forma o formulario. Pero en realidad esta definición se queda
corta. Recordemos las funciones InputBox y MsgBox, donde la entrada se
restringe a un solo elemento, un valor numérico, una cadena de texto, un rango,
una matriz. Pero una forma permite recoger múltiples valores, en las cajas de
texto, permite seleccionar elementos con listas o cajas combinadas,
seleccionar opciones y muchas otras características. También permite
desplegar los resultados de un procedimiento. Pueden intercambiar valores
con las hojas de Excel o puede trabajar independientemente sin intercambiar
valores con las hojas.
En VBA un UserForm es un objeto, con propiedades y métodos, que contiene
otros objetos como cajas de texto, etiquetas, botones, imágenes, etc.
Como todo objeto dentro del modelo sigue las mismas reglas. El operador
punto se utiliza para separar el objeto de sus propiedades y métodos.
UserFormName.Propiedad
UserFormName.Metodo
Las propiedades incluyen aquellas que se utilizan para dar formato a las
características del formulario. Estas propiedades se pueden cambiar mediante
código en VBA, o se pueden cambiar en la ventana de propiedades, si esta
ventana no está visible puede hacerse visible con la tecla F4, o en la barra de
menú, en la pestaña ver, hacer clic en Ventana de propiedades.
Algunas de las propiedades que se pueden cambiar son:
Name
Para cambiar el nombre de la forma. De forma predeterminada VBA asigna a
las formas el nombre genérico UserForm y un número consecutivo. Así la
primera forma que creemos tendrá nombre UserForm1, y la segunda
UserForm2, y así sucesivamente. Sin embargo, se puede cambiar este nombre
por otro nombre que resulte más descriptivo y que tenga significado para el
programador. Con la finalidad de identificar los diferentes objetos se
recomienda colocar un prefijo, y luego el nombre que se desee. Esto no es
obligatorio, pero si recomendable. Por ejemplo, para las formas se utiliza el
prefijo es frm, así que podríamos dar un nombre a la forma frmEmpleados, si
estamos trabajando en una forma para recoger datos de los empleados.
BackColor
Para establecer el color del fondo de la forma. Se puede cambiar en la ventana
de propiedades, y muestra una paleta de colores para la selección.
BorderStyle
Para cambiar el tipo de borde de la forma. Tiene dos valores:
fmBorderStyleNone (0) y fmBorderStyleSingle (1).
Caption
Para colocar una etiqueta en la barra de título de la forma. Por defecto muestra
el título UserForm y un número consecutivo igual al que tiene la propiedad
Name.
Font
Cambia las propiedades asociadas a la fuente utilizada, nombre de la fuente,
tamaño, resaltado, itálica, etc.
ForeColor
Permite definir el color que mostrara la fuente.
Height
Para modificar el alto de la Forma. También se puede modificar el alto
arrastrando el borde inferior, donde aparece un cuadradito de color blanco,
cuando aparezca el cursor como una doble flecha vertical.
Width
Para modificar el ancho de la forma. También se puede modificar el ancho
arrastrando el borde lateral, donde aparece un cuadradito de color blanco,
cuando aparezca el cursor como una doble flecha horizontal.
Cada uno de los controles que se crean en la forma constituyen propiedades
del objeto UserFormName. Por ejemplo, si se crea una caja de texto, TextBox1
se convierte en una propiedad.
Entre los métodos más importantes de los UserformName están Show y Hide.
UserFormName.Show muestra la forma
UserFormName.Hide oculta la forma.
Como se crea una Forma (UserForm)
Una Forma se crea en el editor de Visual Basic. En el menú insertar, que
permite insertar módulos y procedimientos, también tiene la opción de insertar
UserForm. Si se tienen varios proyectos abiertos (Libros) primero debe
seleccionarse el libro donde se desea insertar el UserForm. Luego en la barra
de menú hacer clic en Insertar y seleccionar UserForm.
Se creará una forma vacía con el nombre de UserForm1 en la barra de título, y
aparecerá el cuadro de herramientas con los controles que pueden utilizarse en
la forma. También en el explorador de proyectos aparecerá una carpeta con el
nombre Formularios y en la ventana de propiedades aparecerán las
propiedades de UserForm1.

Un UserForm puede ser visualizado como un lienzo donde colocar los


controles que nos permitirán la introducción de datos, la presentación de
información y resultados.
Caja de Herramientas y Controles
La caja de herramientas muestra, de forma predeterminada, 15 controles, que
pueden ser colocadas dentro de las Formas y dimensionadas al gusto del
usuario. En la siguiente figura se muestra la caja de herramientas. Si se
requieren controles adicionales, se pueden añadir en la barra de menú del
VBE, hacer clic en herramientas y seleccionar controles adicionales.

Para colocar un control en la Forma simplemente seleccione el control


haciendo clic sobre él en el cuadro de herramientas. Luego se posiciona el
cursor sobre la forma, se ancla en un punto haciendo clic, se mantiene
presionado y se arrastra para crear un control.
Los controles y sus funciones se muestran en las siguientes figuras:

El seleccionador de objetos o apuntador se utiliza para seleccionar objetos


que han sido colocados dentro de la forma para su edición o para moverlo.
Las etiquetas (Labels) se utilizan para colocar etiquetas de texto que ayudan a
identificar los controles dentro de la forma, y también pueden ser utilizados
para mostrar valores de otros controles, como barras de desplazamiento,
botones de número y en general de cualquier control que tenga un valor.
Las Cajas de Texto (TextBox) son cajas que se crean para introducir
información y también para mostrar resultados. Como su nombre indica el tipo
de dato que reciben se interpreta como String.

Otras formas de introducir información incluyen seleccionar valores


predefinidos de listas (ListBox) y de cuadros combinados (ComboBox) o
mediante casillas de verificación (Checklist).

Otras formas de introducir información la constituyen los botones de opción y


los botones de alternar. Ambos tipos de botones tienen dos estados True o
False y permiten seleccionar una opción entre varias opciones disponibles.
Cuando existen opciones relacionadas, las cuales son excluyentes entre si se
utiliza el control de marco, el cual limita la selección a una sola opción al
grupo que se encuentra dentro del marco.

Los botones de comandos permiten que se ejecuten procedimientos cuando se


hacen clic sobre ellos. Por lo general también se incluye un botón para
cancelar la forma y cerrarla. La barra de tabulaciones permite manejar un
conjunto de propiedades de un control. Y el control de páginas múltiples
permite crear una forma que contiene múltiples páginas.

Una barra de desplazamiento permite cambiar el valor mediante el uso de un


deslizador. El valor podría asociarse a una caja de texto (TextBox), que
almacenará el valor de la barra de desplazamiento, o también puede ser
asociada a la propiedad caption de una etiqueta (Label). El botón de número
actúa de manera similar que la barra de desplazamiento, pero solo hace
cambios finos al presionar las flechas de incremento. El control de imagen
permite colocar y dar formato a una imagen para ser utilizada dentro de la
forma.
Cada uno de los controles, una vez que son incluidos dentro de la forma,
constituye una propiedad de la UserFormName correspondiente. Los controles
a su vez tienen propiedades, las cuales pueden ser modificadas en la ventana
de propiedades o mediante instrucciones en un procedimiento en VBA. Ahora
estamos solamente presentando los controles que pueden utilizarse dentro de
las formas, en los capítulos siguientes ahondaremos en el uso de ellos,
revisando las principales propiedades.

Convención Utilizada para el Nombre de los Controles


Cuando los controles son creados VBA les asigna un nombre genérico por
defecto (propiedad Name). A las formas las identifica como UserForm1,
UserForm2, y así sucesivamente. Las cajas de texto como Textbox1, Textbox2,
y así con los otros controles, el usuario puede cambiarles el nombre y utilizar
uno que sea más descriptivo y que tenga mayor sentido para el programador.
Sin embargo, para saber que un nombre se refiere a determinado tipo de
control existe la convención de añadir un prefijo al nombre. A continuación, se
muestran los prefijos recomendados, estos prefijos son solo una
recomendación, no son de uso obligatorio, pero ayudan a trabajar con los
controles, sobre todo si existen muchos de ellos en la forma.
Nombre en español: Control (ingles) : Prefijo
Forma o Formulario : UserForm : frm
Etiqueta: Label : lbl
Caja de texto: TextBox: txt
Cuadro combinado: ComboBox: cbo
Lista: ListBox: lst
Casilla de verificación: CheckBox: chk
Botón de opción: Option button: opt
Botón de alternar: Toggle button: tog
Marco: Frame: fra
Botón de comando: Command button: cmd
Barra de tabulaciones:Tab strip: tab
Páginas múltiples: Multipage:mpa
Barra de desplazamientos: ScrollBar: scr
Botón de número: Spin button: spn
Imagen: Image: img
Programando los Formularios y sus Controles
Diseñar el formulario y crear los controles es la primera fase, para que el
formulario y sus controles ejecuten las acciones que se requieren de ellos,
deben ser programados. Para programar un control se debe hacer doble clic
sobre el control que se desea programar o hacer clic en el botón derecho del
ratón para que aparezca el menú contextual, y entonces seleccionar ver código.
Los códigos asociados a los formularios se crean en unos módulos especiales,
que crean unos contenedores de códigos asociados a eventos de los controles
que se están programando. Por ejemplo, para el control botón de comando el
evento más frecuente es el de hacer Click sobre el botón. Para el control caja
de texto, Lista o Caja Combinada el evento más frecuente es el Change. Se
crea un módulo por cada formulario, todos los eventos asociados a los
controles se crearán en este módulo. Para más información sobre eventos ver
el capítulo 8.
Mostrando y Ocultando los Formularios (UserForms)
Una vez que los formularios han sido diseñados, construidos y programados
deben ser llamados para ser mostrados y utilizados y posteriormente ocultados
o cerrados. Esto se logra utilizando los métodos Show (mostrar), Hide
(ocultar), Load (Cargar) y Unload (cerrar).
Mostrando el Formulario (UserForm)
Para mostrar un formulario, se necesita crear un procedimiento que utilice el
método Show del objeto UserFormName. La sintaxis de este método es:
UserFormName.Show [modal]
Esta simple línea de código colocada dentro de un procedimiento permitirá
mostrar un formulario en pantalla. Este procedimiento debe ser incluido en un
módulo estándar de VBA y no en el módulo especial de código para
formularios (UserForms).
Sub MostrarForma ( )
UserForm1.Show
End Sub
Una vez que el formulario aparece en pantalla, se mantendrá visible hasta que
sea ocultado.
Modal o Modeless
El parámetro modal es opcional, y es de tipo Boolean, True, 1, (vbModal) es
el valor predeterminado. False, 0, (vbModeless). Se puede utilizar True o
False, 1 o 0, o las constantes vbModal o vbModeless.
Cuando el formulario está en modal vbModal, valor 1 o True, no se puede
ejecutar ninguna acción en la aplicación hasta que se ejecute el formulario y se
cierre.
Si el parámetro modal está en vbModeles, valor 0 o False, se pueden hacer
manipulaciones a las celdas de la hoja. En el siguiente procedimiento se
muestra la forma frmList y se utiliza modal igual a 0, lo que permite que se
puedan hacer manipulaciones a las celdas de la hoja.
Sub Botón1_Haga_clic_en()
frmList.Show 0
End Sub
Ocultando el Formulario (UserForm)
Para ocultar un formulario se utiliza el método Hide del objeto
UserFormName. El formulario no es visible, pero permanece en memoria. La
sintaxis de este método es:
UserFormName.Hide
Por lo general esta instrucción es incluida dentro de un botón de comando
ubicado en el mismo formulario. Este procedimiento se activa por lo general
utilizando el evento Click del control botón de comando. Por lo general se
puede utilizar una etiqueta descriptiva para identificar el botón, como
cancelar, cerrar o cualquier nombre asociado con ocultar.

Cargando y Cerrando los Formularios (UserForms)


Cargando el Formulario (UserForm)
En algunas ocasiones, si el formulario es muy grande, y tarda mucho tiempo en
cargarse. El usuario tiene la opción de hacer una carga previa a memoria del
formulario, pero sin que esté se muestre en pantalla. Para hacer esto se utiliza
el método Load del objeto UserForm. La sintaxis es:
Load UserFormName
Para la mayoría de los formularios no es necesario utilizar el método Load,
sino simplemente utilizar el método Show.
Cerrando el Formulario (UserForm)
Cuando el formulario no se necesita puede cerrarse y eliminarse de la
memoria. Para hacer esto se utiliza el método Unload, el cual cierra el
formulario y lo elimina de la memoria. Cuando un formulario es cerrado con el
método Unload, los controles creados son reestablecidos a sus valores
originales predeterminados. En esta forma no es posible accesar los valores
que habían sido definidos por el usuario. La sintaxis es:
Unload UserFormName
Capítulo 2 - Controles: Cajas de Texto, Et iquetas y
Botones de Comando
Las cajas de textos (TextBox) y los botones de comandos (Command Buttons)
son los controles más elementales que pueden ser incorporados en una Forma
junto con las etiquetas, las cuales son útiles para identificar el contenido que
será ingresado en las cajas de texto. En su forma más simple, estos controles
se asemejan a la función InputBox en su funcionalidad de recoger un valor
ingresado por el usuario.
Cajas de Texto (TextBox, txt)
Las cajas de texto son incorporadas a la forma haciendo clic sobre el icono
correspondiente en el cuadro de herramientas, luego se posiciona el cursor en
cualquier lugar de la forma y se hace clic para anclar un borde de la caja, se
mantiene presionado el botón del ratón, se arrastra el cursor para crear una
caja del tamaño requerido y se suelta. Esto creará una caja de texto, que tendrá
el nombre textbox1.

La caja de texto muestra en las esquinas y en la parte central de cada lado unos
pequeños cuadrados de color blanco, que son unas agarraderas (handles) que
permiten redimensionar la caja. Cuando se coloca el cursor sobre las
agarraderas de las esquinas aparecerá una flecha en diagonal de doble punta,
haciendo clic y manteniendo presionado el botón del ratón y moviéndola
permitirá cambiar la altura y anchura de la caja en forma simultánea. En los
cuadros de los bordes inferior y superior aparecerá una doble flecha vertical,
haciendo clic y manteniendo presionado movemos y cambiará el alto de la
caja. Igual sucede con los cuadros que están en los laterales izquierdo y
derecho, al moverlos cambiara el ancho de la caja. En cualquier parte del
borde de la caja aparecerá una cruz de flechas de doble dirección, al hacer
clic y mantener presionado, cuando presenta esta forma, permitirá moverá la
caja en cualquier dirección, al soltar el botón del ratón se anclará la caja en su
nueva posición.
En la ventana de propiedades se desplegarán las propiedades de la caja de
texto recién creada. En esta ventana se mostrarán las propiedades del control
que se haya seleccionado, si no se encuentra seleccionado ningún control,
mostrará las propiedades de la forma.

Las propiedades de las cajas de texto que aparecen en la ventana de


propiedades son 42, para esta versión de Microsoft Office (2016). Entre estas
tenemos la propiedad Name, para identificar al control creado, aquí se ha
utilizado la convención de utilizar el prefijo txt para formar el nombre del
control: txtA.
Existe un grupo de propiedades para dar formato a la caja de texto como:
Backcolor, para el color de fondo de la caja de texto,
BackStyle, para dar estilo al fondo.
BorderColor: para dar color a las líneas del borde de la caja de texto.
BorderStyle: para dar estilo a las líneas del borde.
Font: para cambiar el formato de la fuente, incluye nombre de la fuente,
tamaño, resaltado, itálica, etc.
ForeColor: para cambiar el color del texto que se introducirá en la caja de
texto.
Height. Establecer la altura de la caja de texto, también se puede modificar
moviendo las agarraderas que se encuentran en los lados superior e inferior de
la caja de texto.
Width: establecer el ancho de la caja de texto. Se puede cambiar utilizando las
agarraderas que se encuentran en los bordes laterales.
Top: distancia del borde superior de la forma al borde superior de la caja de
texto.
Left: distancia del borde izquierdo de la forma al borde izquierdo de la caja
de texto.
Las propiedades de los controles pueden ser cambiados en la ventana de
propiedades o mediante código en un procedimiento escrito en VBA.
Etiquetas (Label, lbl)
Las etiquetas también se incorporan de igual manera en la forma, haciendo clic
sobre el icono del control etiqueta en la caja de herramientas, luego haciendo
clic en un lugar de la hoja y manteniendo el botón del ratón presionado se
mueve para crear el control del tamaño deseado. Al liberar la etiqueta quedará
posicionada en la forma.
Para manipular el tamaño del control se procede de igual manera que con las
cajas de texto, el control etiqueta genera una caja con las mismas 8
agarraderas ya descritas para las cajas de texto. La manipulación sigue el
mismo procedimiento descrito para las cajas de texto.
Las propiedades que se muestran en la ventana de propiedades son 27. Existe
una propiedad Name, y existe la propiedad Caption que se utiliza para
introducir la cadena de texto que aparecerá en la forma.
Las propiedades que mencionamos para dar formato al control de caja de texto
son utilizadas con este control también:
Backcolor, BackStyle, BorderColor, BorderStyle, Font, ForeColor, Height,
Width, Top, Left.
Botón de Comando (Command button, cmd)
Los botones de comando son controles que permiten iniciar la ejecución de un
procedimiento en base a un evento relacionado con el botón, por lo general el
evento es hacer clic sobre el botón creado, sin embargo, existen otros eventos
que pueden iniciar la ejecución del procedimiento, lo cual veremos más
adelante.
Insertar un botón de comando sigue el mismo procedimiento que ya hemos
descrito, el cambio de alto y ancho también puede hacerse mediante la
manipulación de las agarraderas de la caja del control, o mediante cambios en
la ventana de propiedades.
Finalicemos el diseño de la forma inicial creando un botón para ejecutar una
acción. Como podemos observar en la imagen se ha creado una forma muy
sencilla, con tres elementos: una caja de texto, a la cual le hemos asignado
nombre txtA, una etiqueta con el texto: Introduzca un valor y un botón de
comando con nombre cmdRun y texto Ejecutar.

Este simple formulario se asemeja en funcionalidad a la función InputBox de


VBA, que permite recoger un valor suministrado por el usuario.
Programando el Botón de Comando
Luego de haber diseñado nuestra forma, en este caso hemos creado una caja de
texto, una etiqueta para dar un mensaje y un botón de comando para iniciar la
ejecución de un procedimiento que va a consistir en desplegar un mensaje de
texto (MsgBox).
Para introducir un código asociado al botón de comando que hemos creado,
podemos hacer doble clic sobre el control, o podemos seleccionar el control y
hacer clic con el botón derecho del ratón para desplegar el menú contextual.
En el menú seleccionar ver código. Esto abrirá una ventana de código
especialmente para introducir los códigos asociados a los formularios.
Automáticamente se crea un contenedor de código, asociado al control, desde
el cual hemos abierto la ventana de código, y estará asociado a un evento, el
nombre del procedimiento será igual al nombre del control, seguido por un
guion bajo y el nombre del evento. El evento por defecto será Click. Dentro
del contenedor escribimos el código para el procedimiento.
Private Sub cmdRun_Click()
Dim valor As String
valor = txtA.Text
MsgBox "El valor introducido es " & valor
End Sub
txtA es una propiedad del objeto UserForm1, y Text es una propiedad del
objeto txtA que regresa el valor del texto ingresado en la caja de texto.
La declaración valor = txtA.Text podría haber sido escrita de las siguientes
maneras:
Valor = UserForm1.txtA.Text o inclusive
Valor = Me.txtA.Text
Donde Me se utiliza en sustitución del objeto activo, en este caso UserForm1.
Luego probamos nuestro formulario con la tecla F5, o con el icono de ejecutar
en la barra de menú del editor. Aparecerá la forma lista para ser utilizada.
Introducimos un valor en la caja de texto, por ejemplo 50 y al hacer clic en
botón Ejecutar aparecerá una caja de mensaje (MsgBox) con el Texto:
El valor introducido es 50.
Ahora diseñaremos y construiremos otra forma con más elementos, para
introducir dos valores en dos cajas de texto y obtener el valor de la suma en
una tercera caja de texto. Utilizaremos dos botones de comando, uno para
realizar la suma y otra para borrar el resultado.

El código del botón de comando para sumar es:


Private Sub cmdSumar_Click()
Dim A As Single
Dim B As Single
Dim C As Single
A = txtval1.Value
B = txtVal2.Value
C = A+ B
txtResultado.Value = C
End Sub
El código para el botón de comando borrar es:
Private Sub cmdBorrar_Click()
txtval1.Text = " "
txtVal2.Text = " "
txtResultado = " "
End Sub
Capítulo 3 - Controles: Casilla de Verificación, Botón
de Opción, Botón de Alternar y Marcos
Los controles de casilla de verificación, botón de opción y botón de alternar
son parecidos, en el hecho de que proporcionan una respuesta con dos
posibles resultados, True o False, seleccionado o no seleccionado.

Casilla de Verificación (Checkbox, chk)


La casilla de verificación permite seleccionar una opción al hacer clic sobre
ella (verificar o checar) y si existen varias casillas de verificación se pueden
seleccionar cualquier número de ellas, o todas ellas, no son excluyentes entre
sí. La casilla de verificación tiene dos estados posibles, seleccionado, cuando
tiene la marca de verificado, con valor True y no seleccionado, cuando el
cuadro está vacío, False. Se puede utilizar un marco para agrupar varias
casillas de verificación, para manejarlas en grupo, pero esto no modifica la
independencia de seleccionar las casillas.
La forma de utilizar este control es similar a la descrita para los otros
controles. Este control tiene su propia etiqueta, a través de la propiedad
caption, así que no es necesario utilizar etiquetas de textos para su
identificación.
En el siguiente ejemplo se diseñó una forma con varias casillas de
verificación para seleccionar los ingredientes a utilizar en un sandwich.
El diseño de la forma y sus controles es el que muestra a continuación:

Luego de diseñar la forma se programa el botón de comando para ejecutar un


procedimiento. En este procedimiento utilizamos una serie de estructuras
condicionales para ir evaluando si la casilla de verificación está en posición
Verdadera (True) o Falsa (False).
Private Sub cmdSeleccion_Click()
Dim Texto As String
Dim Texto1 As String
Dim Texto2 As String
Dim Texto3 As String
Dim Texto4 As String
Dim sep As String
sep = ", "
If chkingredient1 Then
Texto1 = chkingredient1.Caption
Texto = Texto1 + sep
Else
Texto = Texto
End If
If chkingrediente2 Then
Texto2 = chkingrediente2.Caption
Texto = Texto + Texto2 + sep
Else
Texto = Texto
End If
If chkingrediente3 Then
Texto3 = chkingrediente3.Caption
Texto = Texto + Texto3 + sep
Else
Texto = Texto
End If
If chkingrediente4 Then
Texto4 = chkingrediente4.Caption
Texto = Texto + Texto4
Else
Texto = Texto
End If
MsgBox Texto
End Sub
Al seleccionar por ejemplo Tomate, Jamón y Tocineta y hacer clic en el botón
seleccionar mostrará un mensaje de Texto con los nombres de los ingredientes
seleccionados: Tomate, Jamón, Tocineta.
Botón de Opción (Option Button, opt)
Con los botones de opción la situación es diferente a la de las casillas de
verificación, porque si se selecciona una opción las otras opciones no pueden
seleccionarse, es decir son mutuamente excluyentes, por ejemplo, si preguntan
por el estado civil, solo puede ser uno en un momento determinado: soltero,
casado, viudo. Si se tienen varios grupos de opciones, ellas pueden ser
diferenciadas, agrupándolas en diferentes marcos, o utilizando la propiedad
GroupName.
Los botones de opción tienen dos valores: seleccionado, True, aparece un
punto negro en el centro del botón y no seleccionado, False, aparece un circulo
en blanco. Cuando uno presiona uno de los botones, se selecciona esa opción y
deselecciona la opción que estaba previamente seleccionada, nunca dos
opciones estarán seleccionadas simultáneamente.
Este control, al igual que el de casilla de verificación tiene su propia etiqueta
de texto, a través de la propiedad caption
El siguiente código permite extraer la información sobre el estado civil,
mediante el uso de una estructura condicional.
Private Sub cmdCivil_Click()
If optSoltero Then
Status = "Soltero"
ElseIf optCasado Then
Status = "Casado"
Else
Status = "Viudo"
End If
MsgBox "El estado Civil es " & Status
End Sub
Marco (Frame, fra)
El control Marco se utiliza para crear una caja y agrupar otros controles
dentro del mismo. Esto con la finalidad de agrupar controles que están
relacionados, y así mejorar el diseño y presentación del formulario. También
se utiliza para agrupar diferentes conjuntos de botones de opción, para limitar
la exclusión de las opciones dentro de cada marco.
Para incluir controles dentro del marco, se recomienda primero crear el
marco, luego crear los controles dentro del marco. Al hacerlo de esta manera
el marco y los controles dentro de él se comportarán como una sola entidad.
Si los controles que se desean incorporar al marco ya han sido creados
previos a la creación del marco, se recomienda mover los controles sobre el
marco, y no el marco sobre los controles. Esto se debe al orden de los
elementos gráficos, al sobreponer el marco sobre los controles, estos quedarán
cubiertos por el marco. Al presentar la forma, los controles dentro del marco
permanecerán ocultos.
El Marco tiene las propiedades comunes a todos los controles:
Name, para dar nombre al control, se recomienda utilizar el prefijo fra,
seguido de un nombre.
Caption, para colocar un título al marco.
Además de las propiedades para establecer el formato del control.

En la figura se muestra una forma con dos grupos de opciones, cada grupo está
incluido dentro de su propio marco, de esta manera la exclusión de las
diferentes opciones queda contenida, y no se afectan entre sí. De esta manera
es posible seleccionar una opción en el marco de la izquierda y seleccionar
una opción en el marco de la derecha.

Botón de Alternar (Toggle Button, tog)


Un botón de alternar permite hacer clic sobre él, permitiendo dos valores:
presionado, verdadero (True) y no presionado, Falso (False). Pero a
diferencia de los botones de opción, permiten ejecutar dos tipos de acción,
dependiendo si el botón está presionado o no.
En su funcionalidad es como una mezcla de botón de comando y botón de
opción. Parecido a un botón de comando, porque se ejecuta cuando se hace
clic sobre él, y parecido a un botón de opción porque tiene dos estados:
presionado (True) y no presionado (False). Aunque existe la posibilidad de un
tercer estado: Null, cuando la propiedad TripleState es establecida como True,
la cual por defecto está establecida como False.
En el siguiente formulario se crea un botón de alternar para realizar la acción
de cambiar el color de fondo de verde a azul.

Al estar presionado el color del fondo es de color verde y al no estar


presionado el color será azul. El código del procedimiento es el que se
muestra a continuación.
Private Sub ToggleButton1_Click()
If ToggleButton1.Value Then
frmTestAlternar.BackColor = vbGreen
Else
frmTestAlternar.BackColor = vbBlue
End If
End Sub
Capítulo 4 - Controles: Lista y Cuadro Combinado
Los controles de lista y de cuadro combinado son similares en el sentido de
que muestran un listado de opciones para que el usuario haga una selección.
Lista (ListBox, lst)
Una Lista es un control, que genera una caja con un listado de elementos
(Items), de los cuales se puede seleccionar uno o varios elementos,
dependiendo del valor de la propiedad Muliselect, la cual tiene 3 valores
posibles:
fmMultiSelectSingle para seleccionar un solo elemento de la lista
fmMultiSelectMulti para seleccionar varios elementos simultáneamente al
hacer clic sobre cada elemento o presionando la barra espaciadora.
fmMultiSelectExtended para seleccionar varios elementos utilizando la
combinación:
Shift + click en cada elemento. Shift (Tecla de mayúscula)
Shift (mantenida en el primer elemento) + clic en el último elemento
seleccionado.
Shift (mantenida en el primer elemento) + tecla de dirección para avanzar
elemento por elemento.
Marcando y arrastrando el ratón sobre los items a seleccionar.
Se pueden seleccionar o deseleccionar haciendo ctrl + clic sobre los
elementos individuales.
Los controles lista tienen la propiedad Name, pero no tienen propiedad
caption, por lo que se puede utilizar un control etiqueta para la identificación
del control. También tiene las propiedades generales de formato comunes a
todos los controles.
Tienen una propiedad RowSource, que permite crear la lista de elementos del
control, ligándolo a un rango o a un nombre de rango de una hoja de Excel.
Si la lista de elementos ocupa más espacio que la caja creada, se incluirá una
barra de desplazamiento vertical colocada en el lateral derecho, para moverse
a lo largo de la lista.

Cuadro Combinado (ComboBox, cbo)


Un control de cuadro combinado es una combinación de caja de texto y lista.
Cuando se inserta un cuadro combinado se crea una caja de texto, que en su
lado derecho tiene un botón con flecha hacia abajo, que al presionarlo
mostrara una lista desplegable (drop down menu). A diferencia de las listas,
que tienen la posibilidad de seleccionar uno o múltiples valores de la lista, un
cuadro combinado solo permite la selección de un solo valor.

Tiene propiedad Name para cambiar el nombre del control, pero no tiene
propiedad Caption para colocar una etiqueta de identificación, por lo que se
necesita un control etiqueta (label) para colocar una identificación al control.
Las propiedades generales para dar formato también aplican a este control,
tales como:
Backcolor, BackStyle, BorderColor, BorderStyle, Font, ForeColor, Height,
Width, Top, Left.
Al igual que el control lista, tienen una propiedad RowSource, que permite
crear la lista de elementos del control, ligándolo a un rango o a un nombre de
rango de una hoja de Excel.
Formas de Poblar una Lista o Cuadro Combinado
Utilizando el método AddItem
Una lista o un cuadro combinado pueden ser cargados utilizando el método
AddItem, en un evento de inicialización del formulario. Utilizando la siguiente
sintaxis:
ObjetoListBox.AddItem ([pvargItem, [pvargIndex])
ObjetoComboBox.AddItem([pvargItem, [pvargIndex])
Donde pvargItem es opcional y es el elemento o fila que se va a añadir a la
lista o cuadro combinado y,
pvargIndex es opcional y es un número entero, que representa la posición del
elemento o fila dentro del objeto. Si se omite el Index, el Item o fila es
ubicado al final de la lista. Index comienza con cero, así que el primer
elemento de la lista tiene index 0. El valor de index no puede ser mayor que el
número total de filas, el cual se establece con la propiedad ListCount.
AddItem no funciona si el ListBox o ComboBox están ligados a datos
mediante la propiedad RowSource, así que, si desean agregar elementos
utilizando el método AddItem, primero debe borrarse el valor de la propiedad
RowSource.
A continuación, un ejemplo de un procedimiento de un evento de inicialización
del formulario, que carga los elementos de la lista utilizando el método
AddItem.
Private Sub UserForm_Initialize()
Me.lstTest.AddItem "Peter"
Me.lstTest.AddItem "John"
Me.lstTest.AddItem "Richard"
Me.lstTest.AddItem "Luis"
Me.lstTest.AddItem "Jorge"
End Sub
Aquí Me se refiere al objeto UserForm activo.
A continuación, se muestra como aparece el control lista luego de la
inicialización.
Se observa que en la caja de lista solo se pueden visualizar 3 elementos, por
lo que aparece una barra de desplazamiento vertical para acceder a los
elementos no visibles dentro de la caja de la lista.
Para un control de caja combinado (ComboBox) procedemos de manera
similar con el método AddItem. Me, se refiere al objeto UserForm Activo,
donde se encuentra el control cuadro combinado y cbopaises es el nombre del
objeto ComboBox.
En lugar de Me podríamos haber utilizado frmTESTCBO.
frmTESTCBO.cbopaises.AddItem "País" es equivalente a
Me.cbopaises.AddItem "País".
Private Sub UserForm_Initialize()
Me.cbopaises.AddItem "Venezuela"
Me.cbopaises.AddItem "México"
Me.cbopaises.AddItem "Colombia"
Me.cbopaises.AddItem "Brasil"
Me.cbopaises.AddItem "Peru"
Me.cbopaises.AddItem "Chile"
Me.cbopaises.AddItem "Ecuador"
End Sub
Aparece una caja de texto, el cual al presionar el botón con flecha en el borde
derecho despliega un menú, con los elementos añadidos con el método
AddItem.
Utilizando la Propiedad RowSource
La propiedad RowSource permite cargar de elementos un control de lista o un
control de caja combinada. RowSource ingresa una referencia a un rango de
celdas dentro de una hoja, el cual es un rango vertical de celdas para una lista
de una sola columna, o un bloque de celdas para una lista de múltiples
columnas. En la siguiente figura se muestra el rango A3:A8, de la hoja datos.
La sintaxis es el nombre de la hoja seguido de un signo de admiración y luego
el rango de las celdas. Si el nombre de la hoja contiene espacios vacíos o
caracteres especiales, debe colocarse el nombre dentro de comillas simples.
Por ejemplo si el nombre de la hoja es datos de listas, la referencia debe
colocarse: 'datos de listas'!A3:A8
La referencia del rango puede ser colocado directamente en la ventana de
propiedades, donde aparece la propiedad RowSource. En la figura se muestra
una porción de la ventana de propiedades del objeto tipo ListBox de nombre
lstGolosinas, con la propiedad RowSource y la referencia del rango.

Al colocar la referencia en la ventana de propiedades automáticamente


aparecerán los elementos dentro de la caja de la lista.
Para el control de caja combinada (ComboBox) funciona de igual manera. En
la ventana de propiedades del control ComboBox se ubica la propiedad
RowSource y se coloca la dirección del rango siguiendo la sintaxis ya
indicada. Nombre de la hoja seguido del signo de admiración (!) y luego el
rango.
En lugar de utilizar la ventana de propiedades también se puede utilizar en un
procedimiento con el evento de inicialización al cargar el formulario.
Private Sub UserForm_Initialize()
Me.cbodatos.RowSource = "datos!A3:A8"
End Sub
La referencia al rango debe colocarse entre comillas dobles y sigue la misma
sintaxis. Nombre de la hoja seguido de signo de admiración (!) y luego el
rango. También se puede utilizar el signo igual dentro de las comillas:
Private Sub UserForm_Initialize()
Me.cbodatos.RowSource = "=datos!A3:A8"
End Sub
Aquí, se aplica la propiedad RowSource al objeto ComboBox. Me, sustituye
al objeto UserForm activo.
Utilizando la Propiedad RowSource con un Nombre de Rango
En lugar de utilizar una referencia a un rango, también se puede utilizar un
nombre de rango. Este nombre de rango puede utilizarse en la ventana de
propiedades del control lista (ListBox) o caja combinada (ComboBox).

El nombre del rango se escribe sin colocar comillas. También se puede


utilizar el nombre de rango en un código de inicialización de la UserForm.
Private Sub UserForm_Initialize()
Me.lstFrutas.RowSource = "Frutas"
End Sub
En este caso el nombre del rango debe colocarse entre comillas dobles.
Nombres de Rangos Dinamicos
Si la lista va a cambiar es necesario modificar el rango asociado al nombre.
Una forma de hacerlo es creando un código que se ejecute con el evento de
inicialización del UserForm.
Private Sub UserForm_Initialize()
Dim UFila As Double
Worksheets("datos").Select
UFila = Range("A" & Rows.Count).End(xlUp).Row
ThisWorkbook.Names.Add "mirango", Range(Range("A3"), Range("A" &
UFila))
Me.lstFrutas.RowSource = "mirango"
End Sub
En este procedimiento de inicialización, se verifica la última fila con
información y se almacena este valor en la variable UFila. Luego se aplica la
propiedad Names al objeto Workbook (ThisWorkbook), para crear un objeto
Names, el cual es una colección de objetos tipo Name. Se aplica el método
Add para añadir un nombre al rango actualizado entre la celda de inicio A3,
hasta la última fila con información en la columna A, "A"&UFila. Finalmente
se aplica la propiedad RowSource y se le asigna el nombre de rango
actualizado.
Utilizando la propiedad RowSource con Tablas
En lugar de crear un nombre de rango, se puede crear una tabla, primero hay
que marcar el rango de celdas que van a constituir la lista de elementos a
incluir con la propiedad RowSource, en el menú insertar, grupo Tablas, se
encuentra el icono Tabla, al hacer clic se activara el "Asistente" para crear una
tabla. Seguir las indicaciones para crear la tabla. Esto creará una tabla con el
nombre Tabla1. Cambiar el nombre. Este nombre se añade a el administrador
de nombres de rango, como si fuese un nombre de rango. La ventaja que tiene
la tabla, es que se actualiza dinámicamente, así que cada vez que se incluya o
se borre una línea, el rango se actualizara.
Este nombre de tabla que creamos se puede utilizar en la propiedad
RowSource en un procedimiento de inicialización del objeto UserForm.
Private Sub UserForm_Initialize()
Me.lstTablaF.RowSource = "TablaF"
End Sub
Me sustituye al UserForm, y lstTablaF es el nombre dado al objeto ListBox,
RowSource es la propiedad aplicada a el objeto ListBox. El nombre de la
tabla se coloca entre comillas dobles: "TablaF". Al inicializar el UserForm, se
cargan los elementos que estén en la tabla creada.
No funciona el nombre de la tabla en la ventana de propiedades. Pero se
puede utilizar sin problema en un procedimiento de inicialización, con el
código mostrado.
Utilizando la Propiedad List y el método AddItem, Añadiendo Elemento
por Elemento
La propiedad List permite agregar elementos a una lista cuando se tienen
múltiples columnas de datos. La sintaxis de esta propiedad es:
Objeto ListBox.List([pvargIndex], [pvargColumn])
Objeto ComboBox.List([pvargIndex], [pvargColumn])
El primer parámetro es el índice de las filas, el segundo parámetro es el
índice de las columnas. Ambos inician en 0 (cero).

Para añadir elementos a una lista podemos utilizar un procedimiento para un


evento de inicialización y cargar los elementos uno por uno. El primer
elemento de las filas, es decir, los elementos ubicados en la primera columna
se deben añadir con el método AddItem, y los restantes con la propiedad List.
Private Sub UserForm_Initialize()
Me.lstLista1.ColumnCount = 3
Me.lstLista1.AddItem "Dia 1"
Me.lstLista1.List(0, 1) = "Lunes"
Me.lstLista1.List(0, 2) = "Espaguetis"
Me.lstLista1.AddItem "Dia 2"
Me.lstLista1.List(1, 1) = "Martes"
Me.lstLista1.List(1, 2) = "Arroz"
Me.lstLista1.AddItem "Dia 3"
Me.lstLista1.List(2, 1) = "Miércoles"
Me.lstLista1.List(2, 2) = "Ensalada"
End Sub

Utilizando la Propiedad Column y el método AddItem, Añadiendo


Elemento por Elemento
La propiedad Colum permite añadir elementos cuando la lista tiene múltiples
columnas. La sintaxis es:
ObjetoListBox.Column([pvargColumn], [pvargIndex])
ObjetoComboBox.Column([pvargColumn], [pvargIndex])
El primer parámetro es el índice de las Columnas y el Segundo parámetro es
el índice de las filas, ambos inician en 0 (cero).

Esta propiedad se parece a la propiedad List, pero tiene los índices


transpuestos. El primer índice es de la columna y el segundo es el de la Fila.
En el siguiente procedimiento de inicialización se cargarán los elementos de
una caja combinada (ComboBox) utilizando la propiedad Column. Los
elementos de la primera columna deben cargarse utilizando el método
AddItem.
Private Sub UserForm_Initialize()
Me.cboCol.ColumnCount = 3
Me.cboCol.ColumnHeads = False
Me.cboCol.AddItem "Matematica"
Me.cboCol.AddItem "Fisica"
Me.cboCol.AddItem "Quimica"
Me.cboCol.Column(1, 0) = "Matias"
Me.cboCol.Column(1, 1) = "Francisco"
Me.cboCol.Column(1, 2) = "Maria"
Me.cboCol.Column(2, 0) = "Mañana"
Me.cboCol.Column(2, 1) = "Tarde"
Me.cboCol.Column(2, 2) = "Noche"
End Sub
Utilizando la Función Array en Combinación con la Propiedad List
Se pueden cargar las listas (ListBox) y las cajas combinadas (ComboBox)
utilizando la función Array en combinación con la propiedad List. La sintaxis
es la siguiente:
ObjetoListBox.List = Array(elemento0, elemento 1…..elementoN)
ObjetoComboBox.List = Array(elemento0, elemento 1…..elementoN)
Este método se utiliza solamente mediante código en VBA, no está disponible
en la ventana de propiedades. En el procedimiento de inicialización se crea un
código como el que se muestra.
Private Sub UserForm_Initialize()
Dim miarreglo As Variant
miarreglo = Array("uno", "dos", "tres", "cuatro", "cinco")
Me.cboArreglo.List = miarreglo
End Sub
Utilizando la Propiedad List y un Objeto Tipo Range para Añadir un
Rango de Celdas de una Hoja
Ya vimos que List puede ser utilizado para cargar una lista elemento por
elemento en conjunto con el método AddItem, también puede se puede cargar
un arreglo unidimensional utilizando la función Array, para cargar un Arreglo
de dos dimensiones de forma completa en un solo paso, también se puede
utilizar la propiedad List.
El arreglo puede originarse en un rango de celdas de la hoja. Así que lo
primero que debemos hacer es crear el arreglo en un rango de celdas de una
hoja.
Copiemos la dirección del rango que hemos creado, ir a la forma (UserForm)
que estamos creando y hacer doble clic, o con el botón derecho despegar el
menú contextual. Seleccionar ver código Aparecerá la ventana de código, con
un contenedor de código. Por defecto aparecerá un contenedor asociado al
evento UserForm_Click, cambiar a uno con el evento UserForm_initialize.
Dentro del contenedor crear un objeto Range y asignarle a la variable objeto
el rango de la tabla que deseamos incluir en la lista (ListBox) o caja
combinada (ComboBox).
Dim miRango As Range (crea la variable para almacenar un objeto tipo
Range).
Set miRango = ThisWorkbook.Worksheets("informe").Range("A2:C6")
Asigna a la variable miRango la referencia al rango en la hoja.
Propiedad ColumnCount
Se debe indicar cuantas columnas de datos se van a utilizar, utilizando la
propiedad ColumnCount. Si se omite este valor, solamente se mostrará la
primera columna del arreglo. Se puede modificar en la ventana de propiedades
para los controles ListBox y ComboBox o utilizando código en un
procedimiento en VBA.
Propiedad ColumnHeads
Se puede indicar si la lista incluye encabezados para las columnas, utilizando
la propiedad ColumnHeads, con valor true. El valor predeterminado es False.
Se puede cambiar en la ventana de propiedades o mediante código en VBA.
Propiedad ColumnWidth
También se puede indicar el ancho de las columnas, utilizando la propiedad
ColumnWidth, la cual tiene la siguiente sintaxis:
Objeto.ColumnWidth = "ancho1; ancho2; ancho3…."
Donde el objeto puede ser un control ListBox o ComboBox. Los anchos se
especifican en unidades de pixeles y están colocados entre comillas dobles y
separados por punto y coma ( ; ). Si no se utiliza esta propiedad se
desplegarán los anchos de columna para ajustarse a los contenidos de cada
columna. Se puede ocultar la presentación de cualquier columna,
estableciendo su ancho en 0.
El siguiente procedimiento muestra el código utilizado en un evento de
inicialización del formulario para cargar un ComboBox con un rango. Primero
mostraremos una porción de la hoja con el rango.

Private Sub UserForm_Initialize()


Dim miRango As Range
Set miRango = ThisWorkbook.Worksheets("informe").Range("A2:C6")
Me.cboRange.ColumnCount = 3
Me.cboRange.ColumnHeads = False
Me.cboRange.List = miRango.Cells.Value
End Sub
Utilizando la Propiedad List y una Variable para Añadir un Rango de
Celdas de una Hoja
En lugar de utilizar un objeto Range, es posible utilizar una variable que sea
igual al rango.
El código de inicialización para este procedimiento es el que se muestra a
continuación:
Private Sub UserForm_Initialize()
Dim ElRango As Variant
ElRango = Worksheets("informe").Range("A2:C6")
Me.lstElRango.ColumnCount = 3
Me.lstElRango.List = ElRango
End Sub

Utilizando la Propiedad Column y un Objeto Tipo Range para Añadir un


Rango de Celdas de una Hoja
En este método se crea un objeto Range de igual manera que se hizo en el
ejemplo anterior con la propiedad List. La diferencia es que cuando se aplica
la propiedad Column, lo que aparece como fila en el rango, se carga como
columna en la lista. Es decir, aparece transpuesto.
Private Sub UserForm_Initialize()
Dim ColRange As Range
Set ColRange = Worksheets("informe").Range("A2:C6")
Me.cboMiRango.ColumnCount = 3
Me.cboMiRango.Column = ColRange.Cells.Value
End Sub
Para que aparezca en el orden correcto hay que aplicar la función transpose al
objeto Range creado.
Private Sub UserForm_Initialize()
Dim A As Range
Set A = Worksheets("informe").Range("A2:C6")
B = WorksheetFunction.Transpose(A)
Me.cboMiRango.ColumnCount = 3
Me.cboMiRango.Column = B
End Sub
Utilizando la Propiedad Column y un Rango de Celdas asignado a una
Variable
En lugar de crear un objeto Range también se puede crear una variable para
que almacene el Rango de la hoja. A continuación, un procedimiento de
inicialización donde la variable A almacena el Rango de la hoja, y la variable
B almacena el valor de la Transpuesta de A. Para que la lista aparezca en
correcto orden, al utilizar la propiedad Column, se debe utiliza la transpuesta
del arreglo A, es decir, el arreglo B.
Private Sub UserForm_Initialize()
A = Worksheets("informe").Range("A2:C6")
B = WorksheetFunction.Transpose(A)
Me.cboMiRango.ColumnCount = 3
Me.cboMiRango.Column = B
End Sub
Propiedades para Enlazar datos de una Columna
Especifica
Propiedad TextColum
La propiedad TextColumn se utiliza para indicar cual columna se utiliza para
recoger datos cuando se utiliza la propiedad Text de un control ListBox o
ComboBox en una lista con múltiples columnas. La sintaxis es
Objeto.TextColumn= Valor
Donde Objeto es un control ListBox o ComboBox y el valor es un número
entero que indica la posición de la columna: 1 para la primera columna, 2 para
la segunda columna. Cuando se utiliza un valor de 0, se muestra el número de
la fila seleccionada (propiedad ListIndex). Si se utiliza -1, se utilizará la
primera columna cuyo ancho (propiedad columnWidth) sea mayor de 0. Este
es el valor predeterminado. Esta propiedad se puede cambiar en la ventana de
propiedades o mediante código en un procedimiento en VBA.
Cuando se utiliza un control ComboBox, en la parte de la caja de texto se
mostrará el valor de la columna especificada con la propiedad TextColumn.
Propiedad BoundColum
La propiedad BoundColumn se utiliza para indicar cual columna se utiliza
para recoger datos cuando se utiliza la propiedad Value de un control ListBox
o ComboBox en una lista con múltiples columnas. La sintaxis es
Objeto.BoundColumn= Valor
Donde objeto es un control ListBox o ComboBox. Y valor es un entero para
indicar la posición de la columna. El valor predeterminado es 1. Cuando se
utiliza un valor de 0, se muestra el número de la fila seleccionada (propiedad
ListIndex). Esta propiedad se puede cambiar en la ventana de propiedades o
mediante código en un procedimiento en VBA.
Propiedades para Restringir la Selección a los Valores en
la Lista de Elementos en la Caja Combinada
En una caja combinada (ComboBox) se puede seleccionar un elemento del
menú desplegable (drop down menu) y también se puede añadir un elemento
que no aparece en la lista, escribiéndolo directamente en la caja de texto. Esto
debido a que este control es una combinación de caja de texto y lista.
Propiedad MatchRequired
Para que se pueda ingresar un elemento nuevo, que no aparece en la lista de
elementos de la caja combinada se requiere que la propiedad MatchRequired
tenga valor False, el cuál es el valor predeterminado. Si el valor de la
propiedad MatchRequired se establece en True, no se puede utilizar ningún
valor que no esté en la lista desplegable. De esta manera la selección queda
restringida a los elementos que están dentro de la lista. Al intentar usar un
valor diferente generará un mensaje de error, indicando Valor de propiedad no
valido.
La propiedad MatchRequired puede ser cambiada en la ventana de
propiedades o mediante código en procedimientos VBA.
Si MatchRequired tiene valor False, se puede escribir un valor en la caja
combinada, pero no se incluye dentro de la lista. Para que se incluya en la lista
hay que escribir un procedimiento que al determinar que el nuevo elemento no
está dentro de la lista, lo añada a la lista para que esté disponible para un uso
futuro.
Propiedad Style
Esta propiedad permite cambiar el estilo de la lista desplegable (Dropdown
menu). Esta propiedad tiene dos valores:
0 - fmStyleDropDownCombo. Este es el valor predeterminado, y hace que la
caja de texto pueda ser utilizada para ingresar información que no está en la
lista.
2 - fmStyleDropDownList. Este valor hace que la caja de texto de la caja
combinada no acepte que se escriban valores. Se restringe la entrada solo a
los elementos que están en la lista.
Esta propiedad puede ser modificada en la ventana de propiedades o mediante
código en VBA.
Capítulo 5 - Controles: Barra de Desplazamiento,
Botón de Número
Estos dos controles permiten asignar valores numéricos a la propiedad de un
objeto, el cual puede ser un rango de una hoja, el valor de una caja de texto, el
valor de una etiqueta.

Barra de Desplazamiento (ScrollBar, scr)


Una barra de desplazamiento es un control que tiene dos botones uno para
disminuir y otro para aumentar una cantidad fija, la cual se establece con la
propiedad SmallChange (cambio pequeño). Cuando se hace clic en la zona de
la barra deslizadora, entre los botones, los cambios se efectúan de acuerdo al
valor de la propiedad LargeChange (cambio grande). En la barra tiene un
deslizador, que puede ser movido con la ayuda del ratón haciendo clic y
manteniendo presionado. Los botones y la zona de la barra pueden ser
accionados clic a clic, o manteniendo presionado. La barra de desplazamiento
puede colocarse en forma horizontal o en forma vertical, dependiendo de las
dimensiones de la altura y del ancho. Si el ancho es mayor que la altura,
automáticamente se creara una barra de desplazamiento horizontal, en caso
contrario se creara una barra de desplazamiento vertical.
La barra desplazamiento tiene las propiedades Max, para establecer el valor
máximo, el cual tiene un valor predeterminado de 32767 y Min para establecer
el valor mínimo, el cual tiene un valor predeterminado de 0. Estos valores se
pueden cambiar en la ventana de propiedades o mediante código en un
procedimiento en VBA.
En la siguiente figura se muestra una forma donde se han creado tres cajas de
texto y dos barras de desplazamiento, que controlan los valores en las cajas de
texto 1 y 2. La caja de texto 3 muestra el resultado de la multiplicación de los
valores que contienen las cajas 1 y 2.

Para que los valores de las barras de desplazamiento se copien a las cajas de
texto se crean procedimientos que se ejecutan con el evento Change. Cada vez
que se haga un cambio en las barras de desplazamiento se ejecutara el
procedimiento. A continuación, los procedimientos para los eventos Change de
las dos barras de desplazamientos.
Private Sub scrbar1_Change()
Me.txtVal1.Value = scrbar1.Value
Me.txtVal3.Value = Val(Me.txtVal1.Value) * Val(Me.txtVal2.Value)
End Sub
###
Private Sub scrBar2_Change()
Me.txtVal2.Value = scrBar2.Value
Me.txtVal3.Value = Val(Me.txtVal1.Value) * Val(Me.txtVal2.Value)
End Sub
Cuando se acciona cualquiera de las barras de desplazamiento se efectúa la
multiplicación de los valores que contengan las cajas de texto 1 y 2 y el
resultado se colocara en la caja de texto 3. Los valores almacenados en las
cajas de texto son de tipo String, por lo que para transformarlos en números se
utiliza la función Val.
En resumen, las propiedades más importantes de las barras de desplazamiento
(ScrollBar) son las siguientes:
Name: Para asignar un nombre al control
ControlSource: Identifica la dirección de una celda de una hoja o de un campo
ligado al control. El valor predeterminado es una cadena de texto vacía. Un
ControlSource solo puede estar ligado a un control.
LargeChange: Para establecer el cambio grande, cuando se presiona en la zona
de la barra de desplazamiento ubicada entre los dos botones.
SmallChange: Para establecer el cambio pequeño, cuando se presiona en los
dos botones laterales de la barra de desplazamiento.
Max: Valor máximo de la barra de desplazamiento.
Min: Valor mínimo de la barra de desplazamiento.
Orientation: Determina la orientación que tendrá la barra de desplazamiento,
tiene tres valores: Auto, -1, fmOrientationAuto; Vertical, 0,
fmOrientationVertical; Horizontal, 1, fmOrientationHorizontal. La propiedad
Orientation tiene el valor predeterminado en Auto, por lo que la barra de
desplazamiento tendrá una orientación dependiendo de las dimensiones de alto
y ancho del control-
Botón de Número (Spin Button, spn)
El control de Botón de número (Spin Button) funciona de manera similar que
el control de barra de desplazamiento (ScrollBar), la diferencia es que el
control de botón de número solo tiene dos botones, uno para disminuir y otra
para incrementar en una cantidad establecida con la propiedad SmallChange,
la cual tiene un valor predeterminado de 1. No muestra una barra entre los
botones, por lo que no tiene la propiedad LargeChange.
Tiene la propiedad Name para cambiar el nombre del control, pero no tiene
propiedad caption. Tiene las propiedades generales que son utilizadas para
dar formato al control.
La propiedad ControlSource funciona de igual manera que para el control
barra de desplazamiento.
El valor del control se puede asociar a una caja de texto o a una etiqueta para
que se actualice utilizando un procedimiento asociado a un evento Change del
control SpinButton. En el siguiente procedimiento asociado a un evento
Change del control spnVal1 se liga el valor del control txtVal1 al valor del
control spnVal1.
Private Sub spnVal1_Change()
Me.txtVal1.Value = Me.spnVal1.Value
End Sub

Se pueden establecer los valores mínimo y máximo utilizando las propiedades


Min y Max, las cuales pueden ser cambiadas en la ventana de propiedades o
mediante código en un procedimiento en VBA.
Capítulo 6 - Control: Multi Páginas, Imagen y RefEdit
Control Multi Páginas (Multipage, mpg)
Cuando el formulario tiene muchos controles, puede dar la sensación de estar
sobrecargada, creando una muy mala impresión en el usuario. Si es necesario
incluir una gran cantidad de controles, lo recomendable es agrupar los
controles por el tipo de información que van a recoger, y dividirlos en
diferentes páginas, de forma que en cada página aparezcan pocos controles
para manejar información relacionada. La idea es no abrumar al usuario con
una forma con demasiados controles en ella. Para añadir un control multi
página hacer clic en la caja de controles sobre el icono del control y se coloca
dentro de la forma.
Cuando se crea un control multipágina se crean dos páginas de forma
predeterminada, si se desea crear una nueva página, eliminar una página,
cambiar de nombre o mover, se puede hacer clic sobre el botón derecho del
ratón y aparecerá un menú contextual con estas opciones.

Cada página actúa como si fuese una forma individual, tiene su propia ventana
de propiedades para cambiar las propiedades de cada página. Entre las
propiedades están:
Name, para dar nombre a cada página.
Caption, para colocar la etiqueta en la pestaña que identifica la página.
En cada página pueden colocarse los controles que se requieran y su
programación es como si se tratase de una forma independiente.
Control Imagen (Image, img)
Este control se utiliza para insertar una imagen en el formulario. La imagen
puede ser insertada utilizando la propiedad Picture en la ventana de
propiedades. Las dimensiones de la caja son en pixeles de ancho y alto. La
imagen puede ser un logo, o algún motivo alusivo al formulario para hacerlo
mas interesante.
El control imagen (Image) tiene como todos los controles una propiedad
Name, para asignarle un nombre y las propiedades generales para dar formato
al control como:
BackColor, BackStyle, BorderColor, BorderStyle, Height, Left, Top, Width.
Y tiene unas propiedades para controlar la imagen:
Picture, para seleccionar el archivo de la imagen que se desea mostrar. Abre
una caja de dialogo para seleccionar el archivo a mostrar en la caja de
imagen.
PictureAlignment, Para alinear la imagen dentro de la caja. Tiene 5 valores:
- fmPictureAlignmentTopLeft, 0
- fmPictureAlignmentTopRight, 1
- fmPictureAlignmentCenter, 2
- fmPictureAlignmentBottomLeft, 3
- fmPictureAlignmentBottomRight, 4
Por defecto la imagen está alineada en el centro.
PictureSizeMode, Para determinar la forma en que se mostrara la imagen, en
caso de que el tamaño sea diferente al tamaño de la caja. Presenta 3 valores:
- fmPictureSizeModeClip, 0. Si la imagen es de mayor tamaño que la caja
creada solo aparece una porción de ella (clip)
- fmPictureSizeModeStretch, 1. La imagen ocupa toda la caja, pero aparece
deformada, estirada para lograr abarcar todo el marco (no se conserva la
relación de aspecto)
- fmPictureSizeModeZoom, 3. La imagen ocupa todo el marco, pero mantiene
la relación de aspecto.
-PictureTiling, Si la imagen está en el modo de fmPictureSizeModeZoom y no
completa todo el cuadro, se añaden porciones de la imagen para ocupar todo
el cuadro si el valor de la propiedad PictureTiling es True.
SpecialEffect, para crear un efecto especial en la imagen que se inserta en el
cuadro de imagen. Tiene 5 valores:
- fmSpecialEffectFlat, 0.
- fmSpecialEffectRaised, 1.
- fmSpecialEffectSunken, 2.
- fmSpecialEffectEtched, 3.
- fmSpecialEffectBump, 6.
Control RefEdit (RefEdit,rfe)
Este control no aparece de forma predeterminada en la caja de herramientas,
para añadirlo hay que ir al menú en VBE y en la pestaña de herramientas
seleccionar
Al hacer clic aparece una caja de dialogo, con un listado bastante grande de
controles de aplicaciones de Microsoft y de otros fabricantes, se localiza el
control que deseamos incluir en la caja de controles y se marca. Aparecerá en
la caja de herramientas.
El control RefEdit permite crear una caja para recoger la dirección de un
rango en una hoja. La dirección será recogida en la caja creada al marcar el
rango sobre la hoja. También se puede ingresar la dirección directamente,
escribiendola.
A continuación, se muestra una forma donde se incluye un control RefEdit, una
caja de texto y un botón de comando. Se va a realizar un procedimiento muy
sencillo que consiste en seleccionar un rango y calcular la suma de los valores
contenidos en el rango.

Se programó el botón de comando con un procedimiento asociado al evento


Click. Para usar la cadena de texto que representa el rango se está creando un
objeto Range de nombre miRango y se está haciendo igual a
Range(rfeRango1.Text), donde rfeRango1 es el nombre del control RefEdit y
Text es una propiedad que devuelve un valor tipo String. La función suma se
está introduciendo con la propiedad WorksheetFunction, la cual permite
utilizar una función de Excel.
Private Sub cmdGO_Click()
Dim miRango As Range
Set miRango = Range(rfeRango1.Text)
Me.txtResultado = WorksheetFunction.Sum(miRango)
End Sub
Capítulo 7 - Herramientas de Formato
Los formularios (UserForms) además de servir como un método de entrada y
salida de datos, constituyen una interfaz gráfica, que permiten la creación de
formas con un diseño agradable a la vista, con elementos que tienen las
dimensiones adecuadas, tienen una apariencia homogénea, están alineados,
muestran separación proporcional y los elementos que deben ser agrupados se
muestran agrupados, todo con la intención de facilitar la entrada de datos y
presentación de resultados.
Para acceder a las herramientas de formato de las formas, hay que seleccionar
la pestaña Formato en la barra de menú. Se desplegará un menú con las
opciones mostradas en la figura.

Alinear
Permite alinear los elementos seleccionados dentro de la forma. Para
seleccionar varios elementos hacer Ctrl + clic sobre cada uno de los
elementos, o haciendo clic sobre la forma y arrastrando para dibujar un
rectángulo sobre la forma, los controles que están dentro del rectángulo serán
seleccionados. Las opciones de alineamiento son:
Alineación en sentido horizontal: Izquierda, Centro, Derecha
Alineación en sentido vertical: Superior, Medio, Inferior y
Alineación a la cuadricula.
Los elementos deben estar seleccionados antes de aplicar el formato de
alineación.
Igualar Tamaño
Permite hacer que las dimensiones de alto, ancho o ambas simultáneamente
sean iguales en los elementos seleccionados dentro de la forma. Tiene tres
opciones: igualar alto, igualar ancho e igualar ambos.
Ajustar Tamaño al Contenido
Si la caja tiene un texto asociado a la propiedad caption, el tamaño de la caja
del control se ajustará automáticamente al tamaño del texto.
Ajustar tamaño a la Cuadrícula
La caja del control se ajustará para que coincida con la marca de la cuadricula
más próxima.
Espacio Horizontal
Permite que los elementos seleccionados estén igualmente espaciados en el
sentido horizontal. Tiene 4 opciones: Igualar espaciamiento. Aumentar
espaciamiento, Disminuir espaciamiento y Quitar espaciamiento.
Espacio Vertical
Permite que los elementos seleccionados estén igualmente espaciados en el
sentido vertical. Tiene 4 opciones: Igualar espaciamiento. Aumentar
espaciamiento, Disminuir espaciamiento y Quitar espaciamiento.
Centrar en el Formulario
Permite centrar los elementos seleccionados en el formulario. Tiene dos
opciones: Centrar los elementos en el sentido horizontal y centrar los
elementos en el sentido vertical.
Organizar los Botones
Permite organizar los botones de comando y ubicarlos en una posición
seleccionada. Tiene dos opciones: Abajo y Derecha.
Agrupar y Desagrupar
Agrupar permite agrupar varios elementos y manejarlos como una sola unidad,
y Desagrupar permite desagrupar un grupo de elementos previamente
agrupados, a fin de manipular cada elemento por separado.
Orden
Cuando existen elementos que se sobreponen, es posible decidir cuál elemento
está al frente y cual elemento detrás. Tiene cuatro opciones: Traer al frente,
Enviar hacia atrás, Traer adelante y Enviar al fondo.
Formato Utilizando Propiedades
Adicional a estas herramientas de formato, existen un conjunto de propiedades
que permiten modificar algunas de las características de formato de los
controles. Estas propiedades pueden cambiarse en la ventana de propiedades
o utilizando código en procedimientos de VBA. Estas propiedades son:
Height, cambia el alto del control.
Width, cambia el ancho del control.
Top, cambia la posición del control con respecto al borde superior del
formulario.
Left, cambia la posición del control con respecto al borde izquierdo del
formulario.
BackColor, cambia el color de fondo del control.
BackStyle, cambia el estilo del fondo.
Font, cambia el tipo de fuente, tamaño, resaltado, itálica y otros.
ForeColor, cambia el color de la fuente que utiliza el control para el texto que
se coloca con la propiedad caption, o el texto que es ingresado como dato en
una caja de texto o en una lista o caja combinada.
Capítulo 8 - Eventos
Los formularios y sus controles pueden ser programados para que reaccionen
a eventos, es decir que hagan una acción cuando algo ocurre. Un evento puede
ser cambiar el valor de una caja de texto, cambiar el valor de una barra de
desplazamiento, hacer clic en un botón de comando y muchos otros. En los
ejemplos que hemos realizado durante el desarrollo de este libro se han
utilizado eventos, sin embargo, no se habían definido formalmente.
Para especificar la forma en que el formulario o un control reaccionara a un
evento se debe escribir un procedimiento, el cual va contenido dentro de un
contenedor de código, que es generado automáticamente en el módulo del
formulario (UserForm). Para acceder a la ventana de código, y escribir un
procedimiento asociado a un evento se puede hacer doble clic sobre el
formulario o sobre alguno de los controles, o se puede hacer clic en el botón
derecho del ratón para desplegar un menú contextual, allí seleccionar y hacer
clic en la opción ver código.

En la ventana de código se creará un contenedor asociado a un control y a un


evento, si el control es un botón de comando se generará un contenedor para un
evento de hacer clic sobre el botón. Sin embargo, se pueden seleccionar otros
objetos y otros eventos de acuerdo a lo que se requiera manipulando los
menús desplegables que se encuentran en la parte superior de la ventana de
código.
El nombre del procedimiento Sub que se crea es una combinación del nombre
del formulario o del control, seguido por un guion bajo y el nombre del evento
con un par de paréntesis vacíos.

En la parte superior izquierda está el menú de los controles, incluyendo la


UserForm y en el lado derecho aparece el menú de los eventos asociados a los
controles que se seleccionen.

Por ejemplo, para los botones de comando se tienen los siguientes eventos:
BeforeDropOver
BeforeDropOrPaste
Click
DblClick
Enter
Error
Exit
KeyDown
KeyPress
KeyUp
MouseDown
MouseMove
MouseUp
Siendo el evento click el evento usado con mayor frecuencia para los
controles de botón de comando.
Para los controles de caja de texto (TextBox) y las barras de desplazamiento y
botón de número el evento Change es el más utilizado.
A continuación, mostraremos los procedimientos asociados a los eventos para
los controles caja de texto y botón de comando del formulario de ejemplo.
Dim A As Double
Dim B As Double
Dim C As Double
###
Private Sub cmdSumar_Click()
C = A+ B
Me.txtC = C
End Sub
###
Private Sub txtA_Change()
A = Val(Me.txtA.Text)
End Sub
###
Private Sub txtB_Change()
B = Val(Me.txtB.Text)
End Sub
Capítulo 9 - Interacción Entre Formularios, VBA y
Hojas de Excel
Los formularios constituyen una de las opciones para el intercambio de
información con los procedimientos en VBA y con las hojas de Excel. En los
formularios se tienen varios controles que recogen información del usuario,
como lo son las cajas de texto, cuadros de listas, cajas combinadas, casillas
de verificación, botones de opción, barras de desplazamiento, botones de
número y otros.
Interacción Entre el Formulario y VBA
Los valores que son recogidos en los controles pueden ser asignados a
variables dentro de VBA, y ser utilizados en procedimientos. Existen
procedimientos de lectura, donde los valores de un control son asignados a
una variable y existen procedimiento de escritura donde los resultados del
procedimiento son enviados de vuelta al formulario, a un control que puede
ser una caja de texto, una etiqueta o un cuadro de lista.

El intercambio de información puede realizarse sin necesidad de incluir las


hojas de Excel.
Procedimiento de Lectura
Lee un valor del formulario (UserForm) y lo incorpora a un procedimiento.
Este tipo de declaración tiene la siguiente sintaxis:
Variable = UserFormName.ControlName.Text
Variable = UserFormName.ControlName.Value
Estas declaraciones pueden incluirse en eventos Change o en eventos Click. A
continuación, un ejemplo de un procedimiento que utiliza un evento Change
para recoger el valor de una caja de texto (TextBox) y asignarlo a una
variable.
Private Sub txtValA_Change()
A = Val(frmEjemplo2.txtValA.Value)
End Sub
Procedimiento de Escritura
Una vez que se ejecuta el procedimiento los resultados pueden ser devueltos
al formulario utilizando declaraciones de escritura, las cuales tienen la
siguiente sintaxis:
UserFormName.ControlName.Value = Expresión
UserFormName.ControlName.Text = Expresión
Se puede utilizar una etiqueta para devolver un valor al formulario:
UserFormName.LabelControlName.Caption = Expresión
También se puede utilizar un control de Lista, utilizando el método AddItem.
UserFormName.ListBoxName.AddItem Expresion
Donde expresión puede ser una variable que almacena el valor de un cálculo o
una expresión aritmética propiamente dicha que es ejecutada dentro de un
procedimiento asociado a un evento como hacer clic en un botón de comando
o al evento Change de algún control, como una caja de texto. A continuación,
un procedimiento para un evento Click de un botón de comando, que realiza
una operación aritmética y devuelve el resultado a una caja de texto.
Private Sub cmdMultiplicar_Click()
C = A*B
frmEjemplo2.txtValC.Value = C
End Sub
Interacción Entre el Formulario y la Hoja
Propiedad ControlSource
La propiedad ControlSource permite enlazar el valor de un control con una
celda de la hoja, el enlace es en ambas direcciones. Los controles que tienen
esta propiedad son:
Caja de Texto (TextBox)
Lista (ListBox)
Caja Combinada (ComboBox)
Casilla de Verificación (CheckBox)
Botón de Opción (Option Button)
Botón de Alternar (Toggle Button)
Barra de Desplazamiento (ScrollBar)
Botón de Número (Spin Button)
Esta propiedad puede ser cambiada en la ventana de propiedades o utilizando
un procedimiento en VBA.

La dirección se coloca con la siguiente sintaxis: nombre de la hoja seguido de


un signo de admiración y la dirección de la celda: Hoja1!A1. Si el nombre de
la hoja tiene espacios o caracteres especiales hay que colocar el nombre de la
hoja entre comillas simples, 'mi hoja'!A1.
Propiedad RowSource
RowSource es una propiedad de los controles Lista (ListBox) y Caja
Combinada (ComboBox), que permite asociar un rango de una hoja con los
elementos de una Lista o de una caja combinada.
La referencia al rango tiene la siguiente sintaxis, nombre de la hoja seguido de
signo de admiración (!) y el rango en formato A1, ejemplo: Hoja1!A2:A8. Si
el nombre tiene espacios vacíos debe encerrarse entre comillas simples,
ejemplo: 'mi hoja'!A2:A8.
Si la Lista o la Caja Combinada tiene múltiples columnas hay que establecer
el número de columnas con la propiedad ColumnCount, para que las columnas
aparezcan en el cuadro de Lista o Caja Combinada creado.
La propiedad RowSource y ColumnCount pueden ser cambiadas en la ventana
de propiedades o mediante código en un procedimiento en VBA.
Utilizando código de VBA para Enlazar Formulario y
Hoja de Excel
Se pueden utilizar declaraciones de lectura y escritura para leer los valores
desde un formulario y escribirlos en una hoja.
Declaraciones de Lectura
Se pueden leer los valores almacenados en los controles y asignarlos a una
variable. La sintaxis es la siguiente:
Variable = UserFormName.ControlName.Text
Variable = UserFormName.ControlName.Value
Ejemplo:
ValorA = UserForm1.txtValor.Value
Asigna a la variable ValorA el contenido del control Caja de Texto de nombre
txtValor.
Declaraciones de Escritura
Se pueden escribir valores almacenados en variables, o en las propiedades
Text o Value de los controles a rangos de celdas de la hoja.
Referencia del Rango = Variable
Referencia del Rango = UserFormName.ControlName.Text
Referencia del Rango = UserFormName.ControlName.Value
Ejemplo:
Worksheets("Hoja1").Range("A1") = Me.txtA.Value
Coloca el valor del control Caja de texto de nombre txtA del formulario activo
(Me) en la celda A1 de la Hoja1 del libro activo.
Utilizando El Formulario de Forma Independiente
Los formularios, a pesar de que son parte de la aplicación Excel, pueden ser
diseñados y programados para ser "seudo independientes". Decimos seudo
independientes porque no se utilizan las hojas de cálculo de Excel para
almacenar o intercambiar información con el formulario, pero no son
totalmente independientes, porque tienen que ser ejecutados desde la
aplicación.
Todo el proceso de entrada de datos, procesamiento y salida de resultados se
realiza entre los formularios y VBA. La entrada y salida de datos en el
formulario y VBA para programar la lectura, procesamientos, cálculos y
escritura de vuelta al formulario.
Para dar la impresión de que el formulario es una aplicación independiente se
puede programar para que el objeto Application (Excel) tenga la propiedad
Visible igual a False, una vez que la forma se muestre. Hay que recordar que
debe tenerse un botón dentro del formulario que regrese la visibilidad de
Excel, porque si no pasaremos un momento de angustia tratando de ver como
recuperamos Excel. En caso de que eso suceda tendríamos que recurrir al
administrador de tareas, y desde allí cerrar la sesión de Excel. Cuando Excel
se abre por defecto la propiedad Visible está en True, entonces las hojas de
Excel son visibles. A continuación, los procedimientos para hacer que un
formulario parezca como una aplicación independiente.
1.- Crear el formulario de la forma normal, con los controles que se requieran.
2.- Crear un botón en una hoja y programarlo para ocultar Excel y abrir el
formulario.
Public Sub HacerInvisibleExcel()
Application.Visible = False
frmList.Show
End Sub
Es importante el orden de las declaraciones. Primero hay que ocultar la
aplicación y luego mostrar el formulario.
3.- Cuando se cree el formulario crear un botón, que al ocultar el formulario
haga que la propiedad Visible de la Application regrese a su valor True.
Private Sub cmdCerrar_Click()
Application.Visible = True
Me.Hide
End Sub
En caso de que se desee cerrar con la X en la parte superior derecha de la
barra de título es conveniente programar el evento UserForm_QueryClose
para que también devuelva la visibilidad de Excel.
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.Visible = True
Me.Hide
End Sub
Resumen
En este libro hemos presentado una visión general de los formularios
(UserForms), y los controles estándar que se presentan en la caja de
herramientas, revisando el uso de los mismos.
Hemos revisado la forma de diseñar y construir los formularios, las
herramientas para dar formato, las propiedades más importantes de los
controles, la forma en que se cambian los valores de estas propiedades
utilizando la ventana de propiedades o mediante código en procedimientos en
VBA.
Se ha revisado la forma de programar los formularios y sus controles
utilizando los diferentes eventos que proporcionan los controles.
Se ha visto la forma en que interactúan los formularios con VBA y con las
hojas de Excel. La forma en que pueden utilizarse los Formularios como si
estos fuesen una seudo aplicación.
A lo largo de los 9 capítulos de este libro se ha tratado de mostrar el lado
practico de los conceptos y se han añadido una gran cantidad de figuras y
ejemplos para ayudar a la comprensión de los mismos.
Sinceramente espero que este libro haya sido de utilidad para ti, y de ser así
por favor recomiéndalo a tus amigos.
Acerca del Autor
Luis Brito es un consultor de Ingeniería. Ha tenido interés en VBA para Excel
por más de 15 años y ha recopilado durante este tiempo una gran cantidad de
notas de diferentes fuentes que han servido para la preparación de este libro.
Ha escrito una gran cantidad de artículos sobre el uso de VBA Excel y ha
escrito varios libros de la serie VBA Excel, del cual este es la tercera entrega.