martes, 3 de marzo de 2020

Búsqueda desde una función personalizada.

Excel cuenta con varias funciones de búsqueda: BUSCAR en todas sus variantes o COINCIDIR por ejemplo.
Aquí  vamos a desarrollar otra función de usuario para que nos busque un dato en todas las hojas del libro y nos devuelva el resto de los campos del registro encontrado.
Sería algo como BUSCARV pero en todo el libro.

Para eso imaginé unas tablas mensuales, con información de distintos clientes, con un par de campos adicionales.


La búsqueda se realizará desde otra hoja donde colocaremos la función que desarrollamos.
Como toda función, la escribiremos con esta sintaxis:
= nombre_funcion(argumento1; argumento 2)  
Para el campo 'Pedido' será:
                                         =BUSCAR_DATO(K4;2) 
Nota: el separador de funciones será el que tengan en su libro Excel, aquí utilicé punto y coma.
El código para esta función se colocará en un módulo del Editor y será el siguiente:

Function BUSCAR_DATO(dato, col)
i = 1
Do
    If Sheets(i).Name <> "PORTADA" And Sheets(i).Name <> "CONSULTA" Then
        x = Sheets(i).Range("B" & Rows.Count).End(xlUp).Row
        For Each cd In Sheets(i).Range("B2:B" & x)
            If cd.Value = dato Then
                resulta = cd.Offset(0, col)
                Exit For
            End If
        Next cd
    End If
    i = i + 1
Loop While resulta = "" And i <= Sheets.Count
If resulta = "" Then
    BUSCAR_DATO = "no ESTÁ"
Else
    BUSCAR_DATO = resulta
End If
End Function

Lo que se hace es recorrer el total de hojas del libro con el bucle DO...LOOP While,  desde el índice i = 1 hasta el total de hojas (Sheets.Count)
Se omiten las hojas PORTADA y CONSULTA ya que allí no se encuentran tablas de datos.
Luego se recorre la col B de cada hoja. Si el cliente coincide con el dato buscado se guardará en la variable 'resulta' el contenido de la col que se indica en el segundo argumento.
Si la variable 'resulta' queda vacía significa que no se encontró en ninguna hoja ese cliente y se devolverá un mensaje.

En el video 31 se comenta otro modo de armar esta función, dejando la parte de la búsqueda en una macro aparte. En libro de ejemplo se encuentran los 2 módulos explicados. Pueden descargarlo desde aquí.

Para la búsqueda se pueden utilizar otros modos como el método FIND en lugar de recorrer la col B. Ese método se encuentra explicado en entradas anteriores (Junio 2019 y Febrero 2020) o en videos 25 y 29.

Ver VIDEO N° 31.