VBA循环文件夹中的文件并复制/粘贴到主文件

时间:2017-04-24 03:52:34

标签: vba excel-vba excel-2010 excel

我正在开发一个项目,该文件在一个文件夹和一个主模板中有3个文件。这就是我想要做的事情:

  1. 自动循环浏览这些文件,然后复制内容并将其粘贴到主文件中。
  2. 每个WHOLE文件将粘贴到主文件中的新工作表。
  3. 新工作表的名称将与文件名相同。
  4. 我试着编写一些代码,但我对VBA没有经验。以下代码无法正常工作,缺少功能2和3.请帮忙!

    Sub AllFiles()
    Application.EnableCancelKey = xlDisabled
    Dim folderPath As String
    Dim Filename As String
    Dim wb As Workbook
    Dim sh As Worksheet
    folderPath = "C:\Users\Ryan\Desktop\LoopThroughFolders\Sample1\" 'contains folder path
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\"
    Filename = Dir(folderPath & "*.xlsx")
    Do While Filename <> ""
        Application.ScreenUpdating = False
    
        Set wb = Workbooks.Open(folderPath & Filename)
    
        Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Copy
    
        'Not working well here as it will be overwritten by the next file 
        Workbooks("Master Template").Worksheets("Sheet1").Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row + 1).PasteSpecial xlPasteValues
    
        Workbooks(Filename).Close
        Filename = Dir
    Loop
       Application.ScreenUpdating = True
    End sub
    

1 个答案:

答案 0 :(得分:1)

尝试下面的代码(解释在代码注释中):

Option Explicit

Sub AllFiles()

Application.EnableCancelKey = xlDisabled

Dim folderPath As String
Dim Filename As String
Dim wb As Workbook
Dim Masterwb  As Workbook
Dim sh As Worksheet
Dim NewSht As Worksheet
Dim FindRng As Range
Dim PasteRow As Long

' set master workbook
Set Masterwb = Workbooks("Master Template.xlsx")

folderPath = "C:\Users\Ryan\Desktop\LoopThroughFolders\Sample1\" 'contains folder path

If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
Application.ScreenUpdating = False

Filename = Dir(folderPath & "*.xls*")
Do While Filename <> ""
    Set wb = Workbooks.Open(folderPath & Filename)

    If Len(wb.Name) > 35 Then
        MsgBox "Sheet's name can be up to 31 characters long, shorten the Excel file name"
        wb.Close False
        GoTo Exit_Loop
    Else
        ' add a new sheet with the file's name (remove the extension)
        Set NewSht = Masterwb.Worksheets.Add(After:=Masterwb.Worksheets(1))
        NewSht.Name = Replace(wb.Name, ".xlsx", "")
    End If

    ' loop through all sheets in opened wb
    For Each sh In wb.Worksheets
        ' get the first empty row in the new sheet
        Set FindRng = NewSht.Cells.Find(What:="*", Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)

        If Not FindRng Is Nothing Then ' If find is successful
            PasteRow = FindRng.Row + 1
        Else ' find was unsuccessfull > new empty sheet, should paste at the first row
            PasteRow = 1
        End If

        sh.UsedRange.Copy
        NewSht.Range("A" & PasteRow).PasteSpecial xlPasteValues
    Next sh
    wb.Close False

Exit_Loop:
    Set wb = Nothing
    Filename = Dir
Loop

Application.ScreenUpdating = True

End Sub