En mi trabajo, usando LibreOffice estable por decisión corporativa, necesito buscar decenas de miles de registros en otra hoja con, también, decenas de miles de registros (ya sabéis, en una hoja de cálculo los registros son las filas y los campos son las columnas). La búsqueda tiene que ser una búsqueda exacta, es decir, el campo que estoy buscando debe coincidir exactamente con el de la hoja donde busco.
Hasta ahora usaba la función:
- =BUSCARV(campo_a_buscar; rango_donde_buscar; columna_a_devolver; FALSO())
El último parámetro "FALSO()", también se puede sustituir por un 0 (cero), es el que indica a CALC que haga una búsqueda secuencial por todos y cada uno de los registros de la hoja donde busca hasta encontrarlo. Y, en el caso de no encontrarlo devuelve el error "#N/A" o "#N/D" (Not Available/No disponible).Para más información sobre esta función consulta la "Ayuda" de CALC o visita la página Las funciones BUSCARV y BUSCARH en OpenOffice Calc de nuestro compañero SLV-es.
Tiempo que tarda en una búsqueda de 40.000 registros en otra hoja de 50.000 registros: 300 segundos, es decir, 5 minutos. En otros PC más lentos he tenido que esperar hasta ¡20 minutos! en unas hojas con más 70.000 registros.
Y, como el tiempo es oro, me puse a pensar cómo se podría acortar esos tiempos de búsqueda (obligatoriamente en LibreOffice Calc).
Pues bien, he encontrado una solución usando la fórmula siguiente:
- =SI(campo_a_buscar = BUSCARV(campo_a_buscar; rango_donde_buscar; 1; VERDADERO());BUSCARV(campo_a_buscar; rango_donde_buscar; columna_a_devolver; VERDADERO()); NOD())
- campo_a_buscar = BUSCARV(campo_a_buscar; rango_donde_buscar; 1; VERDADERO())
- BUSCARV(campo_a_buscar; rango_donde_buscar; columna_a_devolver; VERDADERO())
- NOD()
El último parámetro "VERDADERO()", también se puede no poner o sustituir por un 1 (uno), es el que indica a CALC que haga una búsqueda binaria en la hoja donde busca.
Resultado en tiempo para la misma búsqueda de 40.000 registros en otra hoja de 50.000 registros: 5 segundos. Sí, hemos pasado de 5 minutos a 5 segundos, ¡60 veces! menos tiempo.Para más información sobre la búsqueda binaria visita la página Búsqueda binaria.
Obviamente, las comparaciones de los tiempos son odiosas. No hay color.
- ¡ATENCIÓN! La hoja donde busca, es decir, la del rango_donde_buscar debe estar ordenada ascendentemente. En caso contrario no funcionará.
P.D.: El campo_a_buscar es una celda, por ejemplo A2. El rango_donde_buscar es un rango (referencia absoluta) de celdas, por ejemplo $Hoja2.$A$2:$H$45000.