提供另一種寫法,請參考
補充:這個寫法不適合大量資料,沒注意到要大量資料
有極大量資料時,速度比nsps5606寫的慢了40倍…5秒 vs 200秒
請改用test2()
Sub test()
Dim Ma As Range, dic As Object, i As Double
Set dic = CreateObject("scripting.dictionary")
With Sheets("工作表1")
For Each Ma In .Range("b2:b" & .Range("a1").CurrentRegion.Rows.Count)
dic(Replace(Ma.MergeArea.Address, "B", "A")) = ""
Next
For i = 0 To dic.Count - 1
.Cells(.Range(dic.keys()(i)).Row, 2) = Application.WorksheetFunction.Sum(.Range(dic.keys()(i)))
Next i
End With
Set dic = Nothing
End Sub
修正:大量資料適用程式碼
6萬筆隨機資料,其中20000個隨機合併儲存格,計算時間大約5秒
'測試nsps5606的程式碼,'有加上Application.ScreenUpdating = False
'Integer改成double、加上計時,其它不變,不然只能測試到32767筆

Sub test2()
Dim Ma As Range, ttt As Double
Application.ScreenUpdating = False
With Sheets("工作表1")
.Columns("B:B").ClearContents
ttt = Timer
For Each Ma In .Range("b2:b" & .Range("a1").CurrentRegion.Rows.Count)
If .Cells(Ma.MergeArea.Cells(1).Row, 2) = "" Then
.Cells(Ma.MergeArea.Cells(1).Row, 2) = Application.WorksheetFunction.sum(.Range(Replace(Ma.MergeArea.Address, "B", "A")))
End If
Next
End With
Application.ScreenUpdating = True
Debug.Print Timer - ttt
End Sub
分析後,發現第一個失敗的範例,是字典在取key時,浪費太多時間
但如果加總計算後資料也放入字典,且配合 application.transpose,就可解決這個問題
可是因為有合併儲存格+大量資料,transpose(有資料上限),就不能用了
這時,一格一格來算,反而是最快的,nsps5606很厲害,一次就解決問題