Macro para buscar datos y extraer de varios libros

Tengo que extraer un montón de datos de varios archivos y hacerlo manualmente seria de locos, por eso os pido quien me pueda ayudar para generar una macro que haga lo siguiente:

Tengo en una carpeta 111 libros excel cuyo nombre de archivo es reporte001 hasta el reporte111.

De estos libros en la hoja registro debo de buscar desde la fila 4 los que tengan algún dato en la columna "J" "observaciones" y extraer a la hoja data del libro datostel, el valor de la columna "B" (DNI), el valor "C" (nombre) y el valor de la columna "J" (observaciones).

Adjunto dos imágenes para mayor información.

1 Respuesta

Respuesta
1

Te dejo la macro que necesitas. Va explicada paso a paso para que puedas ajustar cualquier detalle (x ejemplo comentas que los datos empiezan en fila 4 pero en imagen se ven en fila 3).

Sub rescataDatos()
'x Elsamatilde
'nombre de la carpeta donde estarán los archivos
carpe = "D:\carpetas Datos\Downloads\Al_TRABAJO"
'libro/hoja origen y 1ra fila donde colocar los datos
Set lib1 = ActiveWorkbook
Set hor = lib1.ActiveSheet
filx = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row + 1
'se crea la referencia al objeto Filesystem
With CreateObject("scripting.filesystemobject")
    With .GetFolder(carpe)
    'se recorre el conjunto de archivos encontrados cuyo nombre se inicia con 'Reporte'
    For Each archi In .Files
    If Left(archi.Name, 7) = "Reporte" Then
        'se abre el libro encontrado y se activa la hoja REGISTRO
        Workbooks.Open (archi)
        ActiveWorkbook.Sheets("REGISTRO").Select
        'recorre la col J a partir de fila 4, si hay texto copia en hoja origen
        ActiveSheet.[J4].Select
        'el fin de rango lo dará la col B
        x = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
        While ActiveCell.Row <= x
            If ActiveCell <> "" Then
                'copia las 3 col en hoja origen
                Range("B" & ActiveCell.Row & ":C" & ActiveCell.Row).Copy Destination:=hor.Cells(filx, 1)
                ActiveCell.Copy Destination:=hor.Cells(filx, 3)
                'se incrementa en 1 la fila destino
                filx = filx + 1
            End If
            'se pasa a fila siguiente para repetir el bucle
            ActiveCell.Offset(1, 0).Select
        Wend
        'cierra el libro sin guardar los cambios
        ActiveWorkbook.Close False
    End If
    'se repite el bucle buscando otro libro
    Next archi
    End With
End With
MsgBox "Fin del proceso"
End Sub

Ajusta el nombre de la carpeta que contendrá los libros y verifica el nombre de los libros que en la macro coloqué como 'Reporte'.

Esta macro se coloca en un módulo del libro de destino (datostel) y se ejecuta desde la hoja donde deban ser colocados los datos capturados.

Podrás ejecutar la macro desde el mismo menú Macros, o con un botón o con un atajo de teclado... estos temas los tengo explicados en la sección Macros de mi sitio.

* Si esta respuesta resuelve tu problema no olvides valorarla (buena o Excelente). Sino comenta o solicita aclaraciones.

Sdos.

Elsa

Buenas noches :

Ante todo muchas gracias, pero debo de pedirte más apoyo. Cuando lo ejecuto me indica que no se han definido las variables, discúlpame la torpeza pero recién estoy empezando a entrar el vba.

De antemano te vuelgo a agrdecer tu inestimable ayuda.

Saludos.

Esto es porque tu editor tiene activada la declaración obligatoria de las variables... casi nunca las tienen por so omitimos declararlas.

Las variables es conveniente declararlas al inicio de la macro, así te sera fácil ver que nombres utizaste y de que tipo las declaraste.

Para esta macro son:

Dim lib1, hor, archi

Dim filx as long, x as long

Dim carpe as string

Te deje diferentes tipos de declaración, cuando no sepas d que tipo de variable se trata dejalas sin la parte del 'as...'

Sdos!

Te recuerdo que la consulta sigue abierta... ¿necesitas algo más?

Si el tema está resuelto no olvides valorarla (excelente o buena) para darla por cerrada.

Sdos!

¡Gracias! En verdad me sirvió de mucho ayuda le tuve que hacer unos cambios al código pero resulto.

Discúlpame por no haber cerrado el tema pero estaba tan liado con el trabajo que se me olvido.

Muchísimas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas