VBA: combine archivos de Excel de varias carpetas en una hoja de trabajo basándose en tener los mismos 4 primeros caracteres en el nombre del archivo.xlsx
Descripción:
Hay archivos con un ID de cliente del 001 al 100. Cada cliente tiene 3 informes de Excel diferentes (### Informe1-3), que se generan en diferentes carpetas (Carpetas1-3).
Por ejemplo: La carpeta 1 tendrá:
001 Report1.xlsx
...
100 Report1.xlsx
La carpeta 2 tendrá:
001 Report2.xlsx
...
100 Report2.xlsx
La carpeta 3 tendrá:
001 Report3.xlsx
...
100 Report3.xlsx
Cada uno de estos archivos contiene solo una hoja con Valores (sin fórmulas ni tablas dinámicas). Cada Informe 1, Informe 2, Informe 3 tiene un conjunto diferente de columnas/filas.
Pregunta:
Me gustaría crear un libro de trabajo para cada ID de cliente "###" y tener los informes como Hojas (### Informe1) (### Informe 2) (### Informe 3) (Todos los documentos deseados se combinarán en un libro de trabajo tendrá los primeros cuatro caracteres al principio del nombre de cada informe)
Por ejemplo, para Cliente: 001
Cree un libro de trabajo "001 AllReports.xlsx" que tenga:
Hoja 1 = 001 Informe1
Hoja 2 = 001 Informe2
Hoja 3 = 001 Informe3
Luego pase al ID de cliente 002 y haga lo mismo.
Por favor, avíseme si es necesario aclarar algo más. ¡Gracias, realmente lo aprecio!
Algunas notas/pensamientos:
Estaba pensando en crear una plantilla de macro de fusión que tenga 3 campos. Donde completo las rutas de la Carpeta 1, luego la Carpeta 2 y la Carpeta 3 y luego procedo a fusionar los documentos según la ID del cliente.
Para fusionar archivos básicos antes me basaba en: https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.copy
También tenía curiosidad por hacerlo con una consulta, pero como las columnas no son consistentes en el Informe 1-3, no estoy seguro de si sería siquiera una opción.
Este ejemplo/VBA es bueno si todos los archivos están en la misma carpeta: sería fantástico agregar las diferentes rutas de las carpetas y basarlas en los nombres que contienen el ID del cliente ###.
Sub ConslidateWorkbooks()
'Created by Sumit Bansal from https://trumpexcel.com
Dim FolderPath As String
Dim Filename As String
Dim Sheet As Worksheet
Application.ScreenUpdating = False
FolderPath = Environ("userprofile") & "\Desktop\Test\"
Filename = Dir(FolderPath & "*.xls*")
Do While Filename <> ""
Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True
For Each Sheet In ActiveWorkbook.Sheets
Sheet.Copy After:=ThisWorkbook.Sheets(1)
Next Sheet
Workbooks(Filename).Close
Filename = Dir()
Loop
Application.ScreenUpdating = True
End Sub