【问题标题】:Sumifs returns 0 if an affected cell is updated如果受影响的单元格被更新,Sumifs 返回 0
【发布时间】:2017-07-18 20:10:31
【问题描述】:

我有一个用于预算的电子表格,其中涉及根据与另一个电子表格相关的日期更新总值。

我有一个一直在工作的公式,但我发现了一个问题,即如果上面的单元格更新,则不会添加值。

保存总数的单元格的公式(在 Bar!B4 中):

=SUMIFS(Foo!A:A,IF(ISBLANK(Foo!D:D),Foo!C:C,Foo!D:D),">="&Bar!A4, IF(ISBLANK(Foo!D:D),Foo!C:C, Foo!D:D),"<"&Bar!A5)

与:

  • Foo!A:A
    • 货币价值
  • Foo!C:C
    • 物品需要付款的日期
  • Foo!D:D
    • 付款日期(如果适用)
  • 酒吧!A4 和 A5
    • 日期范围

以此作为表 Foo 的样本数据(所有值都被伪造):

A        B  C           D
Amount      Due         Paid
$200.00     2017-03-01  2017-01-03
$40         2017-03-12  2017-03-03
$300.00     2017-04-01
$40         2017-04-12

这就是 Bar 中的结果:

A          B
Date       Total
2017-02-30 $240
2017-03-15 $0
2017-03-30 $340
2017-04-15 $0

如果我更新单元格 Foo!D4,它的日期介于 Bar!A3 和 Bar!A4 之间,则公式不会在 Foo!A5 中注册值。

更新后的表 Foo:

A        B  C           D
Amount      Due         Paid
$200.00     2017-03-01  2017-01-03
$40         2017-03-12  2017-03-03
$300.00     2017-04-01  2017-03-22
$40         2017-04-12

表格栏变成:

A          B
Date       Total
2017-02-30 $240
2017-03-15 $300
2017-03-30 $0
2017-04-15 $0

什么时候应该:

A          B
Date       Total
2017-02-30 $240
2017-03-15 $300
2017-03-30 $40
2017-04-15 $0

这是我的公式的问题还是奇怪的效率错误?

我在 Windows 10 上使用 Excel 2013 版本 1609

【问题讨论】:

    标签: excel excel-formula sum


    【解决方案1】:

    我相信 SUMIFS 根据公式所在的单元格的位置而不是每个位置来计算 criteria_range 上的 IF 语句 - 即,如果公式在 B4 中,那么它会评估 ISBLANK(Foo!D4) 并使用它确定要用于条件范围的列。如果您在 Foo!D4 2017-04-02 中设置日期,则 300 美元将显示在 B4 中。但是,最后的 40 美元仍然丢失,因为 B4 使用 D 列作为条件范围,因此基于 Foo!D5 求和,它没有值,因此不适合日期范围,而 B5 正在使用 C 列(因为Foo!D5 为空)用于 2017-04-15 之后的日期,与 Foo!C5 不匹配。

    我能够使用数组公式使其工作,该公式使用预期的条件范围:

    =SUM(IF((IF(ISBLANK(Foo!D:D),Foo!C:C,Foo!D:D)>=Bar!A4)*(IF(ISBLANK(Foo!D:D),Foo!C:C,Foo!D:D)<Bar!A5),Foo!A:A))
    

    由于这是一个数组或 CSE 公式,您必须通过按 Ctrl-Shift-Enter 而不是仅 Enter 来关闭单元格,它才能工作。这意味着您必须按 F2 或在编辑栏中单击、粘贴,然后按 Ctrl-Shift-Enter 而不是仅粘贴文本(除非您从已经将其作为数组公式的单元格复制)。您将能够分辨出来,因为它会显示在公式栏中,并带有花括号。

    {=SUM(IF((IF(ISBLANK(Foo!D:D),Foo!C:C,Foo!D:D)>=Bar!A4)*(IF(ISBLANK(Foo!D:D),Foo!C:C,Foo!D:D)<Bar!A5),Foo!A:A))}
    

    将花括号放在自己身上是行不通的。 ;-)

    数组公式使用 * 表示“AND”,使用 + 表示“OR”逻辑 - 基本上,如果为 TRUE,则计算结果为 1,如果为 FALSE,则计算结果为 0,因此如果需要两者,则乘以标准(1*0 为 0,1*1 为1),如果您只需要其中一个为真,则添加条件(1+0 是 1,1+1 是 2 符合条件)。

    中间的 IF 函数确定要与每个条件进行比较的数组。数组公式确定每个位置 x 的结果,乘以其他条件,并将该值作为logical_test 的结果返回给第一个 IF 函数。

    然后第一个 IF 函数根据这些结果创建一个数组:如果条件在位置 x 处评估为 TRUE,则将位置 x 处的列 A 中的值添加到数组中。

    SUM 然后对第一个 IF 函数传递给它的数组求和。

    【讨论】:

    • 我觉得奇怪的是 SUMIFS 逻辑是这样工作的。我当然没有在我看到的文档中看到任何对这种逻辑行为的引用,但你的公式就像一个魅力。谢谢!
    • 我认为 Excel 会评估一次 IF 语句,然后将结果范围传递给 SUMIF。如果您有一个单元格并将 =TableName [ColumName] 放入其中,则结果是该列中与您的单元格具有相同行号的单元格的值(而不是整个列),这让我意识到了什么在摆弄您的数据后正在继续。由于它不是“数组”公式,因此它以相同的方式处理 logical_test 中的范围。很高兴我的回答有帮助! :-)
    【解决方案2】:

    当然,如果您有数百个数组公式,并且可能有点难以编写,那么数组公式可能会减慢您的工作速度,因此更简单的方法可能是将您的数据转为 Foo!放入表中并放入

    =IF(ISBLANK([@[Paid]]),[Due],[Paid])
    

    在 E 列中(表应扩展为包含该列)并使用 TableName[columnE'sHeaderName] 作为 Bar! 上 SUMIF 中的范围。

    不想看到此列或担心有人更改它?只需隐藏该列。 ;-)

    这还允许您在 wookbook 的其他位置使用相同的“哪个日期”逻辑,而无需每次都计算或使用一大堆数组公式。它还允许您使用 Foo! 上的数据!作为数据透视表的来源,您希望在其中使用此计算日期,而不是始终使用到期日期或支付日期。

    不知道为什么我一开始就没有想到这个,因为我一直在使用它......

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2016-01-19
      • 2016-09-24
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多