批量彙總工作簿代碼都在這裡了。讓你5分鐘完成3個小時的工作。

好多人開始學習VBA,就是從工作簿、工作表的合併、拆分開始感興趣的。之前零零散散的寫過,還是整理成一個合集,留待備用。

單個excel文件是工作簿,excel文件中的Sheet是工作表。

一、合併工作簿

Sub 合併工作簿()

Application.ScreenUpdating = False

myfile = Dir(ThisWorkbook.Path & "\*.xls*") 'Dir函數,獲取同路徑下待合併excel的文件名

Do While myfile <> "" '當文件名不為空的時候,繼續運行,如果為空,說明表格已經循環一個遍了

If myfile <> ThisWorkbook.Name Then '在文件名不為空的前提下,還不能是代碼所在的彙總工作簿

Set wb = Workbooks.Open(ThisWorkbook.Path & "" & myfile)

For m = 1 To wb.Worksheets.Count '對待彙總的工作簿中所有worksheet做循環

rrow = wb.Worksheets(m).UsedRange.Rows.Count

wb.Worksheets(m).Range("a1:d" & rrow).Copy ThisWorkbook.Worksheets(1).Cells(Rows.Count, "a").End(xlUp).Offset(1, 0)

Next

Workbooks(myfile).Close False '複製完數據以後,分表關閉,不保存。

Else

End If

myfile = Dir '獲取下一個待彙總工作簿的文件名

Loop

Application.ScreenUpdating = True

MsgBox "完成"

End Sub

這裡著重說一下:代碼使用環境是待合併工作簿和代碼工作簿在同一個路徑下。

如果想彈出一個對話框,讓選擇路徑,再進行合併的話

批量彙總工作簿代碼都在這裡了。讓你5分鐘完成3個小時的工作。


只需要在上面的代碼中加如下代碼,並把"ThisWorkbook.Path"改為"PathSht"

Sub 合併工作簿()

Application.ScreenUpdating = False

With Application.FileDialog(msoFileDialogFolderPicker) '創建一個瀏覽文件夾的對話框

If .Show = -1 Then PathSht = .SelectedItems(1) Else Exit Sub

End With

源代碼,省略不寫了,記得把"ThisWorkbook.Path"改為"PathSht"

....

End Sub

二、拆分工作簿

這段代碼可以實現對工作簿任意列的拆分。(對某一列相同內容的所在行挑出來,彙總到一個新建工作簿裡面)

批量彙總工作簿代碼都在這裡了。讓你5分鐘完成3個小時的工作。

Sub 拆分工作簿()


Application.ScreenUpdating = False '關閉屏幕閃動,提速

Application.DisplayAlerts = False '關閉窗口提示

kk = 2

Set dic = CreateObject("scripting.dictionary")

With ThisWorkbook.Worksheets("待拆分的Sheet名")'根據自己的工作簿自行修改

cln = InputBox("請輸入需要按列拆分的列:" & Chr(10) & "英文列標", "輸入列標", "A") 'inputbox提示輸入需要拆分的列標

cln2 = .Range("a1").End(xlToRight).Column '獲取最大列數,為了增加通用性

If .Range(cln & 2) = "" Then Exit Sub

rrow = .Cells(Rows.Count, cln).End(xlUp).Row

arr = WorksheetFunction.Transpose(.Range(cln & 1 & ":" & cln & rrow))

For i = 1 To UBound(arr) '將拆分條件列數據寫入字典,為了去重複。

If Not dic.exists(arr(i)) Then '若字典中不存在該字符串,則寫入。

dic.Add arr(i), .Range("a" & i).Resize(1, cln2)

Else

Set dic.Item(arr(i)) = Union(dic.Item(arr(i)), .Range("a" & i).Resize(1, cln2))

End If

Next

k = dic.keys

l = dic.items

For ss = 0 To dic.Count - 1

Set wb = Workbooks.Add '新建工作簿

With wb.Worksheets(1)

l(ss).Copy .Range("a1")

End With

wb.SaveAs ThisWorkbook.Path & "" & k(ss) & ".xlsx" '將新建的工作簿保存在代碼工作簿下

wb.Close True '關閉工作簿,並保存

Set wb = Nothing '釋放內存

Next

End With

Application.ScreenUpdating = True

Application.DisplayAlerts = True

MsgBox "完成"

End Sub

上述代碼默認從第一行拆分,如果有標題行不想拆分,可以把上述下句代碼修改一下。

arr =
WorksheetFunction.Transpose(.Range(cln & 1

& ":" & cln & rrow)),從哪一行開始拆分,就把1修改為行號

三、合併工作表(Sheet)

合併同一個工作簿下所有Sheet到一個Sheet裡面就比較簡單了。

Sub 拆分表格()

Set d = CreateObject("scripting.dictionary")

With Worksheets(1)

rrow = .Cells(Rows.Count, "a").End(3).Row

For i = 2 To rrow '從第2行開始拆分

strr = .Range("c" & i).Value '拆分C列內容

If Not d.exists(strr) Then

d.Add strr, .Range("a" & i).Resize(1, 4)

Else

Set d.Item(strr) = Union(d.Item(strr), .Range("a" & i).Resize(1, 4))

End If

Next

k = d.keys

i = d.items

For a = 0 To d.Count - 1

Worksheets.Add.Name = k(a)

i(a).Copy Worksheets(k(a)).Range("a2")

Next

End With

End Sub

默認複製所有內容,如果有特定需要,自己修改綠色代碼部分。

四、拆分工作表(Sheet)

如下圖所示的拆分,也是很常見的問題。

批量彙總工作簿代碼都在這裡了。讓你5分鐘完成3個小時的工作。


Sub 拆分表格()

Set d = CreateObject("scripting.dictionary")

With Worksheets(1)

rrow = .Cells(Rows.Count, "a").End(3).Row

For i = 2 To rrow '從第2行開始拆分

strr = .Range("c" & i).Value '拆分C列內容

If Not d.exists(strr) Then

d.Add strr, .Range("a" & i).Resize(1, 4)

Else

Set d.Item(strr) = Union(d.Item(strr), .Range("a" & i).Resize(1, 4))

End If

Next

k = d.keys

i = d.items

For a = 0 To d.Count - 1

Worksheets.Add.Name = k(a)

i(a).Copy Worksheets(k(a)).Range("a2")

Next

End With

End Sub

上述代碼用到了字典

For i = 2 To rrow '從第2行開始拆分

strr = .Range("c" & i).Value '拆分C列內容

根據自己實際需求修改代碼即可。


分享到:


相關文章: