El tema “listas desplegables dependientes” es uno de los más populares entre los lectores de este blog. Las 17 notas bajo esta etiqueta contienen, al día de hoy, 529 comentarios. Si bien los comentarios son una excelente herramienta de comunicación con mis lectores, muchos aportes y soluciones quedan “enterrados” allí y de hecho no están a disposición de los lectores.
En esta nota expongo el tema de la inicialización de celdas que contienen listas desplegables dependientes, tema que ha sido desarrollado en varios comentarios en distintas notas.
Empecemos por exponer el problema. Supongamos un modelo donde tenemos dos celdas con listas desplegables dependientes (en este caso, con la opción Lista de Validación de Datos)
Como podemos ver, al elegir el continente (América del Norte) en la celda C3, la lista desplegable dependiente en la celda C4 nos muestra sólo los países de ese continente. El problema reside en que al elegir otro continente, el país elegido anteriormente queda en la celda hasta que sea reemplazado.
Esto puede generar errores por lo que necesitamos que al cambiar la elección del continente, el contenido de la celda C4 sea borrado.
Esto lo hacemos programando un evento Worksheet_Change para la hoja que contiene las listas desplegables
Private Sub Worksheet_Change(ByVal Target As Range)
If Union(Target, Range("celContinente")).Address = _
Range("celContinente").Address Then
Range("celPais").ClearContents
End If
End Sub
Este evento se dispara cuando se produce un cambio en la celda C3; el código elimina el contenido de la celda C4.
Usamos nombres definidos para las celdas para facilitar la lectura del código y para evitar tener que corregirlo si cambiamos la ubicación de las listas desplegables en la hoja
- celContinente =eleccion!$C$3
- celPais =eleccion!$C$4
Otra variante del tema, como me consulta uno de mis lectores, es que exista un valor por defecto cuando se elige el continente.
Para que en la celda “país” aparezca el primer país en la lista del continente elegido ponemos este evento Worksheet_Change en la hoja correspondiente
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strRangeName As String
If Union(Target, Range("celContinente")).Address = _
Range("celContinente").Address Then
If Len(Range("celContinente")) = 0 Then
Range("celPais").ClearContents
Exit Sub
End If
Call valDefault
End If
End Sub
y esta macro en un módulo común del editor Vb
Sub valDefault()
Dim n As Name
Dim strRangeName As String
strRangeName = WorksheetFunction.Substitute(Range("celContinente"), " ", "_")
Range("celPais") = WorksheetFunction.Index(Range(strRangeName), 1)
End Sub
En esta macro es necesaria ya que al crear los nombres que se refieren a los rangos con las ciudades, los espacion entre las palabras han sido reemplazados por “_” (por ejemplo, América del Sur se transforma en America_del_Sur). Lo mismo hemos hecho en la regla de validación de datos, como ya
hemos explicado en notas anteriores
En este modelo, al borrar el contenido de la celda C3 (continente), se elimina automáticamente el valor de la celda C4 (país); al elegir un continente, aparece el primer país en la lista correspondiente; el país puede ser cambiado luego.
Para que aparezca algún otro país como valor por defecto, la posibilidad más obvia es ponerlo en el primer lugar de la lista.
El cuaderno con el ejemplo
puede descargarse aquí.
Todo sobre listas desplegables en Excel, técnicas avanzadas y descarga gratuita de ejemplos en la Caja de Herramientas Excel - Listas Desplegables de JLD. Ver la nota o ir a la página de descarga de la guía.