2015-02-23 370 views
0

我想做一个数组的sumif,但我不知道如何引用数组中的全列。例如我已经在Excel以下数据(在列A和B),并且工作正常代码,Excel中数组的SUMIF VBA

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 

此求和RR的列,其中TT列等于“J”和答案是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") 

我将在一个更大的数据集结束工作,如果可能的话我想不会创建一个单独的吨范围,但只是一个数组。

+1

您不能 - SUMIF(S)不能与数组一起使用,只能使用范围。 – Rory 2015-02-23 13:28:00

+0

@Rory写道,你不能。您需要编写自己的循环数组。 – 2015-02-23 13:47:26

+0

为什么你想要使用数组呢? – Rory 2015-02-23 14:07:42

回答

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 
1
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 
0

感谢您的意见和答案。我不必使用数组,但它是我的第一选择,并保持范围是好的。我确实发现了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 

这也给了我我想要的。