【问题标题】:How to do SUMIFS text match with multiple criteria from another column?如何使 SUMIFS 文本与另一列中的多个条件匹配?
【发布时间】:2013-05-12 09:28:39
【问题描述】:

我希望以一种可以即时更改类别的方式对我的交易进行分类。我认为通过展示我拥有的东西更容易解释。

我有以下表格

交易

  • 答:日期
  • 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,除非我以某种方式告诉它?

【问题讨论】:

    标签: excel sumifs vba


    【解决方案1】:

    试试这个公式

    =SUMPRODUCT(SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3:L30&"*"))

    通过使用范围 (L3:L30) 作为最终标准,SUMIFS 公式将生成一个“数组”(包含 28 个值 - L3:L30 中的每个值一个)...并且 SUMPRODUCT 用于对该数组求和并得到你想要的结果

    【讨论】:

    • 您先生是我的英雄。非常感谢你。我希望我能给你投票 10 次,但它说我没有足够的声誉。
    • 嘿抱歉,该功能还有一件事。我在 L3:L30 中注意到的是,如果单元格为空,它似乎会获取该月期间每个单元格的总和。我认为这是因为空单元格触发了对空格的文本搜索。我尝试使用 IF 和 ISTEXT,但不确定如何将其应用于范围。
    • 没问题.....我明白你对空白的意思,你可以在 SUMPRODUCT 函数中添加一个额外的检查来忽略 L3:L30 中的空白,即=SUMPRODUCT(SUMIFS(D:D,A:A,"*03/2013*",C:C,"*"&L3:L30&"*")*(L3:L30<>""))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2019-11-19
    • 2013-12-12
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多