Documentos de Académico
Documentos de Profesional
Documentos de Cultura
net
VBA Excel
UserForms
By
Luis E Brito
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
Amazon US
https://www.amazon.com/dp/B01M8K5120
Amazon México
https://www.amazon.com.mx/dp/B01M8K5120
Amazon US
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
nombre Formularios y en la ventana de propiedades aparecerán las
propiedades de UserForm1.
www.fullengineeringbook.net
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:
www.fullengineeringbook.net
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).
www.fullengineeringbook.net
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.
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.
www.fullengineeringbook.net
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
www.fullengineeringbook.net
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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:
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
www.fullengineeringbook.net
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).
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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).
www.fullengineeringbook.net
End Sub
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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()
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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:
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
www.fullengineeringbook.net
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:
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
clic en la opción ver código.
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
procedimiento son enviados de vuelta al formulario, a un control que puede
ser una caja de texto, una etiqueta o un cuadro de lista.
www.fullengineeringbook.net
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.
www.fullengineeringbook.net
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:
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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
www.fullengineeringbook.net
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.
www.fullengineeringbook.net