假设我在Excel中有一个表格如下:
MOD ACTIVITY PRICE
MOD1 0001 1.00
MOD1 0002 2.00
MOD1 0003 3.00
MOD2 0001 4.00
MOD2 0002 5.00
MOD2 0003 6.00
我想知道MOD是'MOD2'且ACTIVITY是'0001'还是'0003'的价格总和是多少? 简单地等效于以下非常简单的SQL查询: 选择总和(价格)作为TableName的TotalPrice,其中modname ='mod2'和活动('0001','0003')
在阅读不同来源时,我找到了两个函数AutoFilter和Intersect并编写了以下Sub:
Dim rangeSum As Currency
Sub FindValue()
rangeSum = 0
Range("A1").AutoFilter Field:=1, Criteria1:="32-00505K"
Range("A1").AutoFilter Field:=2, Criteria1:=Array("0003", "0004"), Operator:=xlFilterValues
Dim rangeFound As Excel.Range
Set rangeFound = Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Cells
Dim rangeUsedForSum As Excel.Range
Set rangeUsedForSum = Intersect(rangeFound, Range("E:E"))
Set rangeFound = Nothing
If Not rangeUsedForSum Is Nothing Then rangeSum = WorksheetFunction.Sum(rangeUsedForSum)
'MsgBox ("Range: " & rangeUsedForSum.Address & vbCrLf & "Sum: " & rangeSum)
Range("A1").AutoFilter
End Sub
如果我自己运行Sub,它可以完美运行。 但是如果我在一个函数中调用它:
Function GetValue(arg1 As String, arg2 As String) As Currency
Call FindValue
GetValue = rangeSum
End Function
从Excel工作表中调用此函数,它返回0(调试显示没有交集),我的Excel仅按第二个标准过滤,并且过滤器未关闭。
我不确定AutoFilter和Intersection是否是最佳选择,因为我认为必须有一种更简单的方法来完成这个微不足道的事情,但无论如何,如果Sub工作得很好,那么为什么它不能通过函数?
答案 0 :(得分:1)
意见的问题是a simpler way to do this trivial thing
,但公式是否可行,或许可以这样做:
=SUMIFS(C:C,A:A,"MOD2",B:B,"0001")+SUMIFS(C:C,A:A,"MOD2",B:B,"0003")
或更短的版本:
=SUM(SUMIFS(C:C,A:A,"MOD2",B:B,{"0001","0003"}))