【问题标题】:SumIF Using Table/Named Range Instead of Single Cell CriteriaSumIF 使用表/命名范围而不是单个单元格条件
【发布时间】:2019-07-23 06:50:35
【问题描述】:

我的工作簿中有 2 张工作表(Sheet1、Sheet2)。

工作表 2 包含一个包含 5 列的表(命名为 Table1):

  • 外卖
  • 家庭
  • 服装
  • 燃料
  • 杂货

在第一张纸上,我有 2 列:

  • 费用名称
  • 总费用

现在,我想做的是:

  1. 设置费用名称的范围(范围 1)
  2. 设置费用总计的范围(范围 2)
  3. 将范围 1 与表中的相应列进行比较,仅将匹配项的值相加

例如,在范围 1 (B6:B16) 中:

  • BP
  • 加德士
  • 麦当劳
  • 肯德基

在范围 2 (C6:C16) 内:

  • 300
  • 400
  • 200
  • 150

现在,我要做的就是将外卖(麦当劳、肯德基)的值相加,并排除任何不符合条件的东西。

所以我的总和将是所有出现的外卖 - 只要它们在我的表中列出 - 在这种情况下为 350。

但我似乎无法让公式起作用。

我使用了这些来源:

https://exceljet.net/excel-functions/excel-sumifs-function

Selecting a Specific Column of a Named Range for the SUMIF Function

最后得到了这个公式:

=SUMIF($B$6:$B$16;Table1[Takeaways];C6:C16)

此来源:

https://excelchamps.com/blog/sumif-sumifs-or-logic/

最后得到了这个公式:

=SUM(SUMIFS(C6:C16;B6:B16;Table1[Takeaways]))

两个公式都返回 0。

但是,对于它们两者,如果我将 Table1[Takeaways] 更改为“McDonalds”,那么它会正确识别范围 1 中每个出现的单词“McDonalds”。

编辑:

我已经更新了上面的公式以匹配下面的图片。

这是包含引用的表:

此表包含数据:

公式:

单元格 C4(在 Takeaways 旁边):=SUMIF($B$6:B$16;Table1[Takeaways];C6:C16)

C5 单元(燃料旁边):=SUM(SUMIFS(C6:C16;B6:B16;Table1[Fuel]))

公式中似乎只检测到 BP。

当我使用带有单个单元格引用而不是表格或使用范围的公式时,这是一个输出表格:

公式:

单元格 F4(BP 旁边):=SUMIF($B$6:B$16;"BP";C6:C16)

F5 单元格(加德士旁边):=SUM(SUMIFS(C6:C16;B6:B16;"Caltex"))

F6 单元格(麦当劳旁边):=SUMIF($B$6:B$16;"McDonalds";C6:C16)

F7 单元格(肯德基旁边):=SUM(SUMIFS(C6:C16;B6:B16;"KFC"))

【问题讨论】:

    标签: excel vba excel-formula formula sumifs


    【解决方案1】:

    如果我正确理解您想要实现的目标,我认为您的设置在概念上是不正确的。

    您似乎正在尝试跟踪费用,并且每项费用(或收款人)都被分配到一个类别(“外卖”、“家庭”等)。从relational-model 的角度来看,您的第二个表(定义每个费用/收款人的类别)应该只有两列(或变量):Expense NameExpense Category em>。

    您设置的表格(“表 2”)使用类别(即可能的值)作为不同的列(即变量)。但只有变量,即“费用类别”,类别本身就是可能的值。

    如果您这样设置,问题就会改变:您可以使用第二个表中的VLOOKUP() 将一个从属列添加到您的第一个表中,该列显示每个收款人的类别(或“费用名称”)。

    然后,您可以汇总与该类别匹配的所有收款人的费用。

    注意:我使用 LibreOffice Calc 创建了插图,因此可能会有一些细微差别,但逻辑是相同的。

    【讨论】:

    • 不错,看穿了这里的XY问题。
    • 感谢您的回答 :) 我知道它是如何工作的并且非常好,唯一的问题是我需要在工作表中添加一个额外的列。如果我理解正确,我会在包含“燃料”或“外卖”的列上执行 SUMIF。
    • @EitelDagnin:正确,您需要另一列,但该列会自动更新(因此您在输入新交易时不需要管理它),如果您不这样做,您甚至可以完全隐藏它不想看到它。我建议将汇总表(使用 SUMIF)添加为单独的表格/表格(我已经用屏幕截图更新了答案),但它可以是任何适合您需要的类别(“燃料”等)出现的地方(甚至在每笔交易旁边的第一张纸上;请注意,在很长的交易列表上,更新可能会开始变慢)。
    【解决方案2】:

    没有看到 L 和 K 中的数据,我无法给你一个完整的答案 - 但可能与你拉数组的方式有关

    尝试类似的方法

    =SUMPRODUCT(SUMIFS($L$11:$L$43,$K$11:$K$43,CHOOSE({1,2},Takeaways,"anything else you wanted to sum")))

    记住 SUMIFS 是针对多个条件的,所以如果你只计算一个,你需要=SUMPRODUCT(SUMIF(

    上述工作方式仅适用于垂直向量,但更改您的命名范围,以便 2 列的表改为 2 个命名范围应该没问题 - 除非它是您要求的一部分

    表 2 将变为 expense_Nameexpense_Total

    【讨论】:

    • 感谢您的回答 :) 我在所有场景中都对其进行了测试,效果非常好。我似乎唯一不明白的是{1,2} 做了什么。你能解释一下吗?
    • {1,2} 为您提供数组中的两个变量。因此,如果您想计算 TakeawaysKFC 这是 2 个变量,如果您想要更多,那就是 {1,2,3}
    • 太棒了。非常感谢:)
    【解决方案3】:

    我正准备将其作为我自己的问题here 的副本关闭,但我认为使用命名范围有一点不同。然而,这背后的逻辑或多或少遵循相同的方法。

    进一步研究我的部分解决方案,我得出以下公式:

    =SUMPRODUCT(COUNTIF(Table1[Takeaways];Range1)*Range2)
    

    COUNTIF() 部分计算表格中单元格值的出现次数。因此,请确保您的表中没有重复项。如果值存在于表中,COUNTIF() 的结果将为 0。这样我们创建了一个 1 和 0 的矩阵。通过乘法和SUMPRODUCT()的使用,我们强制excel执行矩阵计算并返回正确的结果。


    部分解决方案

    我使用了以下公式:

    =SUMPRODUCT(ISNUMBER(MATCH(Range1;Table1[Takeaways]))*Range2)

    公式执行以下操作:

    • MATCH()检查 Range1 中的值是否存在于您的表中,并返回匹配值在您的表中的位置。
    • ISNUMBER() 通过检查 MATCH() 函数是否返回数字来检查是否找到匹配项
    • 将其与Range2 相乘,使用SUMPRODUCT() 函数进行矩阵计算

    编辑:

    这适用于非常有限的样本。一旦我将第四行添加到我的数据中,公式就停止按预期工作。看截图:

    正确地将前两个值纳入总和,第四个不考虑。

    【讨论】:

    • 感谢您的回答 :) 我在工作表中使用了您的公式,它适用于一个示例,但不适用于另一个示例。按照您的建议,我将在我的问题中以 ascii 格式发布示例数据表。
    • 嗯,你是对的。对我来说,它适用于非常有限的集合,进一步扩展并没有得到正确的总数。
    • 是的,我也是这样。在我上面粘贴的图像中,我使用了该数据并使用您的解决方案,我得到了 500 的外卖(这是正确的)和 2300 的燃料(这是不正确的)。可惜我不能让它工作,因为它是一个非常优雅的解决方案。
    • =SUMPRODUCT(SUMIF($B$6:$B$16;Tabel1[Takeaways];$C$6:$C$16)) 会起作用,并将继续扩展数据。
    • @EitelDagnin,请查看我改进后的公式。
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多