
mammals-3218028_640.jpg
在日常生活中,經(jīng)常會(huì)遇到一個(gè)文件夾中有很多個(gè)工作簿,這個(gè)時(shí)候需要把這些工作簿中的sheet全部匯總到一個(gè)工作簿中,應(yīng)該如何做呢?如果一個(gè)一個(gè)打開然后將sheet復(fù)制粘貼,未免太沒有效率了,這個(gè)時(shí)候我們通過VBA來解決這個(gè)問題,只需要執(zhí)行代碼,所有sheet會(huì)自動(dòng)匯總到一個(gè)工作簿中。

image.png
如圖,我們需要將圖中所有的工作簿中的sheet全部匯總到11.xlsm這個(gè)工作簿中,這個(gè)時(shí)候我們應(yīng)該要在11.xlsm中執(zhí)行代碼。老規(guī)矩,首先我們來分析一下代碼,如下:
Sub 將多個(gè)文件的sheet匯總()
Dim i
Application.ScreenUpdating = False
Application.DisplayAlerts = False
flnm = Dir(ThisWorkbook.Path & "\*.xlsm")
Do While flnm <> ""
Debug.Print ThisWorkbook.Path & "\" & flnm
fn = ThisWorkbook.Path & "\" & flnm
If flnm <> "11.xlsm" Then
Debug.Print TypeName(flnm); 查看一下數(shù)據(jù)類型
Set wb = Workbooks.Open(fn)
For Each x In wb.Sheets
x.Name = Split(flnm, ".")(0)
x.UsedRange.Copy
ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = Split(flnm, ".")(0)
ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Paste
Next
End If
flnm = Dir
Loop
End Sub
上述代碼中,前兩行
Application.ScreenUpdating = False
Application.DisplayAlerts = False
是為了加快運(yùn)行速度,暫停表格刷新和禁止彈出框。
flnm = Dir(ThisWorkbook.Path & "\*.xlsm")
Do While flnm <> ""
Debug.Print ThisWorkbook.Path & "\" & flnm
fn = ThisWorkbook.Path & "\" & flnm
If flnm <> "11.xlsm" Then
...
End If
flnm = Dir
Loop
上面這幾句代碼是對(duì)這個(gè)工作簿路徑下的xlsm文件進(jìn)行遍歷,然后當(dāng)flnm <> 11.xlsm時(shí)執(zhí)行下面的代碼
Debug.Print TypeName(flnm); 查看一下數(shù)據(jù)類型
Set wb = Workbooks.Open(fn)
For Each x In wb.Sheets
x.Name = Split(flnm, ".")(0)
x.UsedRange.Copy
ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = Split(flnm, ".")(0)
ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Paste
Next
即是對(duì)工作簿中的sheet進(jìn)行遍歷、改名、并將內(nèi)容復(fù)制給11.xlsm新創(chuàng)建的sheet。。
這樣對(duì)整個(gè)文件夾下的xlsm文件遍歷一遍過后,就能把所有的sheet都匯總到11.xlsm中:

3月-21-2018 22-07-22.gif
是不是很強(qiáng)大~
希望對(duì)大家有所幫助哦,記得點(diǎn)個(gè)贊哦^^