Excel VBA将文件夹中多个文件中的多张图纸复制到一个文件中的多张图纸中
我一直在试图找到一个“合并”excel文件的快速解决方案,遇到了至少十几个不同的代码,尝试记录我自己的宏并对其进行修改(而不是一系列的工作表名称试图选择批次等)。所有这些都没有达到我想要的效果,大多数根本不起作用 背景如下: 我在一个文件夹(“C:\Zoltan\TEST\”)中有很多文件,大多数都有多张工作表。我想抄写Excel VBA将文件夹中多个文件中的多张图纸复制到一个文件中的多张图纸中,excel,vba,file,merge,spreadsheet,Excel,Vba,File,Merge,Spreadsheet,我一直在试图找到一个“合并”excel文件的快速解决方案,遇到了至少十几个不同的代码,尝试记录我自己的宏并对其进行修改(而不是一系列的工作表名称试图选择批次等)。所有这些都没有达到我想要的效果,大多数根本不起作用 背景如下: 我在一个文件夹(“C:\Zoltan\TEST\”)中有很多文件,大多数都有多张工作表。我想抄写 工作表名称中没有“邮寄”的所有工作表 来自文件名中没有“打印”的所有文件 放入一个文件(“C:\Zoltan\TEST.xlsx”),保持工作表与源文件中的工作表分开 只有当
- 工作表名称中没有“邮寄”的所有工作表
- 来自文件名中没有“打印”的所有文件
- 放入一个文件(“C:\Zoltan\TEST.xlsx”),保持工作表与源文件中的工作表分开
- 只有当工作表名称已经存在时,我才想给它一个日期戳(例如,从2105年8月28日创建的“E8795 NTI邮寄订单.XLSX”中名为“NTI UK(150)”的工作表变为“NTI UK(150)20150828”
Sub CombineSheets()
Dim sPath As String
Dim sFname As String
Dim wbk As Workbook
Dim wSht As Worksheet
Application.EnableEvents = False
Application.ScreenUpdating = False
sPath = "C:\Zoltan\TEST\"
ChDir sPath
sFname = "*Mailing*"
sFname = Dir(sPath & "\" & sFname & ".xl*", vbNormal)
Do Until sFname = ""
Set wbk = Workbooks.Open(sFname)
Windows(sFname).Activate
For Each ws In Sheets
If Not ws.Name Like "*Mailing*" Then ws.Copy Before:=ThisWorkbook.Sheets(1)
wbk.Close False
sFname = Dir()
Next
Loop
ActiveWorkbook.Save
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
我希望我已经以一种清晰易懂的方式解决了这个问题,但为了安全起见,如果我手动解决这个问题,它将如下所示:
许多感谢您的代码是否正在创建您找到的工作表的副本?您没有确切解释发生了什么或没有发生什么。您的sFname=Dir()命令放错了位置…我建议您只是自动设置名称,而不是尝试查看名称是否存在 文件名很简单,请在do循环中使用以下内容:
Set wbk = Workbooks.Open(sFname)
Windows(sFname).Activate
For Each ws In Sheets
If Not sFname Like "*printing*" Then
If Not ws.Name Like "*Mailing*" Then
ws.Copy Before:=ThisWorkbook.Sheets(1)
ThisWorkbook.Sheets(1).Name = ThisWorkbook.Sheets(1).Name + Format(Now(), "yyyyMMdd-hhmm")
End If
wbk.Close
End If
Next
sFname = Dir()
一些修复:
Sub CombineSheets()
Const sPath As String = "C:\Zoltan\TEST\"
Dim sFname As String
Dim wbk As Workbook
Dim wSht As Worksheet
Application.EnableEvents = False
Application.ScreenUpdating = False
'sPath already has a trailing \ - don't add another...
sFname = Dir(sPath & "*Mailing*.xl*", vbNormal)
Do Until sFname = ""
'Dir only gives you the filename - use full path below
Set wbk = Workbooks.Open(sPath & sFname)
For Each wSht In wbk.WorkSheets
If Not wSht.Name Like "*Mailing*" Then
wSht.Copy Before:=ThisWorkbook.Sheets(1)
End If
Next
'moved these lines out of the sheets loop
wbk.Close False
sFname = Dir()
Loop
ThisWorkbook.Save
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
您正在调用
Dir()
并在工作表的内部循环中关闭源工作簿-您应该将这些行移到loop
之前。嗨,蒂姆,谢谢您的评论,我已经将这些行移出了循环,它抛出了一个运行时错误,表示找不到[…].xlsx文件。我尝试使用sFname=Dir(sPath&sFname&“.xl*”,vbNormal)因为sPath在测试后已经包含反斜杠,但它只是删除了相同的错误消息。它找不到的文件是C:\Zoltan\TEST \-中的第一个文件,它是否在某个地方更改了目录,并试图在获得文件名后在另一个文件夹中查找该文件?很抱歉,我不是很清楚:代码没有任何对用户可见的内容我还没有达到运行它,输出每个变量,并试图使每个步骤产生一个可见的结果的程度,我很快就会这样做。你说的“自动设置名称”是什么意思?通过自动设置名称,我的意思是创建新的工作表并立即给它一个唯一的名称,正如我在上述代码的内部If中所做的那样。这比试图确定是否已经存在具有特定名称的工作表要简单得多。抱歉@PKatona,该公司正在进行一次收购,但不允许我返回此问题e、 它仍然在桌面上,我会尽快测试发布在这里的解决方案并回复/投票等!抱歉@Tim Williams,公司正在进行收购,不允许我回到这个问题。它仍然在桌面上,我会尽快测试发布在这里的解决方案并回复/投票等!