我有一个 Excel 公式来查找行中最后一个具有负值的单元格的列号。问题是它是一个数组公式,我需要用来创建电子表格的工具(Apache POI SXSSF)不支持数组公式。
行中的值不以任何方式排序。
当我手工制作电子表格时有效的数组公式是
{=MATCH(2,1/(B18:M18<0))}
有没有办法用一个普通的公式来达到同样的结果?
感谢您的任何提示!
我有一个 Excel 公式来查找行中最后一个具有负值的单元格的列号。问题是它是一个数组公式,我需要用来创建电子表格的工具(Apache POI SXSSF)不支持数组公式。
行中的值不以任何方式排序。
当我手工制作电子表格时有效的数组公式是
{=MATCH(2,1/(B18:M18<0))}
有没有办法用一个普通的公式来达到同样的结果?
感谢您的任何提示!
=MATCH(2,1/MMULT(1,-(B18:M18<0)))
解释
如果正常输入原始公式,B18:M18
则使用隐式交集评估范围(例如,如果输入其中,C5
则评估为=MATCH(2,1/(C18<0))
which return #N/A
)。使用 CTRL+SHIFT+ENTER 输入公式意味着该区域被评估为一个数组,而不是单个单元格区域。
MMULT
是少数几个可以从一系列值返回数组的函数之一。为了在这里使用它,我们首先需要使用-(B1:B18<0)
(或用N
代替-
)将布尔值数组转换为数字。接下来我们预乘1
(即一个 1x1 矩阵)以返回相同的数组,就好像它已经过数组求值一样。这适用于水平数组,对于垂直数组,我们需要后乘 1,这意味着切换参数。
这种方法很普遍。作为另一个例子,考虑使用公式找到范围内的最大负值=MAX(IF(B1:B18<0,B1:B18))
。再次替换B1:B18<0
为MMULT(1,-(B1:B18<0))
消除了对数组条目的需要。在不尝试提出完全不同的公式的情况下,我不知道有任何其他方法可以做到这一点。