lunes, 23 de abril de 2012

Búsqueda compleja en una tabla

Una editorial publica cinco revistas de otros tantos deportes: boxeo, ciclismo, fútbol, natación y tenis. Los clientes se suscriben a una o más revistas y los datos se almacenan en una tabla (B2:H10):

El objetivo del ejercicio es elegir un cliente (C12) y obtener su número de registro (G12) y la lista de revistas a las que está suscrito (C14:G14).

Como en otras ocasiones, resolveremos el problema usando celdas auxiliares (J3:N9); luego, agruparemos todas las fórmulas en una fórmula compuesta. Las celdas auxiliares ya no serán necesarias y las podremos eliminar.

Combinamos las celdas C12 y D12 dejando espacio suficiente para los nombres (Inicio + Combinar y centrar). Justificamos el texto a la izquierda.

Hacemos clic en C12, accedemos a Datos + Validación de datos y asociamos la lista de nombres (B3:B10) a la celda combinada:

Elegimos un nombre cualquiera; por ejemplo, Juan Gómez

En G12 ponemos el número de afiliado del suscriptor seleccionado:
=BUSCARV(C12;B3:C10;2;FALSO)     [Resultado: 1389]

En K3 obtendremos el número de la fila en la que está la persona elegida:
=COINCIDIR(C12;B3:B10;0)+2     [Resultado: 6]

Ahora, debemos comprobar qué celdas del rango D6:H6 contienen una "X" (son las suscripciones del afiliado). El rango D6:H6 lo formaremos con DIRECCION; así, DIRECCION(K3;4) devolverá $D$6; DIRECCION(K3;8) devolverá $H$6. Combinando ambas fórmulas de esta manera: DIRECCION(K3;4)&":"&DIRECCION(K3;8), obtendremos $D$6:$H$6. Con INDIRECTO obtenemos los valores de las celdas, y con HALLAR comprobaremos qué celdas tienen "X"; las que tengan "X" devolverán un 1; las restantes, devolverán un error.

Seleccionamos J5:N5 y escribimos:
=HALLAR("X";INDIRECTO(DIRECCION(K3;4)&":"&DIRECCION(K3;8)))     [Terminamos con Ctrl + Mayús + Intro]

En la siguiente fila numeraremos (del 1 al 5) las celdas en las que hemos encontrado una "X".

Seleccionamos J6:N6 y escribimos:
=SI(ESNUMERO(J5:N5);{1\2\3\4\5};"")     [Terminamos con Ctrl + Mayús + Intro]

Con esta fórmula matricial comprobamos si hay un número en cada celda del rango J5:N5 y, en caso de haberlo, le asignamos el valor correspondiente de la matriz {1\2\3\4\5}.

En J7:N7 obtenemos el número menor, el segundo menor, el tercero... de los números de rango J6:N6.

Seleccionamos J7:N7 y escribimos:
=K.ESIMO.MENOR(J6:N6;{1\2\3\4\5})      [Terminamos con Ctrl + Mayús + Intro]

Comparando esta lista de números con los valores del encabezado (D2:H2) obtendremos las revistas a las que se ha suscrito el cliente.

Seleccionamos J8:N8 y escribimos:
=INDICE(D2:H2;1;J7:N7)      [Terminamos con Ctrl + Mayús + Intro]

Seleccionamos J9:N9 y escribimos la primera fórmula compuesta:
=INDICE(D2:H2;1;K.ESIMO.MENOR(SI(ESNUMERO(HALLAR("X";INDIRECTO(DIRECCION(COINCIDIR(C12;B3:B10;0)+2;4)&":"&DIRECCION(COINCIDIR(C12;B3:B10;0)+2;8))));{1\2\3\4\5};"");{1\2\3\4\5}))      [Terminamos con Ctrl + Mayús + Intro]

La fórmula definitiva la pondremos en C14:G14. Utilizaremos la función SI.ERROR para eliminar los valores #¡NUM! que hay en J9:N9.

Seleccionamos C14:G14 y escribimos la segunda y definitiva fórmula compuesta:
=SI.ERROR(INDICE(D2:H2;1;K.ESIMO.MENOR(SI(ESNUMERO(HALLAR("X";INDIRECTO(DIRECCION(COINCIDIR(C12;B3:B10;0)+2;4)&":"&DIRECCION(COINCIDIR(C12;B3:B10;0)+2;8))));{1\2\3\4\5};"");{1\2\3\4\5}));"")      [Terminamos con Ctrl + Mayús + Intro]

Esta fórmula es definitiva; no se necesitan las columnas J a N. Podemos eliminarlas tranquilamente.

Nota: Como en Excel 2003 no existe la función SI.ERROR, podemos utilizar el formato condicional para poner a las celdas que contienen #¡NUM! el mismo color que el del fondo; de este modo, no se verá el código de error.

Si no queremos usar fórmulas matriciales y no nos importa conservar las celdas auxiliares, podemos resolver el ejercicio de la manera que se muestra a continuación:

En C12, G12 y K3 mantenemos las mismas fórmulas y elegimos a Martín Redondo.

En J5:
=SI(INDIRECTO(DIRECCION($K$3;COLUMNA(D1)))="X";D2;"")

Extendemos la fórmula hacia la derecha.

Martín Redondo se ha suscrito a las revistas de ciclismo, natación y tenis.

En J6:
=(J5<>"")*COLUMNA(D2)

Extendemos la fórmula hacia la derecha.

Hemos obtenido las columnas en las que están los nombres de las revistas de Martín Redondo.

En J7:
=JERARQUIA(J6;J6:N6;0)

Extendemos la fórmula hacia la derecha.

Hemos ordenado jerárquicamente la fila anterior.

En J8:
=INDICE($J$5:$N$5;0;COINCIDIR(COLUMNA(A1);$J$7:$N$7;0))

Extendemos la fórmula hacia la derecha.

Ya hemos conseguido los nombres de las revistas, aunque en orden invertido con respecto al original. Sólo nos falta eliminar el error #N/A. Lo haremos en C14:G14.

En C14:
=SI.ERROR(J8;"")

Extendemos la fórmula hacia la derecha.

 
 
 

No hay comentarios:

Publicar un comentario