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

Respuesta
1

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.

Muchas gracias! Así lo haré,,

Aleida

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

Hola Dante,

Funciono perfecto todo,

Muchas gracias... gracias.. gracias, que tengas un lindo día de martes!

Aleida

Encantado de ayudarte. Cuando tengas tiempo pon la nueva pregunta, porque son diferentes formas de leer los archivos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas