Actualizado el 21 de Marzo del 2018 (Publicado el 11 de Marzo del 2018)
779 visualizaciones desde el 11 de Marzo del 2018
312,5 KB
11 paginas
Aula Macedonia
Curso de Programación en VBA para Excel
Artículo realizado por
Iñaki Ecenarro.
Capítulo 4. Cuadros de diálogo (Userforms). Segunda parte.
Seguimos con los UserForms y los controles. En esta entrega vamos a ampliar el diálogo sobre datos personales,
añadiéndole más opciones, y vamos a crear dos nuevos userforms: uno para convertir de pesetas a euros y
viceversa, y otro para hacer operaciones (sumar, restar...) sobre un rango seleccionado (algo parecido a lo que
hicimos antes, pero más completo).
Todos los ejemplos de este capítulo están incluídos en este fichero: Excel4.xls
(116kbs)
Primero vamos a volver a hacer un diálogo de "Datos Personales" como el de la entrega anterior, pero añadiendo
algunas cosas. Partimos del userform de la entrega anterior, que tenía un cuadro de edición para el nombre y otro
para el apellido, y los dos botones clásicos (Aceptar y Cancelar).
Habíamos escrito el código necesario para que al abrirse el diálogo (evento Initialize del Userform) los cuadros de
edición se llenen con el texto de las celdas de la hoja de cálculo, y también para que cuando el usuario pulse
Aceptar (evento Click del botón) se copie el texto de los cuadros de edición a la hoja de cálculo. Para hacer estos
traspasos entre la hoja de cálculo y el Userform habíamos escrito un par de líneas de código en los eventos
indicados, pero vamos a ver que hay otro método para hacerlo:
Todos los controles tienen la propiedad "ControlSource", que se utiliza para decirle al control cuál es la "fuente" de
su información, que será una celda o un rango de una hoja de cálculo. Por ejemplo, en el cuadro de edición del
Nombre podemos poner como ControlSource la celda de la hoja de cálculo en la que está ese dato. Como siempre,
no vamos a utilizar referencias absolutas a celdas y rangos (p.ej. Hoja1!A5), sino que vamos a utilizar nombres de
rango. Por ejemplo, vamos a la hoja de cálculo y damos a la celda "fuente" el nombre "rngNombre" (rng porque es un
rango de una hoja de cálculo). Luego vamos al editor VBE, seleccionamos el control de edición Nombre y en su
propiedad ControlSource escribimos el nombre del rango que queremos que sea su "fuente", en este caso
"rngNombre".
Ahora hacemos lo mismpo para el apellido: primero damos el nombre "rngApellido" a la celda de la hoja de cálculo y
luego escribimos rngApellido en la propiedad ControlSource del control de edición de Apellido.
Ahora tenemos que borrar el código que habíamos escrito para pasar la información de hoja de cálculo al Userform y
viceversa. Mejor que borrarlo, lo que haremos será "comentarlo", utilizando una comilla simple ', que indica a Excel
que todo lo que escribamos en esa línea detrás de la comilla son cosas nuestras y que las ignore (el texto
"comentado" aparecerá en otro color, normalmente en verde). Aprovechando que explico lo de
los comentarios, nunca está de más recordar la importancia que tiene añadir al código todos
los comentarios que sean necesarios. Cuando estás escribiendo una rutina sabes
perfectamente cómo funciona y qué es lo que hace, y todos pensamos que los comentarios
son innecesarios, pero cuando tras algunas semanas tienes que volver a ver la rutina te
encuentras con un montón de líneas que no sabes para qué sirven ni cómo lo hacen, y si no
las has comentado tienes que "bucear" en ellas para averiguarlo.
A lo que íbamos, estábamos borrando el código de los eventos Initialize del Userform y Click del botón Aceptar.
Vamos al editor VBE, hacemos dobleclick sobre el Userform y nos aparece la rutina Userform_Initialize().
Ponemos una comilla delante de las dos líneas que se encargan de copiar los datos de la hoja de cálculo al
userform, y veremos que dichas líneas cambian de color, indicándonos que para Excel son comentarios y los va a
ignorar. Ahora volvemos al Userform y hacemos dobleclick en el botón Aceptar, y nos aparece la rutina
btnAceptar_Click(). Volvemos a poner las comillas en las dos líneas de código que queremos quitar y ya está.
Si probamos ahora el diálogo, veremos que la propieda ControlSource funciona, y que antes de mostrar el diálogo
"lee" el contenido de la hoja de cálculo y lo pone en el Userform, y cuando pulsamos Aceptar copia el contenido de
los controles del Userform en la hoja de cálculo.
Sin embargo he detectado un problema con el uso de ControlSource. Si hacemos algún cambio en el Userform y
luego pulsamos el botón de "Cancelar", los cambios que hemos hecho en los datos se actualizan en la hoja de
cálculo, cuando no deberían actualizarse porque hemos pulsado Cancelar. En cambio, si hacemos algún cambio y
pulsamos la tecla Escape los cambios no se actualizan en la hoja de cálculo. Es un poco raro. Creo que "se me
escapa" algo, si alguien descubre por qué ocurre esto que me avise.
Bueno, ahora vamos a añadir un control nuevo, que Excel llama "cuadro combinado" (el nombre en inglés es
ComboBox), que es la típica persiana que estamos hartos de ver en cualquier diálogo, y permite al usuario escoger
una opción entre varias que le presentamos. En este caso vamos a mostrar una persiana para el "Estado Civil", y las
opciones que vamos a presentar son "soltero, casado, viudo y divorciado".
Las propiedades más importantes de un ComboBox son:
List: un conjunto de cadenas de caracteres (strings) que representan a todos los elementos de la lista. Para
acceder a un elemento en concreto utilizamos MiComboBox.List( 3 ), que nos devolvería el cuarto elemento
de la lista, ya que el primero tiene el número 0.
ListCount: el número de elementos que hay en
MiComboBox.ListCount1 ) obtendremos el último elemento de la lista.
la
lista. Si utilizamos MiComboBox.List(
ListIndex: el número del elemento seleccionado actualmente por el usuario. Para obtener el texto del
elemento seleccionado utilizaríamos MiComboBox.List( MiComboBox.ListIndex ). Si hemos definido el control
como "multiselección" (es decir, que el usuario pueda escoger más de un elemento), esta propiedad no se
puede usar, pero por ahora no nos vamos a meter en esto.
Rowsource: es el rango del que queremos que el ComboBox lea los elementos. Podemos utilizar esta
propiedad, o bien introducir nosotros mismos mediante código los elementos (utilizando el método AddItem).
ControlSource: la celda en la que el ComboBox lee y escribe el elemento seleccionado. Igual que con
RowSource, podemos utilizar esta propiedad para que el ComboBox nos escriba en una celda el elemento
seleccionado o podemos utilizar código para obtener el elemento seleccionado (utilizando ListIndex).
Style: identifica el tipo de ComboBox que queremos. Tiene dos valores posibles:
fmStyleDropDownCombo: el usuario puede escoger uno de los valores de la lista o escribir otro
distinto.
fmStyleDropDownList: el usuario sólo puede escoger uno de los valores de la lista.
ControlTipText: esta propiedad se aplica a todos los controles, pero como todavía no la he explicado, la
pongo aquí. Esta propiedad sirve para mostrar al usuario un pequeño texto de ayuda sobre el control cuando
ponga el ratón sobre el mismo, el ya clásico cuadrito amarillo.
Una vez vistas las propiedades, vamos con los métodos del objeto ComboBox:
AddItem: sirve para añadir un elemento a la lista. Su sintaxis es MiComboBox.AddItem( 'Mi texto', 3 ). El
primer parámetro es el texto del elemento, y el segundo parámetro (que es opcional), es la posición dentro de
la lista que queremos para el nuevo elemento. Si no utilizamos el segundo parámetro, nuestro nuevo elemento
se añadirá al final de la lista.
RemoveItem: para borrar un elemento. Su sintaxis es MiComboBox.RemoveItem( 3 ), para borrar el elemento
número 3.
Clear: borra todos los elementos de la lista.
Como siempre, hay muchos más métodos y propiedades, que están bastante bien explicados en la ayuda de Excel.
Vamos a colocar nuestro ComboBox en el Userform, y una vez colocado vamos a las propiedades. Primero vamos a
establecer la propiedad Style como fmStyleDropDownList, para que el usuario sólo pueda escoger uno de los valores
que le presentamos (es decir, que no le dejamos que se invente un nuevo estado civil). Ahora vamos a la hoja de
cálculo y escribimos en una celda cualquiera "Soltero", debajo "Casado", debajo "Divorciado" y debajo "Viudo".
Ahora vamos a dar un nombre a este rango, seleccionando las cuatro celdas y escribiendo en el "Cuadro de
Nombres" (en la parte superior izquierda) el nombre "rngEstadoCivil". Ya que estamos vamos a seleccionar cualquier
otra celda para que el ComboBox almacene el elemento seleccionado por el usuario, y le damos a esta celda el
nombre "rngValorEstadoCivil".
Ahora vamos otra vez al editor de Visual Basic (VBE), seleccionamos nuestro ComboBox, y en la propiedad
RowSource escribimos "rngEstadoCivil". En la propiedad ControlSource escribimos "rngValorEstadoCivil".
Como propina, vamos a poner en la propiedad ControlTipText el texto "Selecciona tu estado civil", que es lo que el
usuario verá en un cuadrito amarillo cuando ponga el ratón sobre el ComboBox. Recuerda que esta propiedad la
tienen todos los controles.
Ya tenemos nuestro ComboBox, y si lo probamos veremos que funciona perfectamente. Recuerda que el ComboBox
coge los valores del rango establecido en RowSource, y almacena el valor seleccionado por el usuario en la celda
establecida en ControlSource.
Como ejercicio podemos hacer lo siguiente: borramos las propiedades ControlSource y
RowSource, y hacemos que el control funcione igual pero encargándonos nosotros mismos
Comentarios de: Curso de programación en VBA para Excel - Capítulo 4. Cuadros de diálogo (Userforms). Segunda parte. (0)
No hay comentarios