![](/img/trans.png)
[英]How to sum values in excel only if they match a category id in a lookup
[英]How to sum row values by category
因此,我在Excel中獲得了下表(例如,實際上有100多個行):
Alfa 10
Beta 5
Alfa 10
Beta 5
Gama 15
我想使用VBA宏按名稱(類別)對SUM值進行顯示,因此我可以將其顯示在工作表的某處,如下所示:
AlfaTotal 20
BetaTotal 10
GamaTotal 15
我嘗試使用For Each函數,但無法獲取這些值。 任何幫助將非常感激。
使用字典是一種常見的方法。 如果僅存在一項,則以下內容將處理范圍內的空白。 它不需要.Exists
測試,因為只需通過直接訪問即可添加任何現有值。 此外,一次性寫入鍵數組和項。
Option Explicit
Public Sub GetTotals()
Dim dict As Object, arr(), i As Long, lastRow As Long
Set dict = CreateObject("Scripting.Dictionary")
With ThisWorkbook.Worksheets("Sheet1") '<==source data
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
Select Case lastRow
Case 1
ReDim arr(1, 1): arr(1, 1) = .Range("A1:B1").Value
Case Else
arr = .Range("A1:B" & lastRow).Value
End Select
End With
For i = LBound(arr, 1) To UBound(arr, 1)
If Not IsEmpty(arr(i, 1)) Then
dict(arr(i, 1)) = dict(arr(i, 1)) + arr(i, 2)
End If
Next
With ThisWorkbook.Worksheets("Sheet2")
.Range("A1").Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.keys)
.Range("B1").Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.Items)
End With
End Sub
結果:
如果在嘗試對類別進行匯總之前不知道要擁有多少個類別,則可以使用以下解決方案:
Option Explicit
Sub test()
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
Dim s As String, key_value As String
Dim v As Variant
Dim num As Long
Dim r As Range, c As Range
Set r = Sheet1.Range(Sheet1.Range("A2"), Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp))
For Each c In r
key_value = CStr(c)
num = CLng(c.Offset(0, 1))
If d.Exists(key_value) Then
d(key_value) = d(key_value) + num
Else
d.Add Key:=key_value, Item:=num
End If
Next c
For Each v In d
s = s & CStr(v) & vbTab & CStr(d(v)) & vbLf
Next v
MsgBox prompt:=s, Title:="Summation", Buttons:=vbInformation
End Sub
如果您事先知道要使用哪些類別,則僅基於這些類別創建一些sumif
公式可能會更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.