简体   繁体   中英

Copy and Paste Data from Multiple Excel Files within the same folder into one Single Excel File

Good morning!

I'm trying to loop through Excel Files within the same folder to copy and paste a range of data into a single Excel Workbook.

The start location of the cell range is always consistent, it starts at Cell D12 and ends anywhere between C91 and Z91.The table dimensions however do vary from 80 R x 2 C to 80 R x 22 C. The Excel files I'm trying to pull the Data from have multiples sheets but the sheet where I need the Data from always has the same name, in this case its "Performance".

I need it to

  1. Find the data dimension in file (table)
  2. Copy that table
  3. Paste to destination (below previous table)
  4. Loop through to next file
  5. Repeat Step 1-4

Thanks a lot for any help, I appreciate any help, let me know if you have any specific questions.

SO isn't a code writing service, but yesterday I did something similar, that you can use for a starting point.

Code is in one workbook. It creates a new workbook (Target) and loops the folder for all worksbooks (Source) and copies the worksheets from these to the target.

Finally, saves the Target:

Option Explicit

Public Function ImportSheets()

    Dim Source          As Excel.Workbook
    Dim Target          As Excel.Workbook
    
    Const FolderName    As String = "C:\Path\SomeFolder"
    Const FileMask      As String = "*.xlsx"
    Const Separator     As String = "\"
    Const TargetMask    As String = "Current Projects {0}.xlsx"
    
    Dim Worksheet       As Excel.Worksheet
    
    Dim FileName        As String
    Dim Count           As Integer
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    Set Target = Workbooks.Add
    
    FileName = Dir(FolderName & Separator & FileMask)
    Do While FileName <> ""
        Set Source = Workbooks.Open(FolderName & Separator & FileName)
        For Each Worksheet In Source.Worksheets
            Count = Target.Worksheets.Count
            Source.Worksheets(Worksheet.Name).Copy After:=Target.Worksheets(Count)
        Next
        Source.Close False
        FileName = Dir()
    Loop
    Set Source = Nothing
    
    Target.Worksheets(1).Delete
    FileName = Replace(TargetMask, "{0}", Format(Date, "yyyy-mm-dd"))
    Target.SaveAs FolderName & Separator & FileName
    Target.Close
    Set Target = Nothing
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Function

You should be able to expand it a bit to only copy a specific part of the source worksheets.

Maybe this?

Sub Basic_Example_1()
    Dim MyPath As String, FilesInPath As String
    Dim MyFiles() As String
    Dim SourceRcount As Long, Fnum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long

    'Fill in the path\folder where the files are
    MyPath = "C:\Users\Ron\test"

    'Add a slash at the end if the user forget it
    If Right(MyPath, 1) <> "\" Then
        MyPath = MyPath & "\"
    End If

    'If there are no Excel files in the folder exit the sub
    FilesInPath = Dir(MyPath & "*.xl*")
    If FilesInPath = "" Then
        MsgBox "No files found"
        Exit Sub
    End If

    'Fill the array(myFiles)with the list of Excel files in the folder
    Fnum = 0
    Do While FilesInPath <> ""
        Fnum = Fnum + 1
        ReDim Preserve MyFiles(1 To Fnum)
        MyFiles(Fnum) = FilesInPath
        FilesInPath = Dir()
    Loop

    'Change ScreenUpdating, Calculation and EnableEvents
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'Add a new workbook with one sheet
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    rnum = 1

    'Loop through all files in the array(myFiles)
    If Fnum > 0 Then
        For Fnum = LBound(MyFiles) To UBound(MyFiles)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum))
            On Error GoTo 0

            If Not mybook Is Nothing Then

                On Error Resume Next

                With mybook.Worksheets(1)
                    Set sourceRange = .Range("A1:C1")
                End With

                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    'if SourceRange use all columns then skip this file
                    If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
                        Set sourceRange = Nothing
                    End If
                End If
                On Error GoTo 0

                If Not sourceRange Is Nothing Then

                    SourceRcount = sourceRange.Rows.Count

                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "Sorry there are not enough rows in the sheet"
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else

                        'Copy the file name in column A
                        With sourceRange
                            BaseWks.cells(rnum, "A"). _
                                    Resize(.Rows.Count).Value = MyFiles(Fnum)
                        End With

                        'Set the destrange
                        Set destrange = BaseWks.Range("B" & rnum)

                        'we copy the values from the sourceRange to the destrange
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value

                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If

        Next Fnum
        BaseWks.Columns.AutoFit
    End If

ExitTheSub:
    'Restore ScreenUpdating, Calculation and EnableEvents
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

You can find other similar examples in the link below.

https://www.rondebruin.nl/win/s3/win008.htm

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM