前面介绍了通过打开文件的对话框,选择目录进行多文件一键汇总的方法,也介绍了使用VBA提取文件存储路径和文件名的方法。如果大量的表格文件分别存储在分散的不同目录下,前面介绍的汇总的方法就不太好用了。虽然也可以将分布在不同目录下的文件使用批处理命令复制汇总到同一目录下,再用第一个汇总的方法进行文件表格多合一的汇总。但毕竟有些繁琐。在提取文件列表之后,即可按列表逐一打开文件进行复制汇总。
1.需求场景
有多个相同格式的数据表文件需要汇总到一起。汇总之后可以实现将单独保存在大量文件中的表文件复制到同一个文件中,即可通过切换表格的方式分别查看各个表中的内容,而不必一遍遍打开、关闭文件。
2.解决思路
用前面介绍过的办法提取需要处理的文件列表,使用循环语句遍历每个文件,逐一打开文件,复制表格内容到当前文件,关闭临时文件。
3.VBA实现
Dim wb, wbtmp, wbNew As Workbook
Dim ws, sh, wsNew As Worksheet
Dim startLine, endLine, iLine, i, j, k, n As Integer
Dim openFile, filePath, fileName As String
Dim last_row As Integer
Public Sub 多文件汇总()
'设置工作簿变量为当前工作簿
Set wb = Workbooks(1)
wb.Activate
'设置工作表为保存待汇总文件路径和文件名的表格
Set ws = Worksheets("文件列表")
ws.Activate
'设置汇总文件在列表中的起始行和结束行当行号,即汇总范围
startLine = 2
endLine = 13
'关闭屏幕刷新
Application.ScreenUpdating = False
'循环打开文件进行汇总(复制)
For iLine = startLine To endLine
wb.Activate
Set ws = Worksheets("文件列表")
ws.Activate
'从文件列表中获取当先要处理的文件的路径和文件名。
filePath = ws.Cells(iLine, 1).Value
fileName = ws.Cells(iLine, 2).Value
'拼接要打开文件的完整路径
openFile = filePath & fileName
'设置临时工作簿对象为打开的文件
Set wbtmp = GetObject(openFile)
'设置工作表为打开文件的第一个工作表
Set sh = wbtmp.Worksheets(1)
'将打开文件的第一个工作表复制到文件列表所在文件中,复制到当前所有表之后的位置
sh.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
'关闭临时文件
wbtmp.Close savechanges:=True
'输出调试信息,监控汇总进度
Debug.Print "文件" & iLine & ": " & Right(openFile, Len(openFile) - InStrRev(openFile, "\")) & " 汇总完成。"
Next iLine
'打开屏幕刷新
Application.ScreenUpdating = True
'释放工作表和工作簿变量
Set ws = Nothing
Set wb = Nothing
Set sh = Nothing
Set wbtmp = Nothing
'输出提示信息
MsgBox "数据汇总完成。"
End Sub