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的主要内容,如果未能解决你的问题,请参考以下文章