BUSCARV(): Búsqueda exacta en una tabla ordenada

Guías sobre la hoja de cálculos
Reglas del Foro
Este sub-foro no es para hacer preguntas
Aquí encontrará guías básicas sobre cómo utilizar AOO Calc. Para realizar preguntas sobre estas guías, por favor inicie un nuevo tema en el sub-foro apropiado.

También puede consultar la Documentación disponible sobre Apache OpenOffice
Responder
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

BUSCARV(): Búsqueda exacta en una tabla ordenada

Mensaje por PepeOooSevilla »

Hola.

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())
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.
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).

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())
La comparación
  • campo_a_buscar = BUSCARV(campo_a_buscar; rango_donde_buscar; 1; VERDADERO())
es la que me indica si ha encontrado una coincidencia exacta. Si son iguales entonces me devuelve la columna que necesito en
  • BUSCARV(campo_a_buscar; rango_donde_buscar; columna_a_devolver; VERDADERO())
Y si no coinciden entonces me devuelve
  • NOD()
que es el error "#N/A" o "#N/D".

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.
Para más información sobre la búsqueda binaria visita la página Búsqueda binaria.
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.

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á.
Saludos cordiales.
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.
Última edición por PepeOooSevilla el Dom Oct 22, 2017 8:05 am, editado 1 vez en total.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
mriosv
Mensajes: 2334
Registrado: Sab Dic 27, 2008 1:12 am
Ubicación: Galiza (España)

Re: BUSCARV(): Búsqueda exacta en una tabla ordenada

Mensaje por mriosv »

Es claro que la búsqueda sobre una lista ordenada es mas rápida como ya se indica en la ayuda.

Pero es posible que la búsqueda sin ordenar mejore sustancialmente si está activada la opción:
Menú/Herramientas/Opciones/Calc/Calcular - Los criterios de búsqueda = y <> deben aplicarse a la celda completa

y si no utilizas expresiones regulares o comodines, puedes desactivarlos para mejorar la velocidad.
Puedes usar "Subir adjunto" en Respuesta rápida - Editor Completo - Pestaña Subir adjunto
Apache OpenOffice 4, LibreOffice (Win10x64)
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: BUSCARV(): Búsqueda exacta en una tabla ordenada

Mensaje por PepeOooSevilla »

Muchas gracias por esa información :super:
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Responder