No es infrecuente que debamos realizar búsquedas en Excel. De hecho, la estructura de tablas y rangos de celdas resulta sumamente conveniente para encontrar y vincular información entre un valor consultado y otro relacionado. Si estás acostumbrado/a a realizar búsquedas en Excel, a la hora de automatizar una tarea en VBA, puede que te sientas inclinado/a a utilizar estas mismas funciones en el código (tales como BUSCARV, INDICE, COINCIDIR, etc.). Sin embargo, la potencia y flexibilidad que te proporciona redactar tu propio código, también pone a disposición nuevas herramientas para que no te limites por lo conocido. Estamos hablando de la función Find (Buscar), que a su vez deriva de la herramienta de Búsqueda disponible en Excel.
Dicha función agrega potencia a nuestras búsquedas dado que nos permite parametrizarlas a nuestra medida, a la vez que facilita la gestión de aquellos casos en los que la búsqueda no arroja ningún resultado, mismos que con las funciones tradicionales obtendríamos un error que detendría nuestro código.
Hay muchas razones para conocer e implementar Find, de modo que pongamos manos a la obra para dominarla y ganar eficiencia en el código.
Buscar en Excel
Como dijimos, la función Find en VBA deriva de las opciones de búsqueda ya disponibles en Excel a través de la ventana de Búsqueda (Inicio > Buscar y seleccionar)
Si conoces la ventana anterior, sabrás que tiene distintas opciones que podríamos utilizar para realizar las búsquedas, mismas que estarán disponibles en la función Find de VBA.
La función Find en VBA
Primero, revisemos los aspectos técnicos:
- Find pertenece a objetos de tipo Range, por lo que podemos definirlo como un método de rangos de celdas. Esto significa que sobre un rango definido, podremos aplicar la función Find, para realizar una búsqueda en dicho rango.
- Range("A1:A100").Find "Escuela Directa" -> Buscará el término "Escuela Directa sobre el rango que va de A1 hasta A100.
- El valor devuelto por Find:
- De encontrar una coincidencia, devolverá otro objeto tipo Rango, permitiéndonos acceder a todas sus propiedades, tales como ubicación, fila, columna, y desde luego, valor (entre otros)
- Si no se halla coincidencia, devolverá una objeto tipo Nothing (¡en lugar de un error!)
- Su sintaxis tiene la siguiente forma:
Range.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
o en español:
Rango.Find (Que, Después de, Buscar en, Buscar por, Orden de búsqueda, Dirección de búsqueda, Coincidir mayúsculas y minúsculas, Doble Byte, Búsqueda por formato)
Como vemos, tenemos gran cantidad de parámetros de búsqueda que podemos configurar. No te dejes abrumar: salvo el primero, los demás son opcionales, e iremos de a poco entendiendo la lógica detrás de cada uno de ellos. Ante todo, debemos entender primero...
Cómo realizar una búsqueda simple con Find
Tomando los ingredientes anteriores (rango de búsqueda, valor buscado, rango devuelto), estamos en condiciones de plantear nuestra primera función Find.
Consideremos el siguiente rango sencillo de celdas:
En el mismo, nos proponemos hallar el valor "Excel". De modo que ya podremos comenzar a armar la búsqueda:- Rango de búsqueda: A1:A5
- Valor buscado: "Excel"
- Valor devuelto: necesitaremos almacenarlo en una variable para acceder al mismo (la llamaremos Encontrado)
Por lo cual, en código VBA, resultará del siguiente modo:
Dim Encontrado as Range
Set Encontrado = Range("A1:A5").Find("Excel")
Una vez ejecutado, Encontrado almacenará el rango A3, dado que es donde se produce la coincidencia. Por ejemplo, podríamos acceder a la ubicación de la celda de resultado (Address) utilizando un MsgBox:
Set Encontrado = Range("A1:A5").Find("Excel")
MsgBox Encontrado.Address
Y se mostrará el siguiente mensaje en pantalla:
Demostrando que efectivamente hemos hallado la celda que estábamos buscando. Fantástico, pero tal vez por el momento de poca utilidad...
Utilizar Find como reemplazo de BuscarV
Evolucionemos nuestro ejemplo anterior para implementarlo en una situación más real, donde necesitaremos obtener un valor resultado a partir de un valor buscado. Por ejemplo, en el siguiente caso buscaremos "Excel" para que devuelva el valor de la columna B (tipo de documento):
En este caso, el procedimiento para hallar la coincidencia no se modificará, pero sí nuestra estrategia para obtener el valor resultado: lo que sabemos, es que una vez que hallemos "Excel" en la columna A, necesitaremos devolver el valor que se encuentra en la misma fila y en la columna B. Por tal motivo, podremos acceder a la fila del rango Encontrado, y con ella construir una referencia a columna B + fila Encontrado (Row).
Veamos cómo:
Dim ValorDevuelto as String
Set Encontrado = Range("A1:A5").Find("Excel")
ValorDevuelto = Cells(Encontrado.Row, 2)
MsgBox ValorDevuelto
Y se mostrará el siguiente mensaje en pantalla:
¡Correcto!
Por supuesto, en la práctica no nos limitaremos a mostrar los resultados en mensajes, sino que podremos usar los valores resultado para continuar avanzando con el código.
En nuestro próximo artículo, veremos cómo se gestionan los casos que Find no arroja ningún resultado, y exploraremos más de cerca los argumentos opcionales de Find. Nos vemos!