上周我去都江堰某企业上课,其中一位学员问我一个问题:“林老师,如何快速合并同一文件夹下的多个工作表?”
我原本以为只是一种做表思路,因为相同属性的数据区域应该放在同一工作表中。所以我问:“为什么要将数据放在多个工作表中而不是一张工作表上呢?”
这位学员继续解释:“这是他们需要下发至各个部门,由他们分别填写的工作表,在收集回来的时候需要将这些工作表汇总成一个工作薄?而每次我都要将几十张表进行手工汇总,很麻烦的!”
的确很麻烦!合并多张工作薄或者工作表是我们日常工作中比较频繁的操作,而大多数人都是采用手工处理的方式——因为这个看似简单的操作由于涉及到要打开工作薄文件才能实现引用,所以用EXCEL自带的“合并计算”或是“数据透视表”都无法进行最简单的合并多个工作薄操作。
而我也没有找到更为简便的方式解决这个问题,我目前只能用编写VBA代码的方式合并同一文件夹下的不同工作薄,如果大家有更为便捷的好方法,请告诉我,让我学习,共同进步!
我想到的方法如下:
第一步:将多个需要合并的工作薄放在同一个文件夹下,并新建一个文件。如下图,我新建了一个名为“林屹老师-合并工作薄.xlsx”的工作薄。
第二步,打开这个工作薄,并按快捷键Alt+F11进入VBE编辑器页面,如下图。
第三步,我们要在这张工作表“Sheet1”上汇总所有数据,所以现在给它新建一个自定义命令。
双击左侧的“Sheet1”,弹出代码录入窗口。顺便说一下,如果没有左侧的“工程资源管理器”,点击上方命令栏中的“工程资源管理器”按钮即可,如下图:
接下来,在右边代码窗口录入代码(微信用户可复制此代码到电脑上):
Sub 合并当前文件夹下所有工作薄中的工作表()
Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath & "\" & "*.xlsx")
AWbName = ActiveWorkbook.Name
Num = 0
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "\" & MyName)
Num = Num + 1
With Workbooks(1).ActiveSheet
.Cells(.Range("B65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
For G = 1 To Sheets.Count
Wb.Sheets(G).UsedRange.Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)
Next
WbN = WbN & Chr(13) & Wb.Name
Wb.Close False
End With
End If
MyName = Dir
Loop
Range("B1").Select
Application.ScreenUpdating = True
MsgBox "此自动合并命令共合并了 & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub
然后点击“运行子过程”按钮,或按“F5”键执行此命令,如下图:
第四步,等一会儿(时间因工作薄数量和电脑处理速度不同),弹出对话框,代表合并完毕,如下图:
关闭VBE编辑器,回到工作表Sheet1中,可以看到:该文件件下的所以工作薄中的工作表都出现在了工作表Sheet1中,一共有201行数据,如下图:
通过上述几步,就实现了数据合并转移。如果要将此代码保存在EXCEL工作薄中,将此EXCEL工作薄另存为“EXCEL启用宏的工作薄(*.xlsm)”即可,如下图:
最后林老师再啰嗦几句:
在合并多个工作薄时,最好各个工作薄的格式是一致的,方便汇总后的处理;
如果是自己的工作表而非他人传递给我们的工作表,应该从一开始设计表格时就采用单个工作表的格式进行数据记录,除非你想自己累死自己;
VBA代码不是万能的,本例也只是我想不到更好解决办法的一个“笨”办法,如果有更简单的方法,就不要用VBA——毕竟我们自己设计的VBA经历的检验次数不多,难免存在各类BUG,跟微软自带的功能无法相提并论——还是那句话:VBA虽好,可不要贪杯哦!