¿Cómo puedo buscar con Buscarv a través de todos los archivos de una carpeta?

Tengo una consulta y quiero ver si me pueden ayudar a resolverla, he buscado ayuda en la web, pero hasta ahora sin mucho éxito, espero no infringir alguna norma de este o cualquier otro foro al consultar ya en un segundo, bueno esta es la explicación de lo que pretendo hacer, espero explicarme.

Tengo una carpeta en el escritorio llamada “carpeta1”con un archivo llamado "base” y varios archivos más que se llaman "libro2, libro3", pero pueden llamarse de distinta forma y puede haber más archivos.

El libro “base” contiene un formulario que pretende buscar datos de todos los demás libros, (aunque estén cerrados) dentro de la carpeta, es decir si el formulario tiene 2 textboxs, en el primero coloco el ID a buscar y lo que debe hacer la rutina es colocar el dato contiguo encontrado en el textbox2.

Por ejemplo:

En el libro2 y libro3 en la hoja1 hay una serie de datos hasta la columna N, las columnas involucradas en este procedimiento siempre van a ser la “M:N”, porque en la columna M estará el dato a encontrar y en la columna N el dato que quiero mostrar en el textbox.

Este sería como debería funcionar: Lanzar el formulario del archivo base, digitar el id en el textbox1, ejemplo “a1” que es el ID (datos de la columna N) y al momento de ingresarlo el textbox debería buscar en todos los libros y regresar el dato: “juan-gonzalez-cortes” (dato de la columna M) en el textbox2.

¿Esto es posible de hacer?, espero puedan orientarme un poco porque estoy muy perdido, lo mas que he podido realizar es una búsqueda pero en un libro especifico y este tiene que estar abierto sino no me funciona, este es como lo he hecho.

Private Sub TextBox1_Change()
  On Error Resume Next
TextBox2 = Application.WorksheetFunction.VLookup(TextBox1, Workbooks("Libro2.xlsx").Sheets("Hoja1").Range("M2:N100000"), 2, 0)
End Sub

1 Respuesta

Respuesta
2

H o  l a:

La siguiente macro busca en todas las hojas de cada libro.

Pon la macro en tu formulario. Cambia "C:\trabajo\carpeta1\", por la carpeta donde se encuentran tus archivos.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Application.ScreenUpdating = False
    TextBox2 = ""
    If TextBox1 = "" Then Exit Sub
    ruta = "C:\trabajo\carpeta1\"
    If Right(ruta, 1) <> "\" Then ruta = ruta & "\"
    arch = Dir(ruta & "*.xls*")
    res = ""
    Do While arch <> ""
        Set l2 = Workbooks.Open(ruta & arch)
        For Each h In l2.Sheets
            Set b = h.Columns("M").Find(TextBox1, lookat:=xlWhole)
            If Not b Is Nothing Then
                res = b.Offset(0, 1)
                Exit For
            End If
        Next
        l2.Close
        arch = Dir()
    Loop
    If res <> "" Then
        TextBox2 = res
    Else
        MsgBox "Dato no encontrado"
    End If
    Application.ScreenUpdating = True
End Sub

' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

Hola Dam!, gracias por responder y perdona la demora en contestar. Estoy probando tu código y si funciona, pero al buscar en varios archivos el proceso se se torna lento, intente acortar la búsqueda pero no me ayudo del todo, habrá una manera de agilizarlo un poco mas?

Esta fue mi idea. Solamente hice que en el momento que encuentre el código deje de buscar , pero aún lo creo lento.

Application.ScreenUpdating = False
    Me.TextBox2 = ""
    If TextBox1 = "" Then Exit Sub
    Ruta = "C:\trabajo\carpeta1\"
    If Right(Ruta, 1) <> "\" Then Ruta = Ruta & "\"
    arch = Dir(Ruta & "*.xls*")
    res = ""
    Do While arch <> ""
        Set l2 = Workbooks.Open(Ruta & arch)
        For Each h In l2.Sheets 'sólo a una hoja en especifico
            Set b = h.Columns("M").Find(TextBox1, lookat:=xlWhole)
            If Not b Is Nothing Then
                res = b.Offset(0, 1)
                Me.TextBox2 = res
                l2.Close
                If res <> "" Then Exit Sub
                Exit For
            End If
        Next
        l2.Close
        arch = Dir()
    Loop
    If res <> "" Then
        Me.TextBox2 = res
    Else
        MsgBox "Dato no encontrado", vbExclamation
    End If
    Application.ScreenUpdating = True

La velocidad de la macro depende del número de libros que tenga que revisar y de la cantidad de hojas que tenga cada libro; y por supuesto, del tipo de procesador que tenga tu máquina.

Si el valor es encontrado, entonces cambia en mi macro esto:

Exit For

Por esto:

Exit Do


' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas