Unir varios excel de una carpeta en uno solo excel

Como pasar varios excels a un excel

Necesitaría hacer una macro que haga lo siguientes:

En un carpeta voy a tener varios excel 15-20, lo que quiero que haga la macro es que copie toda la información de cada uno de estos excels desde A1 y lo lleve a un excel llamado Resumen y empiece a copiarlo como valor en A2, ya que en A1 tengo encabezados, lo que es importante que cuando copie por el excel 2, empiece a copiarlo como valor, en el primer registro libre del excel de Resumen y así sucesivamente, cuando haya terminado de copiar todos los excels 15-20 en el archivo Resumen, que los ordene desde A2 a R fin de de datos, por la columna R de menor a mayor, columna A de A a Z, columna B de A a Z, columna C de A a Z y columna B, me saque valores duplicados.

1 Respuesta

Respuesta
4

Te dejo la macro solicitada. ¿Aquí no tendrás que seleccionar los archivos a capturar sino que el mismo programa verificará si se encuentra con algún libro 'xls?' y en ese caso lo volcará en tu libro Resumen, que será el libro donde se encuentra esta macro.

Sub Resumiendo()
'x Elsamatilde
Dim Direc, libR, Archi
Dim Ruta As String, FileNameWOExt As String
Dim ini As Integer, fini As Integer, exten As Integer
'declarar el libro activo
Set libR = ActiveWorkbook
'buscar la carpeta
Set Direc = Application.FileDialog(msoFileDialogFolderPicker)
If Direc.Show = 0 Then Ruta = "": Exit Sub
Application.ScreenUpdating = False
'guarda nombre de directorio elegido
Ruta = Direc.SelectedItems(1)
'se crea la referencia al objeto Filesystem
With CreateObject("scripting.filesystemobject")
    With .GetFolder(Ruta)
    'se recorre el conjunto de archivos encontrados
    Application.DisplayAlerts = False
    For Each Archi In .Files
        'Obtener el nombre del archivo sin extensión
        ext = Mid(Archi, InStr(Archi, ".") + 1)
        If InStr(1, ext, "xls") > 0 Then    'controlar que sean xls o xls?
            If ini = 0 Then
                ini = 2
            Else
                ini = libR.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row + 1
            End If
            Workbooks.Open Archi   'pasa a ser el libro activo. se busca fin de rango
            fini = Range("A" & Rows.Count).End(xlUp).Row
            'copia y pegar como solo valores
            Range("A1:R" & fini).Copy
            libR.Sheets(1).Range("A" & ini).PasteSpecial Paste:=xlValues
            'cierra el libro y pasa a buscar otro
            ActiveWorkbook.Close False
        End If
    Next
    End With
End With
'se ordena la hoja Resumen: col R, A, B, C
fini = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
Range("A2:R" & fini).Select
    With ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields
        .Clear
        .Add2 Key:=Range("R3:R" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("A3:A" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("B3:B" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("C3:C" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    End With
    With ActiveWorkbook.Worksheets("Hoja1").Sort
        .SetRange Range("A2:R" & fini)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
'finaliza
Range("A2").Select
MsgBox "Fin del Proceso de captura.", , "Información"
End Sub

Con respecto al ordenamiento, no lo probé más que en Excel 365, por lo que si te presenta algún error en tu versión comentame. O mejor, con la grabadora de macros seleccioná la columna R e indicale tu criterio. Luego presioná el botón 'Agregar nivel' y realizá lo mismo con el resto de las columnas. Al finalizar con todos los niveles prsioná  Aceptar.

Detené la grabadora y en un módulo encontrarás la macro creada. Pasamela o quizás puedas adaptar mi código con la nueva sintaxis.

* Te invito a mirar el video N° 62 (La Grabadora de macros...) de mi canal.

Muchas gracias Elsa Matilde por la  macro, pero necesitaria que la macro se ejecutara desde la misma carpeta en donde tengo los excells a unir, el excel donde se tiene que hacer la macro va a tener como nombre ConversionFromatos CC, para una empresa, para otra sera ConversionFormatos CH, etc...

Bien, entonces si el libro con la macro (no importa su nombre) y los libros a capturar estarán en la misma carpeta, probá con esta macro ajustada.

Sub Resumiendo()
'x Elsamatilde
Dim Direc, libR, Archi
Dim Ruta As String, FileNameWOExt As String
Dim ini As Integer, fini As Integer, exten As Integer
'declarar el libro activo
Set libR = ActiveWorkbook
'los libros se encuentran en la misma carpeta que el resto a capturar
Ruta = ThisWorkbook.Path
'se crea la referencia al objeto Filesystem
With CreateObject("scripting.filesystemobject")
    With .GetFolder(Ruta)
    'se recorre el conjunto de archivos encontrados
    Application.DisplayAlerts = False
    For Each Archi In .Files
    'se excluye el libro activo
    If InStr(1, Archi.Name, ActiveWorkbook.Name) > 0 Then GoTo sigo
        'Obtener el nombre del archivo sin extensión
        ext = Mid(Archi, InStr(Archi, ".") + 1)
        If InStr(1, ext, "xls") > 0 Then    'controlar que sean xls o xls?
            If ini = 0 Then
                ini = 2
            Else
                ini = libR.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row + 1
            End If
            On Error Resume Next
            Workbooks.Open Archi   'pasa a ser el libro activo. se busca fin de rango
            fini = Range("A" & Rows.Count).End(xlUp).Row
            'copia y pegar como solo valores
            Range("A1:R" & fini).Copy
            libR.Sheets(1).Range("A" & ini).PasteSpecial Paste:=xlValues
            'cierra el libro y pasa a buscar otro
            ActiveWorkbook.Close False
        End If
sigo:
    Next
    End With
End With
'se ordena la hoja Resumen: col R, A, B, C
fini = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
Range("A2:R" & fini).Select
    With ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields
        .Clear
        .Add2 Key:=Range("R3:R" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("A3:A" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("B3:B" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Add2 Key:=Range("C3:C" & fini), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    End With
    With ActiveWorkbook.Worksheets("Hoja1").Sort
        .SetRange Range("A2:R" & fini)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
'finaliza
Range("A2").Select
MsgBox "Fin del Proceso de captura.", , "Información"
End Sub

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas