Supongamos que queremos crear un formulario en Excel con dos celdas: hora de comienzo y hora de finalización. Las horas las elegimos de celdas desplegables, que creamos fácilmente con validación de datos. Pero en nuestro modelo queremos que las horas que aparezcan en la la celda “hora de finalización” dependan de la hora elegida en la celda “hora de comienzo
Para lograr que la lista desplegable de la celda “Hasta” se adapte a la hora introducida en la celda “De” tenemos que usar rangos dinámicos que crearemos con la función DESREF.
Los pasos para crear este modelo:
En el rango A3:A26 definimos las horas del día (en este ejemplo usamos una escala de una hora, pero podemos usar medias horas o cualquier otra escala). Definimos el nombre “rngHorarioSencillo” que se refiere a este rango.
Definimos el nombre “celdaDeSencillo” que se refiere a la celda E4.
En la celda C8 ponemos la fórmula
=COINCIDIR(celdaDeSencillo,rngHorarioSencillo,0)
y creamos el nombre “controlHora2Sencillo” que se refiere a la celda C8. Como alternativa podemos crear un nombre que contenga la fórmula en lugar de ponerla en una celda. En mi opinión, el uso de celdas nos permite crear modelos más claros y fáciles de administrar.
Para crear la lista desplegable de la celda “De” usamos el nombre “rngHorarioSencillo”
Para crear la lista desplegable en la celda “Hasta” usamos un rango dinámico definido por esta fórmula:
=DESREF(sencillo!$A$3,controlHora2Sencillo,,CONTARA(rngHorarioSencillo)-controlHora2Sencillo)
Otro detalle que podemos agregar es un evento que borre el contenido de la celda “Hasta” cuando cambiamos el valor de la celda “De”. En el módulo Vbe de la hoja ponemos este código
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("celdaDeSencillo").Address Then
Target.Offset(0, 1).ClearContents
End If
End Sub
Finalmente ocultamos las columnas A y B.
Un caso más complejo es cuando queremos que el modelo incluya varias líneas donde la hora de comienzo de una línea depende de la hora de finalización de la línea anterior
En este caso emplearemos prácticamente la misma técnica, pero en lugar de celdas de control incluiremos las fórmulas en nombres.
En la primer celda del formulario definimos la lista desplegable con el nombre “rngHorario”, que se refiere a todo el rango de horas
Ahora tenemos que definir los controles para las celdas “De” y “Hasta”. En el caso de “De” tenemos que referirnos a la celda “Hasta” inmediata anterior (la que se encuentra una fila por arriba). Esto lo hacemos definiendo la fórmula en un nombre pero
asegurándonos que la referencia a la fila sea relativa (sin el signo $).
Al definir el control para el campo “De” seleccionamos la celda
D5 y definimos el nombre “hora1Ref” con esta fórmula
=COINCIDIR(complejo!$E4,rngHorario,0)
Para definir el control para el campo “Hasta”
seleccionamos previamente la celda E4 y definimos el nombre “hora2Ref” con esta fórmula
=COINCIDIR(complejo!$D4,rngHorario,0)
Estos controles nos sirven ahora para definir los rangos dinámicos de las listas desplegables.
Para las celdas D5:D9 definimos el nombre “rngHora1Comp” con la fórmula
=DESREF(complejo!$A$3,hora1Ref,,CONTARA(rngHorario)-hora1Ref)
Para las celdas E4:E9 definimos el nombre “rngHora2Comp” con la fórmula
=DESREF(complejo!$A$3,hora2Ref,,CONTARA(rngHorario)-hora2Ref)
El archivo 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.