¿Cómo busco un dato en otro libro con un userform?

Tengo un user form que pide un dato (rut) que es digitado por el usuario, tengo otro libro de excel en que están los rut y en la celda de al lado su nombre. Mi problema es que no puedo encontrar la forma de buscar ese dato, tengo la siguiente macro:

Private Sub rut_arriendo_Change()
Workbooks.Open Filename:="C:\Users\diana\Dropbox\PROYECTO\CLIENTES Y PROVEEDORES.xlsm"
Sheets("CLIENTES").Select
Range("a3").Select
Do While ActiveCell <> ""
    If ActiveCell = rut_arriendo Then
         Selection.Offset(0, 1) = nombre_arriendo
         GoTo termino
    End If
Loop
termino:
End Sub

y el problema es que cuando ingreso el rut en el userform me abre el libro donde tengo el dato y no hace nada, incluso se queda en el libro nuevo o sea no continua en el formulario.

Por favor! Su ayuda!

1 respuesta

Respuesta
1

Te faltan algunos detalles a tu macro.

Mejor te envío una nueva macro y unas recomendaciones.

- Cambia el evento change por un botón, ya que si dejas el evento change, por cada letra que vayas poniendo en el textbox, se va a realizar la búsqueda.

- Mejor escribe el dato en el textbox y cuando termines la captura presionas el botón.

- Pon el siguiente código en tu nuevo botón:

Private Sub CommandButton1_Click()
    If rut_arriendo.Value = "" Then
        MsgBox "Falta capturar el rut"
        Exit Sub
    End If
    '
    'ruta y nombre de archivo
    ruta = "C:\Users\diana\Dropbox\PROYECTO\"
    arch = "CLIENTES Y PROVEEDORES.xlsm"
    'abre el archivo
    Set l2 = Workbooks.Open(Filename:=ruta & arch)
    Set h2 = l2.Sheets("CLIENTES")
    Set b = h2.Columns("A").Find(rut_arriendo, lookat:=xlWhole)
    If Not b Is Nothing Then
        'busca el rut en la hoja y si lo encuentra agrega el nombre
        h2.Cells(b.Row, "B") = nombre_arriendo
        MsgBox "Dato actualizado"
        l2.Save
    Else
        MsgBox "No existe el rut"
    End If
    l2.Close
End Sub

Otra recomendación: No utilices la sentencia GoTo, busca la manera de estructurar tu macro para que no tenga que brincar de un lado a otro.


Muchas gracias por la recomendación!

eso si no me manda el nombre :(, lo adapté a mi macro y quedó:

Private Sub buscar_arriendo_Click()
    If rut_arriendo.Value = "" Then
        MsgBox "Falta capturar el rut"
        Exit Sub
    End If
    '
    'ruta y nombre de archivo
    ruta = "C:\Users\diana\Dropbox\PROYECTO\"
    arch = "CLIENTES Y PROVEEDORES.xlsm"
    'abre el archivo
    Set l2 = Workbooks.Open(Filename:=ruta & arch)
    Set h2 = l2.Sheets("CLIENTES")
    Set b = h2.Columns("B").Find(rut_arriendo, lookat:=xlWhole)
    If Not b Is Nothing Then
        'busca el rut en la hoja y si lo encuentra agrega el nombre
        h2.Cells(b.Row, "C") = nombre_arriendo
        MsgBox "Dato actualizado"
        l2.Save
    Else
        MsgBox "No existe el rut"
    End If
    l2.Close
End Sub

será algo de texto? el rut tiene formato 60-1 por ej.

En cuál columna tienes los rut, cómo se llama la hoja donde tienes los rut.

Puedes poner una imagen de tu hoja "Clientes"

Según los cambios que hiciste, los rut están en la hoja "clientes", en la columna "B"

En la columna "B" tienes rut, son textos, son números, son fórmulas.

Prueba con un dato sencillo, en la hoja "clientes", columna "B" escribe un dato, por ejemplo "rut1", en la columna "C" escribe "nombre rut1"; ahora en tu formulario en el textbox rut_ariendo escribe "rut1" y presiona el botón buscar.

¿Quieres obtener el nombre de la hoja clientes?

Lo que pasa es que en tu macro tienes esto:

Selection.Offset(0, 1) = nombre_arriendo

Eso que pusiste significa que en la celda vas a depositar el dato que tiene en el textbox nombre_arriendo.


Me parece que tu quieres lo contrario. Quieres que en el nombre_arriendo te ponga lo que tienes en la celda.


Entonces la macro debería ser así:

Private Sub buscar_arriendo_Click()
    If rut_arriendo.Value = "" Then
        MsgBox "Falta capturar el rut"
        Exit Sub
    End If
    '
    'ruta y nombre de archivo
    ruta = "C:\Users\diana\Dropbox\PROYECTO\"
    arch = "CLIENTES Y PROVEEDORES.xlsm"
    'abre el archivo
    Set l2 = Workbooks.Open(Filename:=ruta & arch)
    Set h2 = l2.Sheets("CLIENTES")
    Set b = h2.Columns("B").Find(rut_arriendo, lookat:=xlWhole)
    If Not b Is Nothing Then
        'busca el rut en la hoja 
        nombre_arriendo = h2.Cells(b.Row, "C")
        'MsgBox "Dato actualizado"
        'l2.Save
    Else
        MsgBox "No existe el rut"
    End If
    l2.Close
End Sub

No olvides valorar la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas