我正在努力理解特定数组公式的机制。我有一行数据,范围从2015年1月到2016年12月。我们假设数据填充到2016年10月,10月份的金额为1,000英镑。当数据输入2016年11月说1,250英镑时,下面的公式会自动计算两个月之间的差值。公式如何做到这一点。有人可以帮助提供下面的简单解释,特别是它如何知道从上个月扣除最近一个月。
=(INDEX(60:60,MAX(IF(M60:AV60<>"",COLUMN(M60:AV60)))))-(INDEX(60:60,MAX(IF(M60:AV60<>"",COLUMN(M60:AV60)-1))))
感谢您的帮助,
数
答案 0 :(得分:1)
这有点复杂,但让我们一次分解它。
这看起来是一个数组公式,这意味着它不是处理单个单元格,而是可以同时处理整组单元格。
M60:AV60<>""
此段生成一个TRUE和FALSE值的数组(列表),查看M60和AV60之间的每个单元格。只要单元格包含值 - 即不是空白 - 它返回TRUE。如果单元格不包含值,则返回FALSE。此列表仅存在于程序的工作存储器中,并且不会记录在工作表中的任何位置。所以我们有这样的事情:
TRUE
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
COLUMN(M60:AV60)
此段生成另一个数组,其大小与上面的TRUE / FALSE数组相同,只包含从M60到AV60的每个单元格的列号。我们现在有两个列表 - 一个包含TRUE / FALSE,另一个包含相同长度的数字。
TRUE | 1
TRUE | 2
TRUE | 3
TRUE | 4
TRUE | 5
TRUE | 6
FALSE | 7
FALSE | 8
FALSE | 9
FALSE | 10
FALSE | 11
IF(M60:AV60<>"",COLUMN(M60:AV60))
这个IF语句将TRUE / FALSE数组与列号数组组合在一起,以获得更有用的东西。只要第一个数组中存在TRUE,就会用第二个数组中的相应数字替换它;如果第一个数组中存在FALSE,则不会更改任何内容,并且值保持为FALSE。这样,我们最终得到一个数字列表,表示每个非空白单元格的列。它相当于在数组的所有成员上运行IF公式。
IF | TRUE |THEN| 1 = 1
IF | TRUE |THEN| 2 = 2
IF | TRUE |THEN| 3 = 3
IF | TRUE |THEN| 4 = 4
IF | TRUE |THEN| 5 = 5
IF | TRUE |THEN| 6 = 6
IF | FALSE |THEN| 7 = 0
IF | FALSE |THEN| 8 = 0
IF | FALSE |THEN| 9 = 0
IF | FALSE |THEN| 10 = 0
IF | FALSE |THEN| 11 = 0
在=之后的最后一列是传递给MAX函数的。
MAX(IF(M60:AV60<>"",COLUMN(M60:AV60)))
此细分列表将数字列表缩减为一个数字,即列表中的最大数字或最高数字。因此,我们最终得到一个结果,它代表包含值的最后一列。
INDEX(60:60,MAX(IF(M60:AV60<>"",COLUMN(M60:AV60)))))
INDEX
函数查看第60行的所有内容,并返回该行中指定列的值。这是前几个段返回的列 - 包含值的最后一列。
具有第二个INDEX
函数的公式的后半部分完全相同,但它从返回的列号中减去1 - 也就是说,它获得具有值的倒数第二列
最终结果是从最后一个值中减去倒数第二个值,以获得它们之间的差异。