我试图计算单元格的总和J10:M76
,如果B10:E76
= 文本值,但如果单元格R10:R76
不为空(包含值),我不想包括中的值J10:M76
。
我知道这有点复杂,这就是我目前正在做的事情来解决这个问题,但肯定有更好的方法。
=SUM(SUMIF($B$10:$E$76,{"City of Tampa"},$J$10:$M$76))-J13
答案1
如果您能够使用数组公式,则这是一种标准方法。
我的看法是,您希望将答案放在单个单元格中,因此没有特别的理由避免使用数组公式。(使用多单元格数组公式的常见原因是更改公式的难度以及相关问题。数组公式占用的块可以像合并为一个的单元格块一样工作。)
(这篇文章很长,所以我可以清楚地说明步骤,这样你就不会因为我应该展示的一个微小的细节而抓狂。)
如果是的话,那么概念如下:
最终公式本身不仅是一个使用 Control-Shift-Enter(“CSE”)输入的数组公式,而且您还可以将其各个部分组成数组。
一个数组将包含您(可能)希望求和的值(在本例中为 B10:M76)。第二个数组将是包含所需文本的范围,第三个数组将是测试 null/blank/empty 条件的范围。
第一个数组的目的是将要添加的值付诸实践。第二个和第三个数组的目的相同:执行所需的测试并为每个测试返回一个逻辑值。逻辑值?您将让它们返回 TRUE 或 FALSE,具体取决于测试成功或失败。
如果对这些逻辑值进行数学运算,Excel 会将它们视为 1 和 0。因此,快乐文本列可能会产生 {TRUE;FALSE;TRUE;TRUE;FALSE;...等},如果对结果进行数学运算,则其将充当 {1;0;1;1;0;... 等}。通常,您会通过将单个数组乘以 1 来执行此操作。在这里,您需要一条稍微复杂的解决方案路径,而不是引入“*1”,您只需使用其他两个数组即可。第三个数组与您测试单元格的 null/空白/空条件并获取相同类型的 TRUE 和 FALSE 数组类似。
因此,第一个数组将求和值的范围放入一个数组中,第二个和第三个数组是您需要的两个测试的 TRUE 和 FALSE 结果。如果任何一个测试失败,您将把另一个测试结果乘以 0,结果为 0,将匹配的求和值乘以该结果。因此,如果任何一个测试失败,该行的求和值将乘以 0,结果为 0,您将把所有这些都包装在其中的 SUM() 函数添加该结果。如果两个测试都成功,该行的求和值将乘以 1,并最终出现在 Excel 呈现给 SUM() 函数的最终数组中。
这样, SUM() 就不会为失败的行添加任何内容,因此只有测试成功的值才会出现在结果中。
这正是你想要的。
在这种情况下,您需要编写第一个测试,以便在成功时生成 TRUE。例如:
(B1:B6="City of Tampa")
并且需要编写第二个测试,以便在测试失败时生成 1,也就是说,将其写为“不匹配”类型,或者以“积极”的方式编写,但将其包装在 NOT() 函数中:
(C1:C6<>"")
(NOT(C1:C6=""))
(无论哪种方法对您来说最有意义,并且最能让您在未来处理电子表格。每个人都不一样,主管有时会表达要求,以便他们可以审核它并确保它给出有效的答案。)
您的第一个数组非常简单,只是您可以自行求和的值范围:
A1:A6
(您必须将测试部分(第二和第三个数组)括在括号中,但第一个数组不需要这样做。但如果您愿意的话也可以。)
然后将它们放在一起并用 SUM() 函数包装:
{=SUM( A1:A6 * (B1:B6="City of Tampa") * (C1:C6<>"") )}
(当然,按“CSE”将添加包装上述内容的 {}。)
您不仅可以在求和方面使用这种方法,还可以在各种其他函数中使用这种方法。事实上,有些甚至不需要用“CSE”输入整个最终公式:即使它在中间工作中使用数组,它也可以是一个完全正常的公式。因此,如果您遵循上述方法,您可以将这种方法应用于您遇到的许多问题。
我没有完全重现您的问题(因此我在示例中使用了简单的范围),但通常要对多列和多行范围进行操作需要一些额外的工作。多行或多列范围仍然是单行数组,就像单行矩阵一样。将其设置为行和列会为 Excel(因为它需要)提供具有多行的数组,例如 3x4 矩阵。如果出现错误,您必须“展开”它并强制 Excel 将相关范围视为单行数组。例如,使用命名范围将单列(或行,如果这样更容易编写)合并到单个范围内。还有一些其他技巧。一种是编写公式来对范围内的列进行一组计算,并将其添加到第二列的第二组计算中,等等。不是更复杂,只是将几组相同的内容转移到每组列上。但通常您可以毫不费力地将其拼凑在一起,只需付出一些努力。
最后,我提到,有些公式使用数组,但本身不需要是 CSE 输入的公式。然而,奇怪的是,除非你每次都明白为什么,然后它才真正变得可以理解,就像 Homer 的“Doh!”时刻一样,否则这样做可能会产生与 CSE 输入完全相同的结果不同的结果。如果是这样,CSE 输入的版本将始终是正确的,尽管你需要每次都验证它。