請問VBA 如何將 "合併儲存格旁的資料作加總"

請問VBA 如何將 "合併儲存格旁的資料作加總"

B欄有幾個格子
如何用VBA幫我把左邊的數值加總後放入相對應的儲存格裡

完成的結果應該會變成這樣
請問VBA 如何將 "合併儲存格旁的資料作加總"

而且A欄如果有無限多個資料,要加入迴圈,讓他自動完成
本圖假設有6筆資料
而B欄的儲存格也不一定是合併2>3>1個的順序
是我先行整理好的格子

我有試過

RO = ActiveCell.MergeArea.Rows.Count
i = 1
ActiveCell = Cells(1 + (RO - i), "A")
ActiveCell = ActiveCell + Cells(1 + (RO - i + (RO - i)), "A")

變數規律不會設計
沒辦法完成全部
請各位大大幫忙
tobigb wrote:
B欄有幾個格子
如何用VBA

隨便寫了一個,就是一格一格往下看,是合併儲存格就先加總左邊那幾格再填入,參考看看

https://pastebin.com/6aX6qwxW

Sub Test1()
Dim xSheet As Worksheet
Dim xRange As Range
Dim rowCount As Integer, idx As Integer, idx2 As Integer
Dim sum As Long

Set xSheet = ActiveSheet
Set xRange = xSheet.Range("A1:A2").CurrentRegion
rowCount = xRange.Rows.Count

For idx = 2 To rowCount Step 0
Set xRange = ActiveSheet.Range("B" & idx)

sum = 0
For idx2 = idx To idx + xRange.MergeArea.Rows.Count - 1
If IsNumeric(xSheet.Range("A" & idx2).Value) Then
sum = sum + xSheet.Range("A" & idx2).Value
End If
Next
xRange.Value = sum
idx = idx + xRange.MergeArea.Rows.Count
Next
End Sub
tobigb
現在還有個問題,就是 他加總的數值都是整數,我原始處理資料有小數(4位),如何設計?才能不要進位
tobigb
我解決了!只要宣告改一下就好了!Dim sum As String
提供另一種寫法,請參考
補充:這個寫法不適合大量資料,沒注意到要大量資料
有極大量資料時,速度比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很厲害,一次就解決問題
nsps5606
我都用基本款的解法和基本款的Function,太複雜的我就惦惦不出聲了[XD]
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!