如何用 VBA 自动合并多个 Excel 文件
在日常工作中,我们常常需要将来自不同部门或项目的多个 Excel 工作簿数据汇总到一起。手动操作不仅繁琐,还容易出错。幸运的是,Excel 自带的 VBA 功能可以帮助我们自动化这个过程。本文将介绍一个基础的 VBA 宏,它能自动读取指定文件夹中的所有工作簿,并将数据合并到一个总表中。
准备工作:整理你的文件
在编写代码之前,需要先做好文件整理。我的理解是,这就像准备一个“原料库”,让程序能有序地取用。
- 准备一个“容器”:你需要一个单独的 Excel 工作簿,用来存放 VBA 代码和最终的合并结果。这个文件需要保存为“启用宏的工作簿”(.xlsm 格式)。
- 建立专用文件夹:将所有需要合并的源数据工作簿,统一放到一个新建的文件夹里,例如命名为“Consolidation”。这样,宏运行时就知道该去哪里找文件了。
VBA 宏的核心代码
准备工作完成后,就可以在 Excel 中按下 Alt + F11 打开 VBA 编辑器,插入一个新的模块,并将以下代码粘贴进去。
vba
Sub openfiles()
Dim MyFolder As String, MyFile As String, wbmain As Workbook, lastrow As Long
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
MyFolder = InputBox("Enter path of the Consolidation folder") & "\"
MyFile = Dir(MyFolder)
Do While Len(MyFile) > 0
Windows("Consolidation").Activate
Range("a1048576").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Select
Workbooks.Open Filename:=MyFolder & MyFile
Windows(MyFile).Activate
Dim ws As Worksheet
For Each ws In Sheets
ws.Activate
ws.AutoFilterMode = False
If Cells(2, 1) = "" Then GoTo 1
GoTo 10
1: Next
10: Range("a2:az20000").Copy
Windows("Consolidation").Activate
ActiveSheet.Paste
Windows(MyFile).Activate
ActiveWorkbook.Close
MyFile = Dir()
Loop
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With
End Sub
代码是如何工作的?
这段代码的逻辑并不复杂,它像一个有条不紊的助手,按步骤完成任务。
- 初始化与提速:代码开头定义了一些变量,并关闭了屏幕更新和警告提示,这能显著提升宏的运行速度。
- 定位与循环:它会弹窗让你输入“Consolidation”文件夹的路径,然后开始循环处理该文件夹内的每一个 Excel 文件。
- 复制与粘贴:对于每个打开的文件,宏会遍历其中的每一个工作表,清除可能存在的筛选器,然后复制从 A2 到 AZ20000 区域的数据(假设这是你的数据范围)。接着,它会在名为“Consolidation”的总工作簿中找到最后一行,并将数据粘贴到下方。
- 循环与收尾:处理完一个文件后,将其关闭,然后自动打开下一个文件,重复上述步骤,直到所有文件都处理完毕。最后,恢复屏幕更新和警告提示。
根据你的需求进行定制
这个基础宏可以根据你的具体情况进行调整,使其更贴合你的工作流程。
- 固定文件夹路径:如果你不想每次运行都手动输入路径,可以将
MyFolder = InputBox(...)这行代码,直接替换为MyFolder = “C:\你的文件夹路径” & “\”。 - 调整数据范围:代码中
Range(“a2:az20000”)定义了要复制的区域。如果你的数据列数不同(比如只到 M 列),可以将其中的 “AZ” 改为你需要的最后一列字母。 - 重要前提:这个宏最适合合并结构格式完全相同的工作簿。