Unir varios ficheros .csv en un Excel file y agregarle como una ultima columna que es el nombre del fichero.
Tengo varios ficheros .csv y necesito crear un excel que una todos los ficheros csv y le adicione una columna que contenga el nombre del fichero.(Solo el nombre no la extensión)
¿Alguna idea como puedo hacer esto de una forma automática que me simplifique el tiempo? Este es un proceso que se repetirá cada semana y esta semana los .csv a unir son 30 ficheros.
1 Respuesta
Puedes responder y en el siguiente orden:
1. Cómo están los datos en el archivo csv, separados por comas o por punto y coma.
2. Puedes poner un ejemplo de cómo está alguno de los archivos. Edita un archivo csv pero con el bloc de notas, tomas una imagen de ese ejemplo y la pegas aquí.
3. Cómo quieres que se inserten los archivos, todos en la misma hoja, uno abajo del otro.
4. Cuántas columnas tienen los archivos.
5. Cuál de las columnas del archivo siempre tiene datos.
Esta es una captura de parte de los datos en el csv file.
Los datos llegan hasta la columna AS y en la columna AT es donde necesito poner el nombre del fichero.
Los archivos se deben insertar uno debajo del otro en una misma hoja, pueden haber columnas en blanco pero no siempre son las mismas. Pero las necesito en el fichero unido en el mismo orden que están en el fichero csv y que mantenga las columnas sin datos también.
El nombre del fichero csv esta formado asi 310373_IM_1620311379399_Sarasota.csv, solo necesitaría incluir en el campo que se va agregar los primeros números antes del _ o sea en este caso seria el 310373.
Prueba la siguiente macro. Cambia en la macro
La ruta por el nombre de la carpeta donde tienes tus csv
Y cambia el nombre de hoja "consolidado" por el nombre de tu hoja.
Sub Condolidar_csv() 'Por Dante Amor Dim ruta As String, nom As String Dim arch As Variant Dim l1 As Workbook, l2 As Workbook Dim sh1 As Worksheet, sh2 As Worksheet Dim u1 As Long, u2 As Long ' Application.DisplayAlerts = False Application.ScreenUpdating = False ruta = "C:\trabajo\" arch = Dir(ruta & "*.csv") Set sh1 = Sheets("Consolidado") sh1.Cells.Clear ' Do While arch <> "" Set l2 = Workbooks.Open(ruta & arch) Set sh2 = l2.ActiveSheet nom = Mid(arch, 1, Len(arch) - 4) nom = Split(nom, "_")(0) u1 = sh1.Range("A" & Rows.Count).End(3).Row + 1 u2 = sh2.Range("A" & Rows.Count).End(3).Row ' sh1.Range("A" & u1).Resize(u2 - 1, Columns("AS").Column).Value = _ sh2.Range("A2:AS" & u2).Value sh1.Range("AT" & u1).Resize(u2 - 1).Value = nom ' l2.Close False arch = Dir() Loop Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "Fin" End Sub
Hola dante..,
Fnciono perfecto, Gracias, Gracias... solo me faltaría que se copie el encabezado la primera vez y poder seleccionar la carpeta donde estarán los .csv, no que sea prefijada en la macro.
Hola de nuevo,
Otra cosa que revisando vi que los números iniciales del nombre del fichero pueden variar su longitud por ejemplo hoy me entraron 2 ficheros que los nombres son
310355P2_IM_P2_1620243323470_Youngstown_P2 y
310355_IM_1620235282550_Youngstown
Y no me identifica separado el que tiene el P2 todos los pone como 310355 y es necesario separar las versiones.
Hola,
Ya esto ultimo si me funciono bien, que me devuelve completo hasta donde esta el "_" esto esta perfecto.
Solo queda ver la posibilidad que copie el encabezado y que se me abra la ventana de windows para seleccionar los .csv que deseo consolidar.
Saludos y muchas gracias!!!!
Aleida
Solo me faltaría que se copie el encabezado la primera vez y poder seleccionar la carpeta donde estarán los .csv
Son elementos que no pediste en tu pregunta inicial.
En lo sucesivo, procura ser más específica en todo lo que requieres.
310355P2_IM_P2_1620243323470_Youngstown_P2 y
310355_IM_1620235282550_Youngstown
Y no me identifica separado el que tiene el P2
La macro separa el primer dato que está antes del guión bajo "_"
Revisa el nombre de cada archivo y que efectivamente el primer dato esté antes de un guión bajo.
En mis pruebas si pone el "P2":
Prueba la siguiente macro para el encabezado y seleccionar la carpeta.
Sub Condolidar_csv() 'Por Dante Amor Dim ruta As String, nom As String Dim arch As Variant Dim l1 As Workbook, l2 As Workbook Dim sh1 As Worksheet, sh2 As Worksheet Dim u1 As Long, u2 As Long ' Application.DisplayAlerts = False Application.ScreenUpdating = False ' With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Selecciona la Carpeta" .AllowMultiSelect = False If .Show <> -1 Then Exit Sub ruta = .SelectedItems(1) & "\" End With 'ruta = "C:\trabajo\" arch = Dir(ruta & "*.csv") Set sh1 = Sheets("Consolidado") sh1.Cells.Clear ' Do While arch <> "" Set l2 = Workbooks.Open(ruta & arch) Set sh2 = l2.ActiveSheet nom = Mid(arch, 1, Len(arch) - 4) nom = Split(nom, "_")(0) u1 = sh1.Range("A" & Rows.Count).End(3).Row + 1 u2 = sh2.Range("A" & Rows.Count).End(3).Row ' sh1.Range("A1:AS1").Value = sh2.Range("A1:AS1").Value sh1.Range("A" & u1).Resize(u2 - 1, Columns("AS").Column).Value = _ sh2.Range("A2:AS" & u2).Value sh1.Range("AT" & u1).Resize(u2 - 1).Value = nom ' l2.Close False arch = Dir() Loop Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "Fin" End Sub
Hola Dante,
Muy buenos días de Lunes! Espero haya tenido un lindo fin de semana..
Muchas gracias por su ayuda, ... Funciona perfecto..., pero no puedo escoger los ficheros .csv, siempre me incluye todos los que estén en la carpeta seleccionada, ¿si no le fuera molestia es posible poder escoger que ficheros .csv se van a consolidar?.
Un saludo
Aleida
Con mucho gusto te ayudo con todas tus peticiones. Valora esta respuesta y crea una nueva pregunta y ahí especificas lo que deseas.
No pusiste la nueva pregunta.
Te pedí la nueva pregunta, porque prácticamente es otro código.
Pero pongo aquí el código actualizado:
Sub Condolidar_csv() 'Por Dante Amor Dim ruta As String, nom As String Dim arch As Variant Dim l2 As Workbook Dim sh1 As Worksheet, sh2 As Worksheet Dim u1 As Long, u2 As Long ' Application.DisplayAlerts = False Application.ScreenUpdating = False ' Set sh1 = Sheets("Consolidado") sh1.Cells.Clear ' With Application.FileDialog(msoFileDialogFilePicker) .Title = "Seleccione archivos csv" .Filters.Clear .Filters.Add "Archivos csv", "*.csv" .FilterIndex = 1 .AllowMultiSelect = True .InitialFileName = ThisWorkbook.Path & "\" If .Show Then For Each arch In .SelectedItems Set l2 = Workbooks.Open(arch) Set sh2 = l2.ActiveSheet nom = Mid(arch, 1, Len(arch) - 4) nom = Split(nom, "_")(0) arch = Split(nom, Application.PathSeparator) nom = arch(UBound(arch)) u1 = sh1.Range("A" & Rows.Count).End(3).Row + 1 u2 = sh2.Range("A" & Rows.Count).End(3).Row ' sh1.Range("A1:AS1").Value = sh2.Range("A1:AS1").Value sh1.Range("A" & u1).Resize(u2 - 1, Columns("AS").Column).Value = _ sh2.Range("A2:AS" & u2).Value sh1.Range("AT" & u1).Resize(u2 - 1).Value = nom ' l2.Close False Next End If End With Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "Fin" End Sub
Hola, Buenos días,
Disculpa pero ayer tuve una reunión de trabajo hasta tarde y no pude poner la pregunta.
Ahora pruebo la nueva macro con nuevos ficheros que me entraron para consolidar.
Muchísimas gracias..!
En breve te comento.
Un saludo
Aleida
- Compartir respuesta