domingo, 28 de octubre de 2012

Mejora de listas desplegables con la función INDIRECTO



Hace un par de semanas, un gran amigo peruano, a quien estimo mucho, pues es profesor y capacitador también, una persona con mucho conocimiento, pero sobre todo con la humildad de querer seguir aprendiendo mas y mas; me consulto por correo electrónico  si conocía la forma de que al seleccionar un dato de una lista, se limpie la celda de la lista relacionada...

En otras palabras, para explicar mejor esta inquietud, vamos inicialmente a trabajar con una Hoja de datos personales, en la cual si selecciono un país, pueda seleccionar la lista de ciudades que pertenecen a este país...

Aunque ya hemos visto Listas desplegables con la función indirecto, vamos a darle una repasada a este tema...


En otra hoja colocaremos los países y sus ciudades correspondientes de la siguiente manera:



Además, debemos definir los nombres de las listas (Etiqueta Fórmulas / Administrador de nombres).

Una vez definido los cinco nombres regresamos a la hoja donde se encuentra la Hoja de datos personales.

Seleccionamos la celda C5 (es decir, la que corresponde a País de Nacimiento) y nos vamos a la etiqueta Datos, seleccionamos Validación de datos



En cuadro de Validación de datos, debemos colocar que se debe permitir Lista; y en origen colocamos el nombre de la lista con un igual, ejemplo: =paises



En la celda C7, que corresponde a la Ciudad, debemos realizar el mismo procedimiento con la función INDIRECTO...
            =INDIRECTO($C$5)

De esta forma, cada vez que seleccione un País, automáticamente la lista de ciudades cambia. 

Sin embargo, si yo selecciono por ejemplo como país Perú, luego selecciono la ciudad de Lima; si cambio de país; la lista se actualiza, pero la celda se quedo con el valor de Lima, y esto generaría errores...

Para poder limpiar la ciudad, cada vez que cambie el país, debemos entrar al Visual Basic, y para ello haremos clic derecho en la etiqueta de la hoja (parte inferior de la pantalla) y seleccionaremos la opción Ver código...

Estando ya en Visual Basic, escribimos el siguiente código:

Private Sub Worksheet_Change(ByVal Target As Range)
If Union(Range("C5"), Target).Address = Range("C5").Address Then
Range("C7").ClearContents
End If
End Sub


Cerramos el Visual Basic, y cada vez que cambiemos de País, la celda con la ciudad se limpia automáticamente.

Cualquier consulta me la pueden indicar por este medio.