在我的特定情况下,我尝试仅对位于我指定范围交集内的正数求和。但是,相交运算符似乎不适用于 SUMIF 函数。
=SUMIF(Master_Categories Remaining,">0")
我认为这行不通,因为相交运算符会生成单元格列表而不是范围。还有其他方法可以实现这一点吗?
编辑:样本数据集
Master_Categories|Remaining
cat 1 |1
|2
cat 2 |-1
|-2
|3
cat 3 |3
|4
cat 4 |-3
|-4
cat 5 |5
|5
Master_Categories =!$1:$1,!$3:$3,!$6:$6,!$8:$8,!$10:$10
Remaining =!$B:$B
评估公式误差
答案1
该公式在其内部步骤中生成一对单行矩阵,其中包含每个范围内单元格的值。
目前还没有采取任何措施将它们转换成可以相加的东西。
首先是 Master_Categories 命名范围。这个想法似乎是,如果在匹配的 Master_Categories 单元格中有条目,则仅对剩余项求和。公式中的方法让人想起标准的“制作一个 {1,1,1,0,1,0,0,0,1} 样式矩阵”,但并未完成从矩阵中返回的文本转换为 TRUE/FALSE 条目并最终转换为 1 和 0 的所有步骤。在这种情况下,联合运算符所做的只是生成一个#NULL!
。
因此,创建该部分所需的矩阵,并强制在没有文本时的值为 0:
=NOT(ISBLANK(Master_Categories))*1
成功了。ISBLANK()
测试空白是否产生与所需相反的结果,然后NOT()
将其反转。最后一步是将文本 TRUE/FALSE 值转换为 1 和 0。对它们执行一个简单的、没有其他影响的算术运算(“ *1 ”或“ +0 ”)即可实现这一点。
然后是剩余部分。对该部分使用以下内容:
=((Remaining>0)*1)*Remaining
第一位测试每个值是否与“>0”相等,返回 TRUE/FALSE 值,这些值由“乘以 1”部分转换为 1 和 0。此部分的最后一部分取 1 和 0 的结果矩阵,并将其乘以 Remaining 中的实际值矩阵。这会删除 <0 项,因为它们在 1 和 0 中的值是 0,而零乘以任何值都是 0。然后,您将得到一个 Remaining 的实际值矩阵,这些值是 >0 和 0。
然后“ SUM()
”一切(不是SUMIF()
因为你已经选择了):它将两个矩阵相乘(第一部分中的 1/0,第二部分中的实际列值和 0),因此第一部分中的 1“收集”剩余的值并将它们相加,最终给出你的答案。
它必须是一个 CSE 公式:
{=SUM(NOT(ISBLANK(Master_Categories))*(Remaining>0)*Remaining*1)}
所以...基本上,测试*测试*测试(乘法是算术中的逻辑AND
,加法是逻辑OR
)得到感兴趣的值然后Sum()
完成它。
附注:
您可以在命名范围内完成每个部分的所有操作(使用前面显示的精确单独部分以及代替其中每个名称的文字范围),而不仅仅是定义它们的单元格范围。那么公式可以是:
{=SUM(Master_Categories * Remaining)}
你可能会更喜欢这个。(仍然必须是 CSE 公式。)
最后一点:编辑公式 ( F2
),突出显示部分(通常从“内向外”),然后按F9
查看 Excel 如何评估它们,通常会显示与公式评估器显示的完全不同的图片。显然,它们大致相同,但可以细化到您想要的程度。它可能非常有用。
编辑以稍微简化公式。很多时候,看似随意,将数组更改为 1 和 0 会失败,而无需用括号括起来,而且我一直认为每个矩阵都需要一个“*1”(或“+0”)才能更改,但在查看是否可以删除多余的括号时,我进行了实验,发现整个乘法字符串的单个“*1”同样有效。不过仍然是 CSE……诱人的是,当整个内部公式归结为F9'ed
最终矩阵时,SUM()
无需 CSE 即可得到答案,但我找不到让它用部分来做到这一点的方法。