函数内向量化(SUMIF 中的条件参数)

Vectorization within functions (argument for conditional in SUMIF)

这在 C++、Python、R 等中是微不足道的。但是 Excel 让我费尽心机。网络上一遍又一遍地有无数个本质上相同的简单示例;我找不到任何内容来解决 SUMIF/COUNTIF.

的这个应用程序

我有一个项目列表,每个项目都有一个类别位标志:

 ...... A ............. B .... C
1 |Item ........... # ... Flag
2 | Apples ....... 20 ... 1
3 | Oranges .... 30 ... 3
4 | Lemon ........40 ... 7
5 | School Bus .. 5 ... 4

这里,使用EXCEL函数BITAND:

-- BITAND( < flag >, 1) is non-zero for fruit, 
-- BITAND( < flag >, 2) is non-zero for citrus,
-- BITAND( < flag >, 4) is non-zero for yellow,

我需要做类似的事情:

Total Citrus = SUMIF(C2:C5, BITAND(C2:C5, 2) > 0, B2:B5)

这不起作用,因为条件(第二个参数)只能在简单条件(例如“>5”)中使用对列表元素的隐式引用

变体可能如下所示:

Total Citrus = SUM( IF(BITAND(C2:C5, 2) > 0, B2:B5) )

这几乎行得通,但条件仅针对单元格 C2 进行测试,然后对总列表求和,否则不行。

当然我可以使用三个不同的列并用 1 和 0 填充它,但是如果根据我的实际情况进行缩放,那会很糟糕。

您已经使用 BITAND function² 创建了一个数组公式¹。这些需要使用 Ctrl+Shift+Enter↵ 而不是简单地 Enter↵ 。正确输入后,Excel 将在公式周围添加大括号(例如 {} )。这些不是你自己输入的。

在 E7 中,

=SUM(IF(SIGN(BITAND($C:$C, VLOOKUP(D7, $G:$H, 2, FALSE))), $B:$B))

输入正确后,根据需要填写。


¹ 数组公式需要用Ctrl+Shift+Enter↵.一旦正确输入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。尝试将 full-column 引用减少到更接近代表实际数据范围的范围。数组公式以对数方式消耗计算周期,因此最好将参考范围缩小到最小值。有关详细信息,请参阅 Guidelines and examples of array formulas

² BITAND function² 是在 Excel 2013 中引入的。它在早期版本中不可用。