Un BUSCARV que funciona de abajo a arriba


Seguro que ya conoces, y tal vez ames, la función BUSCARV() disponible en todas los editores de hojas de cálculo del mundo mundial que se precien. Repasemos su funcionamiento en plan rápido.

BUSCARV() trata de encontrar un valor determinado en la primera columna de un rango de celdas y, cuando lo localiza, devuelve el contenido de una celda situada cierto número de posiciones a la derecha en la misma fila. No hace falta echarle mucha imaginación para darse cuenta de que se trata de una herramienta fundamental a la hora de diseñar hojas de cálculo que muevan información de un lado a otro.


Existe también una versión que busca en horizontal (recorriendo una fila), BUSCARH(), pero la dejaremos de lado en este briconsejo de hoy.

El caso es que BUSCARV() comienza a recorrer la columna de búsqueda desde su fila superior y avanza en vertical (de ahí la "V" en su nombre) hacia abajo, hasta encontrar su presa o recorrerla completamente. En ocasiones sin, embargo, podría resultar de utilidad buscar al revés, esto es, de abajo arriba, ¿no te parece?

¿Cuándo? Quizás cuando se trata de localizar información en la hoja de datos que se genera a partir de las respuestas de un formulario. Estoy pensando, por ejemplo, en el sistema de inscripciones a talleres de un primaveral encuentro educativo (no sé por qué diantres se me habrá ocurrido eso) en el que puede darse la circunstancia de que una misma persona se registre varias veces y únicamente queramos tener en cuenta su última respuesta al formulario, descartando las anteriores. Así de estrictos (risotada malévola).

Pero BUSCARV() no dispone de un mecanismo directo para funcionar boca abajo. Afortunadamente para eso están las ideas felices.

Para ver cómo solucionar esto, partamos de una sencilla hoja de cálculo con esta aún más sencilla tabla.


En la columna A tenemos identificadores únicos de alguna entidad (persona, grupo, etc.). Da lo mismo. En la columna B, una respuesta de tipo Sí/No a una pregunta que no nos molestaremos en formular, dado que tampoco es relevante.

Como puedes ver, la entidad con identificador ID0001 tiene dos valores asociadas en la columna B. Nuestro objetivo es localizar el que se encuentre más abajo en la tabla que, de tratarse de respuestas recibidas a través de un formulario, se correspondería con la más reciente.

Para conseguirlo tenemos que transformar los valores en A1:B7 en otra cosa utilizando esta expresión:

=ArrayFormula( 1 / ( A1:A7 = "ID0001" ) \ B1:B7 )

Esta marcianada genera el rango en C1:D7:


En la columna C tendremos un valor 1 donde originalmente aparecía el elemento buscado (ID0001), que introducimos en la expresión de comparación anterior, y una indicación de error (#¡DIV/0!) en caso contrario. Eso se consigue con la división que se muestra en la expresión de más arriba. Si se cumple la condición (A1:A7 = "ID0001") el resultado se evalúa a VERDADERO (1), en caso contrario a FALSO (0), lo que provoca en última instancia el correspondiente error de división por cero.

Las llaves ({ ... }) y el operador barra invertida (\) sirven para concatenar al rango - columna generado las celdas en B1:B7, que no sufren metamorfosis alguna. De este modo el resultado presenta dos columnas, la C, en la que buscamos un determinado dato, y la D, en la que se localizan los valores a recuperar.

Finalmente, gracias a ARRAYFORMULA() se realiza una expansión matricial del cálculo aritmético para aplicarlo sobre todas las celdas de A1:A7.

Seguimos.

Solo queda utilizar BUSCARV() sobre este intervalo metamórfico, aunque de un modo especial. Se tratará de localizar el valor 2 en la primera columna, y además se le indicará a la función que los valores están ordenados. Un momento, ¿buscamos un 2? Paciencia...

Ahora olvídate del rango C1:D7, no lo necesitamos para nada y de hecho solo te lo he mostrado para tratar de aclarar el funcionamiento de la fórmula finalmente utilizada. Veamos cómo queda la cosa sobre el intervalo original:

=ArrayFormula( BUSCARV( 2 ; { 1 / (A1:A7 = "ID0001" ) \ B1:B7 } ; 2 ; VERDADERO ) )


¿Me lo explica? Por supuesto.

Cuando se le indica a BUSCARV() que el intervalo está ordenado, lo que intenta es localizar el valor numérico más próximo inferior al buscado. Para ello recorre todo el intervalo, de arriba a abajo. Las celdas que contienen errores las ignora. Dado que 1 y 2 no se parecen ni en pintura, BUSCARV() sigue bajando, persiguiendo la mejor coincidencia (todas son igual de malas), y da por buena finalmente la última aparición del valor 1 en el rango de búsqueda. A continuación se devuelve el valor situado en la celda de la derecha (columna 2)... y el resto es historia.

Dependiendo de la implementación interna de BUSCARV() esto podría no funcionar. Pero el caso es que lo hace. Y una estrategia análoga tira igualmente bien en Calc (LibreOffice) o Excel (Microsoft Office).

Esta técnica que hemos utilizado basada en la composición de intervalos de datos al vuelo dentro de una fórmula es muy frecuente en modelos avanzados de hoja de cálculo. Otra día veremos más ejemplos.

Las hojas de cálculo molan mucho.

¿Te atreverías a extender esta estrategia a un escenario en el que se necesitara emplear una condición de búsqueda con múltiples criterios?

Comentarios