我希望以可以动态更改类别的方式对交易进行分类。我认为通过展示我的内容更容易解释。
我有以下表格
交易
快餐清单:
我希望根据多个条件(例如日期和类别)对交易金额求和。这是一个有效的公式:
=SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3&"*")
有一个基本问题:它只支持快餐清单中的一个项目。有什么方法可以简单地在整个快餐名称上进行文本串搜索吗? “”& L3&“”到“”& L:L&“”或其他什么?
1)使用布尔UDF修改SUMIFS条件“”& L3&“”。我遇到的问题是我无法弄清楚如何将当前Row通过SUMIF循环到函数中。
Public Function checkRange(Check As String, R As Range) As Boolean
For Each MyCell In R
If InStr(Check, MyCell.Value) > 0 Then
checkRange = True
End If
Next MyCell
End Function
如果我可以将Check发送到此功能,那么我将被设置。
2)将SUMIFS的sum_range替换为返回行范围的UDF
Public Function pruneRange(Prune_range As Range, Criteria_range As Range) As Range
Dim Out_R As Range
Dim Str As String
ActiveWorkbook.Sheets("Vancity Trans").Activate
' Loop through the prune_range to make sure it belongs
For Each Cell In Prune_range
' loop through criteria to see if it matches current Cell
For Each MyCell In Criteria_range
If InStr(Cell.Value, MyCell.Value) > 0 Then
' Now append cell to Out_r and exit this foreach
' Str = Str & Cell.Address() & ","
Str = Str & "D" & Cell.Row() & ","
Exit For
End If
Next MyCell
Next Cell
' remove last comma form str
Str = Left(Str, Len(Str) - 1)
' use str to set the range
Set Out_R = Range(Str)
' MsgBox (Str)
Set pruneRange = Out_R
End Function
这适用于常规SUM循环,但出于某种原因,当我尝试在SUMIF或SUMIFS中使用它时,它会返回#Value。另一个问题是,即使在SUM循环中,如果使用C:C而不是C1:CX,其中X是多行,它会崩溃excel或永远循环。我猜这是因为excel不知道何时停在UDF中,除非我以某种方式告诉它?
答案 0 :(得分:2)
试试这个公式
=SUMPRODUCT(SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3:L30&"*"))
通过使用范围(L3:L30)作为最终标准,SUMIFS公式将生成“数组”(28个值 - L3中的每个值一个:L30)...并且SUMPRODUCT用于对该数组求和并得到你想要的结果