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