Você está na página 1de 21

Hoy vamos a trabajar listas desplegables dependientes que ya habamos visto en una clase

posterior, pero hoy la mezclaremos con el tema de macros.


Trabajaremos algunos
ControlesActivex.

ejemplos

sencillos

para

irnos

familiarizando

con

los

Listas desplegables dependientes en Excel


Una de las funcionalidades ms utilizadas en la validacin de datos en Excel son las listas
desplegables ya que nos ofrecen un control absoluto sobre el ingreso de datos de los usuarios. Sin
embargo, crear listas dependientes no siempre es una tarea sencilla, as que te mostrar un
mtodo para lograr este objetivo.
Decimos que tenemos listas desplegables dependientes cuando la seleccin de la primera lista
afectar las opciones disponibles de la segunda lista. Esto nos ofrece un mayor control sobre las
opciones elegidas por el usuario ya que siempre habr congruencia en los datos ingresados.
Para nuestro ejemplo utilizaremos un listado de pases y ciudades con el cual crearemos un par de
listas desplegables que mostrarn las ciudades que pertenecen al pas previamente seleccionado.

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.

Si te equivocaste en el nombre del rango o seleccionaste un grupo de celdas incorrecto,


el Administrador de nombres te permitir hacer cualquier modificacin haciendo clic en el botn
Editar.
Crear listas desplegables dependientes
Ahora que ya tenemos listos nuestros rangos nombrados podemos crear las listas desplegables.
Para eso ir a una nueva hoja de mi libro de Excel, seleccionar la celda A2 e ir a la ficha Datos >
Herramientas de Datos > Validacin de datos. En el cuadro de dilogo elegir la opcin Lista y en
el cuadro Origen colocar el valor =Paises que es el nombre del rango que contiene la lista de
pases nicos.

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 cdigo que debemos pegar en esta ventana es el siguiente:

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.

Cuadro de lista en VBA


El cuadro de lista es un control ActiveX que nos permite desplegar una serie de opciones de las
cuales el usuario puede realizar una seleccin. Podemos configurar el cuadro de lista para permitir
seleccionar uno o varios elementos de la lista.
Dibujar un cuadro de lista
Para insertar un cuadro de lista en una hoja de Excel debemos ir a la ficha Programador y pulsar
el botn Insertar para seleccionar la opcin Cuadro de lista (control ActiveX).

Especificar los elementos del cuadro de lista


Una alternativa para indicar los elementos de un cuadro de lista es a travs de la propiedad
llamadaListFillRange.
Para ello debemos abrir las propiedades del control e indicar el rango de celdas que contiene los
elementos:

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:

Elementos del cuadro de lista por cdigo


Otra alternativa para indicar los elementos de un cuadro de lista es a travs de cdigo VBA. Para
ello puedes incluir el siguiente cdigo en el evento Workbook_Open:

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:

Cuadro de lista de seleccin mltiple


La propiedad que nos permite especificar si el cuadro de lista permitir realizar una seleccin
mltiple es la propiedad MultiSelect.

A travs de la propiedad MultiSelect de un cuadro de lista podemos permitir al usuario seleccionar


ms de una opcin de la lista. Las posibles opciones de la propiedad MultiSelect son las siguientes:

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.

Procesar la seleccin mltiple


Una vez que se ha configurado el cuadro de lista para permitir la seleccin mltiple viene el
paso importante que es procesar el control para conocer las opciones seleccionadas. Observa el
siguiente cdigo que se ejecuta al pulsar un botn:

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:

Cmo cargar datos a un ComboBox en Excel


El Cuadro combinado, tambin conocido como ComboBox, es un control ActiveX que nos permite
crear una lista desplegable de la cual podremos seleccionar alguno de sus elementos. Pero antes
de poder utilizar este control, es necesario saber cmo cargar datos a un ComboBox a partir de
una lista de valores en una hoja de Excel.
Para este ejemplo considerar dos posibles escenarios.
El primero supone que el control ha sido agregado directamente a la hoja de Excel y el segundo
escenario supondr que el ComboBox se ha insertado en un Formulario VBA.
Para ambos casos tomar los valores de la columna A y los insertar como los elementos del
cuadro combinado.

Cargar datos al ComboBox en una hoja de Excel


El caso ms simple es cuando has agregado el Cuadro combinado directamente a la hoja de Excel
ya que para agregar sus elementos bastar con hacer clic derecho sobre el control ActiveX y

seleccionar la opcinPropiedades. Se mostrar el listado de propiedades


propiedad ListFillRange debers indicar el rango donde se encuentran los datos.

en

la

Despus de aceptar los cambios tendremos listo nuestro ComboBox:

Cargar datos al ComboBox en un formulario VBA


En el caso donde el control est dentro de un formulario VBA, es necesario indicar por cdigo los
elementos que sern agregados al ComboBox de la siguiente manera:
1
2
3
4
5
6
7
8
9
10

Private Sub UserForm_Initialize()


Dim rango, celda As Range
Set rango = Worksheets("Ejemplo1").Range("A1:A7")
For Each celda In rango
ComboBox1.AddItem celda.Value
Next celda
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, Range("A:A")) Is Nothing Then
With ComboBox1
.Value = ""
.ListFillRange = "=MiLista"
End With
End If
End Sub

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.

ComboBox en Formulario VBA con rango dinmico


Para hacer que un ComboBox que est ubicado dentro de un formulario cargue sus datos desde el
rango dinmico, debemos utilizar el siguiente cdigo:
1
2
3
4
5
6
7
8
9
10

Private Sub UserForm_Initialize()


Dim rango, celda As Range
Set rango = Range("MiLista")
For Each celda In rango
ComboBox1.AddItem celda.Value
Next celda
End Sub

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.

Você também pode gostar