Excel VBA中数组的Sumifs

Posted

技术标签:

【中文标题】Excel VBA中数组的Sumifs【英文标题】:Sumifs from an Array in Excel VBA 【发布时间】:2015-04-24 20:07:11 【问题描述】:

我想从数组中进行 sumif,但我不确定如何引用数组中的完整列。例如,我在 excel 中有以下数据(在 A 和 B 列中)并且代码可以正常工作,

RR TT 1 J 2 K 3 J 4 K 5 J 5 K 6 J 7 K 8 J 9 K

 Sub test() 
 Dim s As Range 
 Dim s2 As Range
 Set s = Range("A2:A11") 
 Set s2 = Range("B2:B11")
 e = WorksheetFunction.SumIfs(s, s2, "J")
 MsgBox e 
 End Sub

这对 TT 列等于“J”的 RR 列求和,答案是 23。但在代码中,我将每一列分配给 VBA 中的单独范围。我想将两列都分配给一个数组并从数组中进行 sumifs。代码的第一部分如下所示,

Dim s() As Variant
ReDim s(1 To 10, 1 To 2)
s = Range("A2:B11")

然后我如何在 sumifs 函数中引用数组的列? (sumifs 函数中的前两个条目)

e = WorksheetFunction.SumIfs(?, ?, "J")

我最终将使用更大的数据集,如果可能的话,我不想创建大量单独的范围,而只创建一个数组。

【问题讨论】:

你不能 - SUMIF(S) 不适用于数组,只能用于范围。 正如@Rory 所写,你不能。你需要自己编写,循环遍历数组。 为什么还要使用数组? 【参考方案1】:

您可以创建一个自定义函数来执行此操作:

Public Function SumIf(lookupTable() As Variant, lookupValue As String) As Long
    Dim I As Long

    SumIf = 0

    For I = LBound(lookupTable) To UBound(lookupTable)
        If lookupTable(I, 1) = lookupValue Then
            SumIf = SumIf + lookupTable(I, 2)
        End If
    Next I
End Function

【讨论】:

【参考方案2】:
Sub M_snb()
  msgbox [sum((A1:A9)*(B1:B9="J"))]
End Sub

Sub M_snb()
  msgbox [sumproduct((A1:A9)*(B1:B9="J"))]
end sub

Sub M_snb()
  msgbox [sum(if(B1:B9="J",A1:A9,0))]
end sub

【讨论】:

【参考方案3】:

感谢 cmets 和答案。我不必使用数组,但这是我的第一选择,并且保持范围很好。我确实发现 Ranges 做得对。我做了以下

 Sub test() 
 Dim s As Range 
 Set s = Range("A2:B11") 
 e = WorksheetFunction.SumIfs(s.Columns(1), s.Columns(2), "J")
 MsgBox e 
 End Sub

这也给了我想要的。

【讨论】:

以上是关于Excel VBA中数组的Sumifs的主要内容,如果未能解决你的问题,请参考以下文章

返回数组Excel VBA中元素的索引

Excel函数从没有VBA的值构造数组

Excel VBA中数组的Sumifs

使用公式将数组从 VBA 函数输出到 Excel 工作表

excel vba函数返回数组并粘贴到工作表公式中

Excel VBA函数:如何传递范围、转换为数组、反转和返回数组