La situación es la siguiente: en una hoja de Excel tenemos una lista que nos sirve como base para crear una lista desplegable con validación de datos. Esta lista cambia de tanto en tanto. Si queremos mantener la lista actualizada sin necesidad de realizar cambios en forma manual, definimos un rango dinámico como ya hemos mostrado en el pasado.
Por comodidad queremos que la lista desplegable aparezca ordenada alfabéticamente. El problema reside en que a lista que nos sirve de base no sigue ningún orden preestablecido. Una posibilidad, obviamente, es ordenar la lista manualmente cada vez que ésta cambie. Pero, como ya habrán supuesto, queremos que esto suceda en forma automática.
Tenemos dos posibilidades: programar un evento o utilizar fórmulas y columnas auxiliares.
Empezaremos por la segunda opción. Supongamos esta lista (la misma que usamos en la nota sobre cómo
agregar valores únicos en la lista desplegable de validación de datos)
Definimos un nombre con un rango dinámico
y creamos una lista desplegable con validación de datos
Al abrir la lista desplegable, veremos los miembros de la lista en el mismo orden que figuran en el rango original
Para ordenarlos con fórmulas empezamos por crear una columna auxiliar, donde le daremos a cada miembro un número de orden con la técnica que mostramos en la nota sobre
cómo ordenar texto con fórmula en Excel. Creamos la columna auxiliar "No. de orden" y usamos esta fórmula:
=CONTAR.SI(frutas,"<="&A2)
Ahora creamos una segunda columna auxiliar, donde ordenamos la lista usando las funciones INDICE y COINCIDIR
=INDICE(frutas,COINCIDIR(FILA()-1,orden,0))
Hemos creado un segundo nombre, "orden", que es también un rango dinámico que contiene los números de orden de la columna auxiliar. En la fórmula que usamos en la columna auxiliar "Lista ordenada", usamos la función FILA para obtener el número de orden deseado sin necesidad de cambiarlo manualmente en cada celda.
Todo lo que nos queda por hacer ahora es crear una nombre que contenga el rango de los valores ordenados, es decir, de la columna "Lista ordenada"
Ahora reemplazamos el nombre "Frutas" en la definición de validación de datos, por el nombre "lista_ordenada"
La lista desplegable aparecerá ahora ordenada alfabéticamente
Podemos hacer lo mismo sin columnas auxiliares,
programando un evento. Este código hará que con cada cambio nuestra lista se reordene alfabéticamente.
En el módulo Vba de la hoja correspondiente (en nuestro caso, la hoja "evento"), ponemos este código
Como pueden ver, usamos el nombre que define el rango dinámico en nuestro código. La sentencia
On error resume next, nos permite borrar todas la lista en la hoja sin que aparezca un mensaje de error.
Ahora al agregar un nuevo valor, por ejemplo "Melón", este aparecerá automáticamente en el lugar deseado.
El archivo con el ejemplo se puede descargar
aquí.