上周我去都江堰某企業(yè)上課,其中一位學(xué)員問(wèn)我一個(gè)問(wèn)題:“林老師,如何快速合并同一文件夾下的多個(gè)工作表?”
我原本以為只是一種做表思路,因?yàn)橄嗤瑢傩缘臄?shù)據(jù)區(qū)域應(yīng)該放在同一工作表中。所以我問(wèn):“為什么要將數(shù)據(jù)放在多個(gè)工作表中而不是一張工作表上呢?”
這位學(xué)員繼續(xù)解釋:“這是他們需要下發(fā)至各個(gè)部門,由他們分別填寫的工作表,在收集回來(lái)的時(shí)候需要將這些工作表匯總成一個(gè)工作?。慷看挝叶家獙资畯埍磉M(jìn)行手工匯總,很麻煩的!”
的確很麻煩!合并多張工作薄或者工作表是我們?nèi)粘9ぷ髦斜容^頻繁的操作,而大多數(shù)人都是采用手工處理的方式——因?yàn)檫@個(gè)看似簡(jiǎn)單的操作由于涉及到要打開工作薄文件才能實(shí)現(xiàn)引用,所以用EXCEL自帶的“合并計(jì)算”或是“數(shù)據(jù)透視表”都無(wú)法進(jìn)行最簡(jiǎn)單的合并多個(gè)工作薄操作。
而我也沒有找到更為簡(jiǎn)便的方式解決這個(gè)問(wèn)題,我目前只能用編寫VBA代碼的方式合并同一文件夾下的不同工作薄,如果大家有更為便捷的好方法,請(qǐng)告訴我,讓我學(xué)習(xí),共同進(jìn)步!
我想到的方法如下:
第一步:將多個(gè)需要合并的工作薄放在同一個(gè)文件夾下,并新建一個(gè)文件。如下圖,我新建了一個(gè)名為“林屹老師-合并工作薄.xlsx”的工作薄。
第二步,打開這個(gè)工作薄,并按快捷鍵Alt+F11進(jìn)入VBE編輯器頁(yè)面,如下圖。
第三步,我們要在這張工作表“Sheet1”上匯總所有數(shù)據(jù),所以現(xiàn)在給它新建一個(gè)自定義命令。
雙擊左側(cè)的“Sheet1”,彈出代碼錄入窗口。順便說(shuō)一下,如果沒有左側(cè)的“工程資源管理器”,點(diǎn)擊上方命令欄中的“工程資源管理器”按鈕即可,如下圖:
接下來(lái),在右邊代碼窗口錄入代碼(微信用戶可復(fù)制此代碼到電腦上):
Sub 合并當(dāng)前文件夾下所有工作薄中的工作表()
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 "此自動(dòng)合并命令共合并了 & Num & "個(gè)工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub
然后點(diǎn)擊“運(yùn)行子過(guò)程”按鈕,或按“F5”鍵執(zhí)行此命令,如下圖:
第四步,等一會(huì)兒(時(shí)間因工作薄數(shù)量和電腦處理速度不同),彈出對(duì)話框,代表合并完畢,如下圖:
關(guān)閉VBE編輯器,回到工作表Sheet1中,可以看到:該文件件下的所以工作薄中的工作表都出現(xiàn)在了工作表Sheet1中,一共有201行數(shù)據(jù),如下圖:
通過(guò)上述幾步,就實(shí)現(xiàn)了數(shù)據(jù)合并轉(zhuǎn)移。如果要將此代碼保存在EXCEL工作薄中,將此EXCEL工作薄另存為“EXCEL啟用宏的工作?。?.xlsm)”即可,如下圖:
最后林老師再啰嗦幾句:
在合并多個(gè)工作薄時(shí),最好各個(gè)工作薄的格式是一致的,方便匯總后的處理;
如果是自己的工作表而非他人傳遞給我們的工作表,應(yīng)該從一開始設(shè)計(jì)表格時(shí)就采用單個(gè)工作表的格式進(jìn)行數(shù)據(jù)記錄,除非你想自己累死自己;
VBA代碼不是萬(wàn)能的,本例也只是我想不到更好解決辦法的一個(gè)“笨”辦法,如果有更簡(jiǎn)單的方法,就不要用VBA——畢竟我們自己設(shè)計(jì)的VBA經(jīng)歷的檢驗(yàn)次數(shù)不多,難免存在各類BUG,跟微軟自帶的功能無(wú)法相提并論——還是那句話:VBA雖好,可不要貪杯哦!