有很多基于公式的解决方案可用于从 Excel 中的列、行或连续范围中查找最后一个非空单元格值,例如,对于列,最常用的是
=LOOKUP(2,1/(A:A<>""),A:A)
和 =LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
。这很好,但它只适用于连续范围。但是,有时您需要对断开连接的单元格列表或单元格范围而不是单个连续范围执行相同的操作。所以,如果有一个假设的函数FINDLASTNONBLANK()
,它的调用将是这样的:
对于任意长的单细胞列表
=FINDLASTNONBLANK(A1, D1, F1)
=FINDLASTNONBLANK(A1, D1, F1, X1)
对于任意长的范围列表
=FINDLASTNONBLANK(A1:A4, A10:A15)
=FINDLASTNONBLANK(A1:A4, A10:A15, A20:A25)
显然,没有现成的公式,所以我想知道是否有办法为此制定一个基于公式的解决方案。没有 VBA UDF。
到目前为止,我的思考方向如下:如果我可以编写一个公式来将断开连接的单元格/范围连接到一个范围/数组中,那么也许我可以使用经典的
=LOOKUP(2,1/(A:A<>""),A:A)
hack,就像这样(假设假设公式JOINRANGES()
或假设的聚合语法 {,}
):
=LOOKUP(2,1/(JOINRANGES(A1:A4,A10:A15)<>""),JOINRANGES(A1:A4,A10:A15))
=LOOKUP(2,1/({A1:A4,A10:A15}<>""),{A1:A4,A10:A15})
所以也许 Excel 中有一种语法可以从我不知道的不相交的单元格/范围/数组列表中指定一个数组?如果有,它应该至少与 Excel 2007 向后兼容。
如果解决方案仅限于一维数据源(仅行,仅列),我会很好,不必在二维矩阵上工作。事实上,我可以接受一个只处理来自同一行的不相交数据的解决方案,甚至不是一列。
UPD:(感谢@P.b)不,堆叠 A1:A4:A10:A15 无法按预期工作,Excel 将其缩减为 A1:A15,从而使下面列出的解决方案无效。回到绘图板。
原消息:
我想找到了我要找的语法:
=LOOKUP(2,1/(A1:A4:A10:A15<>""),A1:A4:A10:A15)
要加入不相交的范围,我需要做的就是继续将它们列为成对的冒号分隔范围。
我假设要使此技巧适用于单个单元格而不是范围,需要将每个单元格转换为单个单元格范围以防止不相交的单元格之间出现不需要的桥接:
=LOOKUP(2,1/(A1:A1:A5:A5:A10:A10<>""),A1:A1:A5:A5:A10:A10)
在 Excel 2007 中工作。
还有更优雅的解决方案吗?
这是一个有趣的话题,已经在几个地方讨论过(如果我理解正确的话)。例如 MATCH vs XMATCH:二进制搜索以查找范围内的最后一个条目 由 Microsoft Tech 社区的@JosWoolley 发起。这是提供的解决方案之一,适用于数字和文本值。
=XMATCH(TAKE(TOCOL(A:A,1),-1),A:A,,-1)
它所做的是通过
TOCOL
删除空单元格,然后通过 TAKE
获取最后一个非空值并通过 XMATCH
进行反向搜索。
要找到最后一个元素,只需添加
INDEX
:
=INDEX(A:A,XMATCH(TAKE(TOCOL(A:A,1), -1),A:A,,-1))
还有其他仅适用于文本或数字条目的替代方法。您可以使用
MATCH
查看提供的链接,这更有效,但仅适用于特定情况。
这是一种为中间有空单元格的单列查找最后一个非空行的方法(在列内不连接范围)。
=TAKE(TOCOL(VSTACK(A1:A4,A10:A15),1,0),-1)
TOCOL 中的
1
(TRUE) 忽略范围内的所有空单元格。 0
(FALSE) 按行添加值(按列 = false),因此您还可以获取给定范围内任何列的最后一行的值。
TAKE(array,-1)
返回数组中的最后一个值。
这需要 Office 365。
编辑:将 VSTACK 添加到我的公式中以更具主题性,但仍然与 excel 2007 不兼容。
在较旧的 Excel 中,您需要使用 INDEX 将行号硬核为数组,或者写一个丑陋的大于-小于,+大于-小于
=LOOKUP(2,
1/
((ROW(A1:A15)>ROW(A1))*
(ROW(A1:A15)<ROW(A5))+
(ROW(A1:A15)>ROW(A10))*
(ROW(A1:A15)<=ROW(A15))*
(A1:A15<>"")),
A1:A15)