为什么这个 Google Sheets 公式可以找到列中最后一个非空单元格?

5

我在寻找一种方法来查找一列中最后一个非空单元格的解决方案。

我在Google Docs编辑器帮助中找到了以下解决方案:

INDEX(C:C;MAX(ROW(C:C)*(C:C<>""))

这个解决方案完美地解决了问题,甚至可以处理空单元格和标题 - 但我无法弄清它是如何工作的。我试图通过将建议拆分成其部分并分别查看返回值来进行分析,但是我无法复制所需的结果。

有人能够解释发生了什么吗? 我显然漏掉了一些东西。

2个回答

2
  1. C:C<>""返回TRUE,如果单元格非空,则在进行算术运算时会转换为1。类似地,为空时它返回FALSE0

  2. 然后,它会乘以ROW(C:C),因此每个空单元格将得出0,每个非空单元格的值等于其行号。

  3. 取其中的最大值,即最后一个非空行的行号(称之为X)。

  4. 现在我们使用INDEX来查找列C中第X行的值。

“=MAX(ROW(C:C))”这样的东西单独使用会产生1,确实有点奇怪。我没有明确的解释,但我认为这是Google Sheets自动将某些公式扩展到数组上的结果,正如此处所提到的,因为使用了“INDEX”:
“许多数组公式将自动扩展到相邻的单元格中,避免显式使用“ARRAYFORMULA”。”

你写的所有内容看起来都很合乎逻辑,但是为什么 =MAX(ROW(C:C)*(C:C<>"") 或者 ROW(C:C)*(C:C<>"" 单独使用总是返回0呢? - Ze4Kuada

2
=ARRAYFORMULA(ROW(C:C)) 

会输出类似以下的行号:
1
2
3
4
5
6
7
...

=ARRAYFORMULA(C:C<>"")

如果C列中的单元格不为空,则输出TRUE(否则为FALSE

TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
FALSE
...

=ARRAYFORMULA(ROW(C:C)*(C:C<>""))

执行此操作(注意在PC逻辑中,TRUE = 1FALSE = 0

1   ×   TRUE    =     1     
2   ×   TRUE    =     2
3   ×   TRUE    =     3
4   ×   FALSE   =     0
5   ×   TRUE    =     5
6   ×   FALSE   =     0
7   ×   FALSE   =     0
... ×   ...     =     ...

=ARRAYFORMULA(MAX(ROW(C:C)*(C:C<>"")))

将输出最高的数字,因此在这种情况下:

5

现在INDEXARRAYFORMULA类型,所以这也可以工作:
 =INDEX(MAX(ROW(C:C)*(C:C<>"")))

现在我们将 MAX(...) 部分移动到第二个 INDEX 参数中,该参数表示行,而我们输入要映射的范围作为第一个参数:
=INDEX(C:C, MAX(ROW(C:C)*(C:C<>"")))

this translates to:

=INDEX(C:C, 5)

这意味着:“返回C列第5行的单元格”。


回答你的问题,为什么=ROW(C:C)*(C:C<>"")只返回一个值 - 这是因为没有命令来处理数组,所以基本上它等同于:

=ROW(C1)*(C1<>"")

结果可以是0或1 - 取决于参数是否

TRUE   ×  TRUE    =  1
TRUE   ×  FALSE   =  0
FALSE  ×  TRUE    =  0
FALSE  ×  FALSE   =  0

将其包装在MAX中就像拥有一样。
=MAX(1)

或者:

=MAX(0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接