Vba 如何按类别对行值求和

Vba 如何按类别对行值求和,vba,excel,Vba,Excel,例如,我在Excel中得到了下表(它实际上有100多行): 我要做的是使用VBA宏按名称(类别)对值求和,这样我就可以在工作表中的某个位置显示它,如下所示: AlfaTotal 20 BetaTotal 10 GamaTotal 15 我已经尝试使用了每个函数,但无法获得值。任何帮助都将不胜感激。使用字典是一种常见的方法。如果只有一个项目存在,下面的选项将处理范围内的空白。它不需要一个.Exists测试,只需通过直接访问添加到任何现有值即可。此外,还可以一次性写入密钥数

例如,我在Excel中得到了下表(它实际上有100多行):

我要做的是使用VBA宏按名称(类别)对值求和,这样我就可以在工作表中的某个位置显示它,如下所示:

AlfaTotal     20
BetaTotal     10
GamaTotal     15

我已经尝试使用了每个函数,但无法获得值。任何帮助都将不胜感激。

使用字典是一种常见的方法。如果只有一个项目存在,下面的选项将处理范围内的空白。它不需要一个
.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
选项显式
公共子GetTotals()
Dim dict As Object,arr(),i为Long,lastRow为Long
Set dict=CreateObject(“Scripting.Dictionary”)

使用ThisWorkbook.Worksheets(“Sheet1”)”如果您在尝试对其进行汇总之前不知道将有多少个类别,类似这样的解决方案可能是:

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
公式可能会更简单。

VBA必须吗?在纯Excel中有几个选项可以为您执行此操作,如CountIf和Pivot表。不幸的是,这是必须的,因为它必须是一个按钮,并且在单击时,将计算总和。使用Excel公式自动计算结果并仅使用按钮显示/隐藏结果不是一个选项?您仍然可以使用数据透视表。并让您的按钮执行
刷新
选项。我知道所有其他选项,但它必须是VBA,因为它用于创建具有许多其他功能的仪表板。为什么要对有用的答案和更高效的代码示例进行否决#SaltyGood点处理零项和一项情况(也+1)。-顺便说一句,(高效代码的)无法解释的向下投票对你没有帮助anybody@T.M.谢谢。这是一个很好而且更有效的解决方案,我添加了+1:)现在可以回答了吗?脚本字典应该用倒逗号,如下所示:-Set d=CreateObject(“Scripting.Dictionary”)哦,是的,我只是很快地拼凑了一些东西,在切换到后期绑定后并没有真正测试它。谢谢你的更正@安东尼
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