子工作完美,但从函数调用不起作用

时间:2014-01-31 22:08:11

标签: excel vba excel-vba

假设我在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工作得很好,那么为什么它不能通过函数?

1 个答案:

答案 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"}))