Función BuscarV desde visual con rango variable en otro libro

Espero que todo ok en tu vida. Tengo la siguiente situación:

A partir de la celda D2 hacia abajo tengo unos valores, y definí una variable tipo rango (nit) y en otro libro diferente tengo la base de datos (con rango variable). Me gustaría saber si puedo invocar la función desde visual para saber si ese nit está o no en la base de datos del otro libro.

Inicialmente tengo algo más o menos como sigue (pero sé que tengo error en la parte del Application. WorksheetFunction):

For Each nit In Selection
If Left(nit, 3) = "400" Then 'Si es internacional.
nit.ClearContents
Else 'Si es una contraparte .
x = IsError(Application.WorksheetFunction.VLookup(nit,'[Contrapartes.xlsb]Hoja1'!R2C1:R & UF_Contrapartes & C1,1,0))
End If
Next

¿Cómo deben ir los argumentos?

Si no es posible, pues entonces haría la recursiva de hacer la referencia a celda y tendría que crear otra variable para utilizar el objeto Range.

1

1 respuesta

Respuesta
1

H o l a:

No entendí muy bien lo que tienes en la macro.

Mejor explícame qué necesitas.

Entiendo que quieres buscar un dato en una base datos.

Podrías poner una imagen de tu hoja del libro1

Y otra imagen de tu hoja donde tienes tu base de datos.

¿Tampoco está claro qué se debe hacer si se encuentra el dato en la base de datos y qué se debe hacer si no se encuentra?


Veamos:

Tienes datos en el libro1, en la hoja1 desde la celda D2 hacia abajo.

Hay que buscar cada dato en el libro2 "contrapastes.xlsb", en la hoja1, en la columna A y traer como resultado el dato de la columna B.

Si lo encuentra poner el resultado en el libro1, hoja1, columna E.

Si no lo encuentra poner "No existe" en el libro1, hoja1, columna E.

Lo anterior es un ejemplo, porque no entiendo muy bien cómo están los datos.


La macro para hacer lo anterior es:

Sub BuscarDatos()
'Por.Dante Amor
    Set l1 = ThisWorkbook                       'Libro1
    Set h1 = l1.Sheets("Hoja1")                 'hoja con los datos a buscar
    '
    Set l2 = Workbooks("Contrapartes.xlsb")     'Libro2 con la base de datos
    Set h2 = l2.Sheets("Hoja1")                 'hoja con la base de datos
    '
    For i = 2 To h1.Range("D" & Rows.Count).End(xlUp).Row
        'busca el dato en h2
        Set b = h2.Columns("A").Find(h1.Cells(i, "D"), lookat:=xlWhole)
        If Not b Is Nothing Then
            'sí existe
            h1.Cells(i, "E") = h2.Cells(b.Row, "B")
        Else
            h1.Cells(i, "E") = "No existe"
        End If
    Next
    MsgBox "Fin"
End Sub

Personalmente no me gusta utilizar en vba VlookUp, solamente te trae un dato, en cambio, con el método Find, obtienes en el objeto b todo el objeto de la celda encontrada, de ese objeto puedes obtener, el valor de la celda, el color, la fórmula, el tamaño de letra, la dirección, la fila, la columna, la hoja, etc.


Sin embargo te dejo la macro para utilizar vlookup:

Sub BuscarDatosConVlookup()
'Por.Dante Amor
    Set l1 = ThisWorkbook                       'Libro1
    Set h1 = l1.Sheets("Hoja1")                 'hoja con los datos a buscar
    '
    Set l2 = Workbooks("Contrapartes.xlsb")     'Libro2 con la base de datos
    Set h2 = l2.Sheets("Hoja1")                 'hoja con la base de datos
    '
    For i = 2 To h1.Range("D" & Rows.Count).End(xlUp).Row
        'busca el dato en h2:    (dato a buscar  , rango basedato,col, coincidencia exacta
        res = Application.VLookup(h1.Cells(i, "D"), h2.Range("A:B"), 2, 0)
        If Not IsError(res) Then
            'sí existe
            h1.Cells(i, "E") = res
        Else
            h1.Cells(i, "E") = "No existe"
        End If
    Next
    MsgBox "Fin"
End Sub

Los argumentos son así:

        'busca el dato en h2:    (dato a buscar  , rango basedato,col, coincidencia exacta
        res = Application.VLookup(h1.Cells(i, "D"), h2.Range("A:B"), 2, 0)

Utiliza 

Application. VLookup

En lugar de

WorksheetFunction. VLookup

Si utilizas WorksheetFunction. VLookup y no existe, te va a enviar error.


':)
':)

¡Gracias! Hola Dante muchas gracias. Me has dado una luz de otras cosas. Lo que me había quedado faltando decirte era que si el dato se encuentra en "contrapartes" se debe borrar.

Nuevamente muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas