Controles Activex
Controles Activex
Controles Activex
ejemplos
sencillos
para
irnos
familiarizando
con
los
Este listado se encuentra en una hoja de Excel llamada Datos que es donde prepararemos los
datos de manera que poder crear con facilidad las listas desplegables dependientes desde
cualquier otra hoja del libro.
Preparacin de los datos
El primer paso que debemos dar es crear una lista de pases nicos. Para esto har una copia de
los datos de la columna A y pegar los valores en la columna D. Posteriormente, con la columna
seleccionada, ir a la ficha Datos > Herramientas de datos y pulsar el botn Quitar duplicados.
Ahora seleccionar el rango de celdas D2:D7 y le pondr el nombre Paises. Para asignar un
nombre a un rango de celdas debemos seleccionarlo e ingresar el texto en el Cuadro de
nombres de la barra de frmulas.
El segundo paso ser nombrar los rangos de las ciudades para cada pas de la siguiente manera:
1. Selecciona el rango que contiene las ciudades de un pas.
2. Nombra dicho rango con el nombre del pas.
Siguiendo este procedimiento tan simple, la siguiente imagen muestra el momento en que
selecciono las ciudades de Argentina y asigno el nombre adecuado a dicho rango.
Es muy importante que el nombre del rango sea exactamente igual al nombre del pas ya que ese
ser nuestro vnculo entre ambas listas. De la misma manera como he creado el rango de ciudades
para Argentina crear un nuevo rango para cada pas.
Una vez terminada esta tarea tendr 7 rangos nombrados. Un rango nombrado para cada uno de
los 6 pases y adems un nombre para la lista de pases nicos. Para ver esa lista de rangos
nombrados puedo ir a la ficha Frmulas y hacer clic en el botn Administrador de nombres.
Al hacer clic en el botn Aceptar podremos comprobar que la celda A2 contiene una lista
desplegable con los pases.
Ahora crearemos la lista desplegable dependiente de la celda B2 y para eso seleccionar dicha
celda e ir a la ficha Datos > Herramientas de datos > Validacin de datos. En el cuadro de dilogo
mostrado seleccionar la opcin Lista y el en cuadro Origen colocar la siguiente frmula:
=INDIRECTO(A2)
La funcin INDIRECTO se encargar de obtener el rango de celdas cuyo nombre coincide con el
valor seleccionado en la celda A2.
Es muy probable que al hacer clic en el botn Aceptar se muestre un mensaje de advertencia
diciendo que: El origen actualmente evala un error Desea continuar? Este error se debe a que
en ese momento no hay un Pas seleccionado en la celda A2 y por lo tanto la funcin INDIRECTO
devuelve error, as que solo debers hacer clic en la opcin Si para continuar.
En el momento en que selecciones un pas de la celda A2, las ciudades de la celda B2 sern
modificadas para mostrar solamente aquellas que pertenecen al pas seleccionado.
Con estos pasos hemos crear un par de listas desplegables dependientes en Excel las cuales
muestran las ciudades correspondientes a un pas determinado.
Limpiar seleccin de lista dependiente
Las listas dependientes que acabamos de crear en la seccin anterior tienen un pequeo
inconveniente y es que despus de hacer una primera seleccin de Pas y Ciudad, al hacer una
nueva seleccin de Pas, la celda que muestra las ciudades permanecer con la seleccin anterior.
Para que me entiendas mejor hagamos un ejemplo sencillo. Seleccionar el pas Colombia en la
celda A2 y posteriormente en la celda B2 seleccionar la ciudad Medelln. Hasta ah todo va bien,
pero si ahora selecciono el pas Mxico en la celda A2, la celda B2 seguir mostrando la ciudad
Medelln.
Si en ese momento guardamos el libro, tendremos una incongruencia en los datos. La mala noticia
es que no existe un comando de Excel para solucionar este problema. La buena noticia es que
podemos utilizar cdigo VBA para pedir a Excel que limpie la celda B2 cada vez que haya un
cambio en la celda A2. Para agregar el cdigo debemos hacer clic derecho sobre el nombre de la
hoja y seleccionar la opcin Ver cdigo.
En las listas desplegables mostradas debemos elegir la opcin Worksheet y Change tal como se
muestra en la siguiente imagen.
El evento Worksheet_Change se dispara cada vez que se realiza un cambio en una celda de la
hoja. Pero ya que estamos interesados en un cambio de la celda A2, comparamos la
variable Target para saber si el cambio proviene de dicha celda. En caso afirmativo, limpiamos el
valor de la celda B2.
Si aplicas esta solucin a tus archivos, debers guardarlos como un Libro habilitado para
macros de manera que pueda ejecutarse adecuadamente el cdigo VBA.
Agregar datos a las listas desplegables dependientes
Si deseas agregar nuevos datos a las listas desplegables, debers tener cuidado de mantener las
referencias adecuadas en cada uno de los rangos nombrados. Por ejemplo, para agregar una
nueva ciudad para Mxico insertar una nueva fila debajo de la ciudad Guadalajara.
Ahora el pas Mxico tiene 4 ciudades en lugar de 3 as que ser necesario modificar el rango
nombrado para sus ciudades. Para hacer este cambio debemos ir a la ficha Frmulas y hacer clic
en el botn Administrador de nombres. Al abrirse el cuadro de dilogo notars dos cosas:
1. Aunque las ciudades de Per fueron desplazadas hacia abajo por la insercin de la nueva
fila, Excel modific automticamente la referencia para indicar que dicho nombre ahora se
refiere el rango B18:B20.
2. Excel no modific el rango correspondiente a Mxico y en este momento dicho rango
termina en la celda B16 por lo que es necesario que modifiquemos manualmente dicha
referencia. Para que todo funcione correctamente debo indicar lo siguiente:
=Datos!$B$14:$B$17
Para ingresar esta nueva referencias puedes seleccionar el nombre Mxico y hacer clic en el botn
Editar. Se mostrar un nuevo cuadro de dilogo donde podrs indicar la nueva referencia.
Con este cambio ser suficiente para ver la nueva ciudad al momento de seleccionar el pas
Mxico dentro de las listas desplegables.
As que, ya sea que vas a agregar nuevas Ciudades o Pases debers poner especial atencin a
las referencias de los rangos nombrados y debers editarlas en caso de ser necesario desde
el Administrador de nombres.
En este ejemplo he especificado que los valores sean tomados del rango A1:A6, lo cual da como
resultado un cuadro de lista con los valores especificados en dicho rango:
De esta manera cuando se abra el libro se agregarn las opciones al cuadro de lista llamado
ListBox1.
Asociar una celda al cuadro de lista
Adicionalmente podemos asociar una celda al cuadro de lista la cual mostrar la seleccin que
hagamos. Para hacer esta asociacin debemos especificar la direccin de la celda en la propiedad
LinkedCell:
De esta manera, cada vez que hagamos una seleccin de alguna de las opciones del cuadro de
lista se ver reflejado su valor en la celda asociada:
0 fmMultiSelectSingle:
Solamente se puede seleccionar una opcin de la lista. Este es el comportamiento
predeterminado de un cuadro de lista.
1 fmMultiSelectMulti:
Se pueden seleccionar mltiples opciones haciendo clic sobre ellas. Tambin se puede
realizar la seleccin con la barra espaciadora.
2 fmMultiSelectExtended:
La seleccin mltiple se realiza pulsando la tecla CTRL mientras se hacer clic sobre las
opciones. Si se utiliza la tecla MAYUS se pueden seleccionar varias opciones adyacentes.
El bucle For Next de este cdigo hace un recorrido por todos los elementos del cuadro de lista y
en caso de que la propiedad Selected est habilitada (true) entonces su valor se agrega a una
cadena de texto que me permitir conocer la seleccin posteriormente.
Una vez fuera del bucle For Next se valida si la cadena del mensaje es igual a cero caracteres,
significa que no hubo ninguna opcin de la lista seleccionada y por lo tanto se desplegar e
mensaje No hay elementos seleccionados.
Observa el comportamiento de este cdigo en la siguiente animacin de un cuadro de lista de
seleccin mltiple:
en
la
Con este cdigo recorremos todas las celdas del rango A1:A7 y por cada celda agregamos un
nuevo elemento al ComboBox. Observa que el cdigo est dentro del evento UserForm_Initialize lo
que ocasionar que la carga de datos se haga en el momento en que se inicialice el formulario.
Si la lista de elementos de la columna A fuera fija, con cualquiera de los ejemplos anteriores ser
suficiente para cargar datos al ComboBox, pero si dicha lista crece continuamente y necesitas
que los nuevos elementos sean considerados dentro del ComboBox, entonces debemos cambiar
un poco el enfoque de la solucin para considerar el uso de un nombre de rango dinmico.
Rango dinmico para cargar datos al ComboBox
Para crear un rango dinmico es necesario utilizar la funcin DESREF y la funcin CONTARA la
cual nos ayudar a conocer las celdas con valores dentro de la columna que contiene los datos.
Para crear el nombre debemos ir a la ficha Frmulas > Nombres definidos > Asignar nombre.
Creamos el nombre MiLista que nos servir para hacer referencia a este rango dinmico de celdas.
En el ltimo cuadro de texto, donde generalmente colocamos una referencia a un rango de celdas,
colocaremos la siguiente frmula:
=DESREF(Ejemplo2!$A$1,0,0,CONTARA(Ejemplo2!$A:$A))
Esta frmula devolver una referencia a un rango que inicia en la celda A1 (de la hoja Ejemplo2) y
termina N filas por debajo. La cantidad de filas a desplazarse hacia abajo ser el resultado de la
funcin CONTARA que cuenta las celdas no vacas de la columna A.
De esta manera queda creado nuestro nombre de rango dinmico que utilizaremos para cargar
datos al ComboBox. Si quieres saber un poco ms sobre la creacin de este tipo de nombres te
recomiendo leer el artculo Nombres de rango dinmicos. En las siguientes secciones haremos uso
de este rango dinmico recin creado.
ComboBox en hoja de Excel con rango dinmico
Si nuestro ComboBox se encuentra en la hoja de Excel, podemos hacer referencia al rango
dinmico abriendo la ventana de propiedades y para la propiedad ListFillRange colocar el nombre
del rango dinmico:
Sin embargo, con esta adecuacin no es suficiente para que la actualizacin del ComboBox sea
automtica. Si dejamos las cosas as, los datos se refrescarn solamente hasta que cerremos y
volvamos a abrir el libro, as que lo mejor ser agregar cdigo adicional a nuestra hoja para
asegurarnos de que la actualizacin se hace en cuanto modificamos los elementos de la columna
A.
1
2
3
4
5
6
7
8
Con este cdigo nos aseguramos de que, al momento de agregar o eliminar un elemento de la
columna A, el ComboBox refrescar automticamente sus elementos.
La nica diferencia con el primer formulario es que el rango indicado es precisamente el nombre
del rango dinmico. Al momento de abrir el formulario se cargar el ComboBox con todos los
elementos de la columna A.
En este caso no es necesario agregar cdigo adicional ya que cada vez que abramos el formulario
se actualizarn los elementos del ComboBox.