我希望以一种可以即时更改类别的方式对我的交易进行分类。我认为通过展示我所拥有的更容易解释。
我有以下表格
交易
- 一个约会
- C: 姓名
- D:金额
快餐清单:
- L:名称(部分名称,因为要进行字符串搜索)
我希望根据日期和类别等多个标准来汇总交易金额。这是一个有效的公式:
=SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3&"*")
有一个基本问题:它只支持快餐列表中的一项。有什么方法可以简单地对整个快餐名称进行文本字符串搜索?" "&L3&" " 到 " "&L:L&" " 还是什么?
这是我尝试过的一些事情。
1)使用布尔 UDF修改 SUMIFS 标准“ “&L3&” ”。我在这里遇到的问题是我无法弄清楚如何将 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?