jueves, 24 de febrero de 2022

LAMBDA: Buscar en cualquier parte de una matriz

Continuando con las nuevas funciones LAMBDA hoy destinaremos nuestro tiempo a realizar una búsqueda de un valor en cualquier parte de una matriz... y recuperar un valor asociado.
LAMBDA: Buscar en cualquier parte de una matriz

Obviamente exiten otras formas de llegar al mismo fin, pero me interesa investigar posibilidades de las funciones LAMBDA. Para el caso de hoy emplearé entre otras las funciones REDUCE, BYROW y LAMBDA.

La meta a lograr es que sobre el rango de celdas B2:E8, se pretende recuperar una lista de los paises correspondientes al valor buscado en la celda B10.
Nota que se puede dar el caso de repeticiones tanto por fila como por columna
Primera posibilidad en la celda C10 añadiríamos la fórmula:
=UNIRCADENAS(",";VERDADERO;
SI.ERROR(INDICE(E2:E8;LET(vector;LET(arr;(B2:D8=B10)*(FILA(B2:D8)-1);BYROW(arr;LAMBDA(fila;MAX(fila))));SI(vector=0;"";vector)));""))

LAMBDA: Buscar en cualquier parte de una matriz

Una fórmula algo elaborada (quizá se pueda simplificar??)... Analicémosla.
Una parte importante es la matriz (B2:D8=B10)*(FILA(B2:D8)-1) que devuelve un conjunto de ceros o de número de fila para aquellos casos donde se localice el valor buscado
LAMBDA: Buscar en cualquier parte de una matriz

Sobre esa matriz aplicamos la función BYROW, recorriéndola fila por fila, obteniendo finalmente un vector con los valores máximos de cada fila, esto es, aunque haya varias coincidencias en una misma fila, tendremos un único valor por fila.
LAMBDA: Buscar en cualquier parte de una matriz

Finalmente dentro del contexto de la función LET aplicamos una condición 'SI' para reemplazar los ceros del vector (las no coincidencias) por el 'vacío'... con el fin de facilitar el posterior concatenado con UNIRCADENAS.

En una segunda propuesta usaré la funcion REDUCE que nos permitirá, en este caso, recorrer un vector de paises obtenido a partir de una función BYROW.
Veamos la fórmula añadida en C13:
=REDUCE(;
SI.ERROR(INDICE(E2:E8;BYROW(B2:D8;LAMBDA(fila;SI(COINCIDIR(B10;fila;0);FILA(fila)-1;0))));"");
LAMBDA(ac;x;UNIRCADENAS(",";VERDADERO;ac;x)))
LAMBDA: Buscar en cualquier parte de una matriz

En este caso, de forma similar a la primera fórmula, con BYROW conseguimos un vector de los paises donde se han hallado las coincidencias del valor buscado...
La función
BYROW(B2:D8;LAMBDA(fila;SI(COINCIDIR(B10;fila;0);FILA(fila)-1;0)))
nos devuelve un vector con los números de fila donde se han encontrado el valor buscado...
Estas filas las aplicamos posteriormente dentro de un INDICE para obtener los paises (que es lo que nos interesa).
Este vector de paises y celdas vacías.
LAMBDA: Buscar en cualquier parte de una matriz

La función REDUCE se encargará de recorrer cada celda de ese vector de países para aplicar la transformación indicada en LAMBDA, que es básicamente una acción de unir celdas (con UNIRCADENAS).

Sin duda se abren nuevas puertas en nuestro camino ;-)

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.