在Google表格中获取某一列最后一个非空单元格

231

我使用以下函数

=DAYS360(A2, A35)

我想计算我的一列中两个日期之间的差异。然而,这一列是不断扩展的,因此每次更新电子表格时,我都必须手动更改"A35"。

是否有一种方法(在Google表格中)可以找到该列中最后一个非空单元格,然后动态设置上述函数中的参数?


2
类似问题:https://dev59.com/Q2855IYBdhLWcg3wvXHd#13356890 - Jon Schneider
22个回答

6
获取最后一个值的公式是什么?
=index(G:G;max((G:G<>"")*row(G:G)))

以下是您原始任务的最终公式:

这将是您原始任务的最终公式:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

假设你的起始日期在G10单元格。

max((G:G<>"")*row(G:G)) 是什么意思? - zzzgoo

5

我选择了另一种方法。由于我知道我将逐个向行/列添加内容,因此首先通过计算具有数据的字段来找出最后一行。下面是一个列的示例:

=COUNT(A5:A34)

那么假设返回的是21。A5向下有4行,所以我需要从第四行向下的第21个位置获取信息。我可以使用indirect函数来实现,如下所示:
=INDIRECT("A"&COUNT(A5:A34)+4)

它是查找具有数据的行数,并将其作为索引修饰符返回给我。

1
请注意,单元格不能为空。此外,COUNTA 应适用于更多的情况。 - Bernardo Dal Corno

4

对于一行:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

针对一列进行操作:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

3

通过引入LAMBDA和REDUCE函数,我们现在可以在一次遍历单元格时计算行号(以上几种解决方案会两次筛选范围),而无需依赖于神奇文本或数字值。

=lambda(rng, 
   REDUCE(0, rng, lambda(maxrow, cell, if(isblank(cell),maxrow,row(cell)) ) )
)(A:A)

这可以被很好地打包成一个命名函数,以便像使用函数一样使用它

=LAST_ROWNUM(A:A)

它适用于包含间隔空白的列、多列范围(因为REDUCE按行优先迭代范围),以及部分列(如A20:A),仍然返回实际行号(而不是范围内的偏移量)。

然后可以将其与Index结合使用以返回值

=DAYS360(A2, Index(A1, LAST_ROWNUM(A:A)))

实际上,我怀疑OP的日期值是单调的(即使中间有空白),他可以轻松解决这个问题。

=DAYS360(A2, MAX(A2:A))

此解决方案在上文中被认定为依赖于日期“连续” - 不管是指“没有空白”还是“没有缺失日期”,我不确定 - 但任何一种规定都是不必要的。

我测试了这个问题和那个问题中的所有提议答案。这是唯一一个完美地处理单元格内容类型的答案:数字,字符串,TRUE/FALSE,NA,ERROR,VALUE和ArrayFormula的空单元格。这个答案是一个隐藏的宝藏。 - thdox
为了帮助他人,这里是公式定义,您应该将其放在命名函数中:=REDUCE(0; range; lambda(maxrow; cellule; if(isblank(cellule);maxrow;row(cellule)) ) ),然后您可以使用=LAST_ROWNUM(A:A)来获取最后一个非空行的行号。要检索值,您可以使用=INDEX(A:A, LAST_ROWNUM(A:A)) - thdox
这个公式=lambda(rng, REDUCE(0, rng, lambda(maxrow, cell, if(isblank(cell),maxrow,row(cell)) ) ) )(A:A)实际上可以简化为=REDUCE(0, A:A, lambda(maxrow, cell, if(isblank(cell),maxrow,row(cell)) ) ) - thdox

3
这将提供最后一个单元格的内容:
=indirect("A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>""))))

这将提供最后一个单元格的地址:

="A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

这将提供最后一个单元格所在的行:
=max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

也许你更喜欢脚本。这个脚本比其他人发布的那个长得多的要短得多:
前往脚本编辑器并保存此脚本:
function getLastRow(range){
  while(range.length>0 && range[range.length-1][0]=='') range.pop();
  return range.length;
}

完成这个步骤后,您只需要在单元格中输入以下内容:

=getLastRow(A:A)

非常感谢!我一直在寻找一种解决方案,以限制基于相邻列最后一个非空单元格的列的数组公式的范围。这就是它的代码:=ARRAYFORMULA(S2:INDIRECT("S"&max(ARRAYFORMULA(row(F:F)*--(F:F<>""))))) 其中 S2:.. 以列 F 的最后一个非空单元格(在我这个例子中为 S2773 / F2773)作为该新列范围的截止点。这使其具有动态性,并且我不再需要手动切割剩余的空单元格。只需要将内容粘贴到列 F 中,它就会自动完成。也不需要任何单独的参考单元格!再次感谢。祝一切顺利! - Lod

2
为了查找最后一个非空行号(允许它们之间有空白),我使用以下代码搜索列 A
=ArrayFormula(IFNA(match(2,1/(A:A<>""))))

1

要选择任意非空值列中的最后一个,忽略标题单元格(A1):

=INDEX(A2:A,COUNT(A2:A))

1
计算A列中最晚日期与单元格A2中日期之间的差值。
=MAX(A2:A)-A2

差异运算符将无法计算正确的值,因为他正在使用DATE360函数。 - DavidM

1

Ben Collins是一位Google表格大师,他在自己的网站上提供了许多免费的技巧和课程。他还有一篇关于动态范围名称的免费文章,我已经将其作为我的许多项目的基础。

https://www.benlcollins.com/formula-examples/dynamic-named-ranges/

声明:我推荐Ben的网站并没有任何利益关系。

这是我使用动态范围的一个项目的截图:

enter image description here

单元格D3有一个公式,如上所示,但这是一个数组公式:

=ArrayFormula(MAX(IF(L2s!A2:A1009<>"",ROW(2:1011))))

单元格D4具有以下公式:

="L2s!A2:E"&D3

0
这对我有用: =ArrayFormula(LOOKUP(2,1/(CELL_RANGE<>""),CELL_RANGE)) 只需将您的单元格范围放在CELL_RANGE中。
除了在单列上有效,也适用于单行。

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