我在网上遇到了一些数组评估技巧。但我无法理解这个理论。我想有很多像我这样的人想知道这个主题。
N( INDEX (.....))
如何在幕后进行操作? N( IF (1,.....))
如何在幕后制作?N function
?答案 0 :(得分:2)
答案 1 :(得分:0)
这是一个相当开放的问题,在没有源代码的情况下,必须基于经验证据,使用可用的公式工具以及ECMA / ODF文档。
什么是数组评估,为什么需要它?
开放式公式标准在此处描述了通用公式处理模型: http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part2.html#__RefHeading__1017860_715980110
以一个简单的示例为例,下面的公式中ABS
函数与许多其他函数一样,采用并返回数字值:
=SUM(ABS(A1:A3))
如果正常输入,则通过将与公式单元格相同的行或列作为交集来解析值参数。因此,如果输入B2
,则上面的内容将解析为ABS(A2)
。
另一方面,如果使用Ctrl + Shift + Enter作为数组公式输入,则在公式周围放置括号{.}
,并且SUM
参数是计算数组返回等于:
=ABS(A1)+ABS(A2)+ABS(A3)
这种数组求值对减少中间计算以及减少公式长度很有帮助。
但是,一些函数,例如INDEX
,VLOOKUP
,HLOOKUP
,CELL
,FILTERXML
和HYPERLINK
可以返回数组。如上面的OpenFormula链接中所指定的,此类函数不会以与ABS相同的方式遍历value参数。要强制使用这些功能的数组,需要使用下一节中的技巧。
N(IF(.))
和N(INDEX(.))
在幕后如何工作?
考虑这对公式(例如,如果C1:C3 = {2;5;7}
的结果为=A2+A5+A7
):
=SUM(INDEX(A:A,N(INDEX(+C1:C3,))))
=SUM(INDEX(A:A,N(IF({1},C1:C3,))))
让我们专注于第一个公式,并在一些简化的公式版本上运行评估工具:
[1]=+N(INDEX({2;5;7},)) -> +N({2;5;7}) -> +{2;5;7}
[2]=+N(INDEX(C1:C3,)) -> +N($C$1:$C$3) -> +2
[3]=+N({2;5;7}) -> +N(2) -> +2
比较结果:
[1] & [2]: INDEX returns array / reference types
[2] & [3]: N takes reference / value types
[1] & [3]: N(INDEX(,)) returns an array that is passed like a value type
上面一行的结果可能用[{2;5;7}]
表示,其中[.]
是对数组的“值类型引用”。在公式内,可能需要将这样的结果传递给另一个IF或INDEX函数,以避免出现错误。可以从任何类似的数据类型组合中获得相同类型的结果:
array / reference -> value / reference
另一个示例是在第4个参数中带有IF的AGGREGATE。
我们为什么需要在这里使用N
函数?
N
函数有效地通过引用传递了数组参数 ,否则IF
函数的结果将通过值传递。。
要对此进行查看,请对公式=N(A1)
中的引用参数应用“评估公式”工具,而不会转换为=ABS(A1)
等其他函数。
请注意,工作表函数使用的总和类型(XLOPER)可以是本机Excel数据类型的组合:值(数字,文本,逻辑,任意);数组;参考。
可以通过逐步使用引用和数组参数(例如A1和{1})从函数向导和“评估公式”工具中找到数据类型。
有关完整列表(更多链接),请参见:https://chandoo.org/forum/threads/excel-function-reference.35686/