VBA从文件夹中的所有文件复制工作表并将其复制到主控

Posted

技术标签:

【中文标题】VBA从文件夹中的所有文件复制工作表并将其复制到主控【英文标题】:VBA to copy sheets from all files in folder and copy it to master 【发布时间】:2017-06-07 21:37:57 【问题描述】:

我有一个包含多个 excel 文件的文件夹,所有文件都有一个特定的工作表,我需要将其复制到我的主文件中。

我需要宏来一一打开该文件夹中的所有文件,并将特定工作表复制到主文件,使用源文件名作为主工作簿中的工作表名称。 Excel 2013。

我尝试在线搜索并有以下代码:

Option Explicit

Sub test()

Dim wkbDest As Workbook
Dim wksDest As Worksheet
Dim wkbSource As Workbook
Dim wksSource As Worksheet
Dim MyPath As String
Dim MyFile As String

Application.ScreenUpdating = False

Set wkbDest = ThisWorkbook
Set wksDest = wkbDest.Worksheets("Sheet1") 'change the destination sheet name accordingly

MyPath = "H:\Cutover\"

If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"

MyFile = Dir(MyPath & "*.xls")

Do While Len(MyFile) > 0
    Set wkbSource = Workbooks.Open(MyPath & MyFile)
    Set wksSource = wkbSource.Worksheets("Sheet1") 'change the source sheet name accordingly
    'Your copy/paste code here (((((need help here please))))))))
    wkbSource.Close savechanges:=False
    MyFile = Dir
Loop

Application.ScreenUpdating = True

MsgBox "Completed...", vbInformation

End Sub

编辑:

所以我设法到达下面,但它仍然无法正常工作。它不会将工作表重命名为源文件名。有人可以帮忙吗?

选项显式

子测试()

Dim wkbDest As Workbook
Dim wksDest As Worksheet
Dim wkbSource As Workbook
Dim wksSource As Worksheet
Dim MyPath As String
Dim MyFile As String

Application.ScreenUpdating = False

Set wkbDest = ThisWorkbook
Set wksDest = wkbDest.Worksheets("Sheet1") 'change the destination sheet name accordingly

MyPath = "H:\Cutover\"

If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"

MyFile = Dir(MyPath & "*.xlsx")

Do While Len(MyFile) > 0
    Set wkbSource = Workbooks.Open(MyPath & MyFile)
    Set wksSource = wkbSource.Worksheets("Sheet1") 'change the source sheet name accordingly
    Sheets("SheetToCopy").Copy Before:=Workbooks("WorkbookToPasteIn").Sheets(SheetIndex)
    wkbSource.Close savechanges:=False
    MyFile = Dir
Loop

Application.ScreenUpdating = True

MsgBox "Completed...", vbInformation

结束子

【问题讨论】:

@dominic111 你能帮忙吗? @a.s.h 你能帮忙吗? 【参考方案1】:

所以您需要帮助的部分是如何将范围从一个文件中的工作表复制/粘贴到目标文件中的通用工作表?

设置一个变量来跟踪目标工作表中的最后一个空行

查看如何确定每个源工作表中的最后一行,选择该源范围,将其复制到剪贴板,然后将其粘贴到目标工作表的最后一个空行,并将目标变量重置为在目标工作表中新建第一个空白行


另一种方法是打开一个输出 CSV 文件,解析每一行并构建一个字符串并将其写入文件,而不关闭输出 CSV 文件,直到循环结束


如果文件很大,使用 VB.NET 会更好,因为它在处理大文件时要快得多


您还可以将每个文件/行读入内存数据表,然后将数据表输出到 CSV 文件或目标 Excel 文件

您更喜欢哪种方法?

【讨论】:

文件不大。最多 300 行,其中只有一张纸。我只需要复制整个工作表并将其作为工作表粘贴到主工作簿中,源文件名作为工作表名称。抱歉,对 VBA 很陌生 @A.S.H 你能帮忙吗?【参考方案2】:

您可以按照以下代码简单地将工作表复制到新工作簿中:

Sheets("SheetToCopy").Copy Before:=Workbooks("WorkbookToPasteIn").Sheets(SheetIndex)

然后,重命名工作表以适合您的方式。

【讨论】:

谢谢你。它可以工作,但是在 2 个工作簿说“这个名字已经被占用”之后它失败了。我需要使用文件名作为工作表名。 然后粘贴后立即改名。如果您有两次相同的工作表名称,则显然行不通。

以上是关于VBA从文件夹中的所有文件复制工作表并将其复制到主控的主要内容,如果未能解决你的问题,请参考以下文章

将值从多个工作簿复制到主文件中的特定单元格

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

VBA复制粘贴循环

VBA自动过滤复制值,去重并粘贴到其他工作表中

Excel VBA - 循环遍历多个文件夹中的文件,复制范围,粘贴到此工作簿中

VBA - 复制单元格并粘贴列中的空行