=INDEX(Jun!C:C, MAX((Jun!C:C<>"")*ROW(Jun!C:C)))
以上是我在网上找到的。使用此公式,我可以获取工作表中最后一行的值Jun
.
你能解释一下MAX((Jun!C:C<>"")*ROW(Jun!C:C))
是如何工作的吗?我试图单独研究它,但只得到了一个常量值 1。这意味着只有当它被放入INDEX
才能按我们的预期工作。
让我们分解公式:
=index(Jun!C:C, max((Jun!C:C<>"") * row(Jun!C:C)))
。喜欢这个:
1=index(
2Jun!C:C,
3max(
4(Jun!C:C<>"")
*
5row(Jun!C:C)
)
)
1index()
是一个数组启用函数,这意味着其中的表达式将被计算为作为函数参数给出的范围中的所有行和所有列,一次一行和一列。该函数只有在评估完所有参数后才能执行其操作,此时它返回2Jun!C:C
中的值,其行号由3max()
给出。
4(Jun!C:C<>"")
是一个表达式,它将对包含值的行给出true
,对空行false
。由于它是在数组公式上下文中计算的,因此它将获得与Jun!C:C
中的行一样多的结果,给出一个垂直的布尔数组。
5row(Jun!C:C)
是返回行号的表达式。在此数组公式中,它将返回一个包含 1、2、3...一直到Jun!C:C
中最后一行的行号。
接下来,*
运算符成对地将 (4) 给出的布尔值乘以 (5) 给出的行号。在布尔数组中,当数学运算符(如*
)访问时,false
会自动强制0
true
并强制1
。这些布尔值和行号的相乘得到一个垂直数组,如 1、2、3、0、5、0、0、8、0、0、0...其中许多结果将为零,因为所有空白行都将产生0
的乘积,因为(Jun!C:C<>"")
false
此类行。
(3)然后max()
从这些产品中挑选出最大的结果。该数字对应于最后一行不为空的行号。
(1)index()
从max()
表达式中获取结果作为其第二个参数,该参数告诉在第一个参数指定的数组中获取哪一行,即在列 (2)Jun!C:C
中获取哪一行。
最终结果是公式获取列Jun!C:C
中具有可见内容的最后一个单元格中的值。
我的理解是,最早提及该模式是在 2015-01-09 的 Google 文档帮助论坛的表格挑战 #1 中:
=INDEX(A:A,MAX(IF(LEN(TRIM(A:A)),ROW(A:A)))) (44) Yogi
=INDEX(A:A,MAX(ROW(A:A)*(A:A<>""))) (34) --Hyde
=INDEX(LOOKUP(2,IF(A:A<>"",1),A:A)) (34) AD:AM
=INDEX(A:A,MATCH(2,IF(A:A<>"",1))) (33) AD:AM
=SORT(A:A,(A:A<>"")*ROW(A:A),)&"" (32) 2n9
=+SORT(A:A,ROW(A:A)*(A:A<>""),0) (31) Isai
=+SORT(A:A,ROW(A:A)*(A:A<>""),) (30) 2n9
=+SORT(A:A,A:A<>"",,ROW(A:A),) (29) Isai
请参阅 index() 帮助页面和 Maxim Makhrov 的 ArrayFormula 实验室博客文章。
要解释=INDEX(Jun!C:C, MAX((Jun!C:C<>"")*ROW(Jun!C:C)))
的作用,您必须了解一些基本概念:
假设您的A:A
有 5 列,但只有第 1-3 行有一个值,
A |
---|
答1 |
答2 |
答3 |