有没有人知道在Microsoft Excel中找到一列中最后一个不为空的单元格值的公式?
有没有人知道在Microsoft Excel中找到一列中最后一个不为空的单元格值的公式?
使用以下简单公式更快速
=LOOKUP(2,1/(A:A<>""),A:A)
Excel 2003:
=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
它给你以下优势:
说明:
(A:A<>"")
返回数组{TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
修改这个数组为 {1,1,..,#DIV/0!,..}
LOOKUP
函数期望一个升序的排序后的数组,并且考虑到如果LOOKUP
函数找不到精确匹配,它会选择lookup_range
中最大的小于或等于该值(在我们的情况下是{1,1,..,#DIV/0!,..}
),该公式查找数组中最后的1
并返回对应的result_range
(第三个参数-A:A
)中的值。还有一点需要注意 - 上面的公式不考虑包含错误的单元格(只有在最后一个非空单元格有错误时才会看到)。 如果您想考虑它们,请使用:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
下面的图片展示了它们之间的区别:
LOOKUP
的文档说明最后一个参数 result_vector
是可选的。然而,如果我省略它,我会得到一个非常奇怪的结果,我不理解。 - Honza Zidek1/(A:A<>"")
返回值(除了空列 A 之外始终为 1
)。2) A:A<>""
返回布尔数组,但您需要数字数组 - =LOOKUP(2,1*(A:A<>""),A:A)
,但它也不能按您想要的方式工作 - 查找始终依赖于数组已排序的事实。由于最后一个元素始终小于查找值,因此查看数组的其余部分毫无意义,查找只是返回它(或来自 result_vector 的相应值)。因此,=LOOKUP(2,1*(A1:A10<>""),A1:A10)
总是返回 A10
中的值(如果它不是错误)。这适用于文本和数字,并且不在意是否存在空单元格,即它将返回最后一个非空单元格。
它需要使用数组公式,也就是说,您在键入或粘贴后按Ctrl-Shift-Enter。下面是针对A列的公式:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
=INDEX($C:$C,SUMPRODUCT(MAX(($C:$C<>"")*(ROW($C:$C))))))
... 因此使用SUMPRODUCT不需要输入为数组公式。 - Rosetta这里有另一种选项:=偏移($A$1;计数(A:A)-1;0)
COUNTA
而不是COUNT
),那么这种方法不起作用,更不用说空白单元格了。 - Jean-François Corbett我知道这个问题很老,但我不满意提供的答案。
LOOKUP, VLOOKUP和HLOOKUP存在性能问题,基本上不应该使用。
数组函数有很多额外的开销,也可能存在性能问题,因此只应作为最后的选择。
COUNT和COUNTA在数据不连续非空时会遇到问题,即在所涉及的范围内存在空格然后再次出现数据。
INDIRECT是不稳定的,所以只应作为最后的选择。
OFFSET是不稳定的,所以只应作为最后的选择。
任何对最后一行或列的引用(例如Excel 2003中的第65536行)都不够健壮,并会产生额外的开销。
以下是我使用的方法:
当数据类型混合时: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
当已知数据仅包含数字时: =MATCH(1E+306,[RANGE],1)
当已知数据仅包含文本时: =MATCH("*",[RANGE],-1)
MATCH的开销最小且不是不稳定的,因此如果您正在处理大量数据,则应使用它。
TRUE
/FALSE
)的单元格,它们将无法被检测到。尽管这个答案并不是百分之百可靠,但我仍然认为这个答案对性能的影响最小。 - ImaginaryHuman072889=INDEX(N:N,MATCH(1E+306,N:N,1))
- swimfar受Doug Glancy答案的启发,我想出了一种无需使用数组公式即可完成相同操作的方法。不要问我为什么,但我很想尽可能避免使用数组公式(没有特定原因,这只是我的风格)。
下面是方法:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
为了使用列A作为参考列查找最后一个非空行
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
要使用第一行作为参考行查找最后一个非空列,
这可以与索引函数结合使用,有效地定义动态命名范围,但这与此处所解决的问题无关。
我已经在Excel 2010中使用上述方法进行了测试,包括“本机”和“兼容模式”(适用于旧版本的Excel),它们都有效。同样,您不需要执行Ctrl+Shift+Enter。通过利用Excel中sumproduct的工作方式,我们可以满足执行数组操作的需求,但没有使用数组公式。我希望有人能像我一样欣赏这些提出的sumproduct解决方案的优美、简洁和优雅之处。尽管我不保证上述解决方案的内存效率,但它们很简单,外观漂亮,有助于实现预期目标,并且足够灵活以将其用于其他目的:)
希望对您有所帮助!
祝你好运!
这个方法适用于Excel 2003(以及稍作修改后的后续版本)。按Ctrl+Shift+Enter(而不是仅仅按Enter)将其输入为数组公式。
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
A1:A65535
并对最后一个单元格进行特殊处理,即在Excel 2003中为A65536
。不能只说A:A
甚至A1:A65536
,因为后者会自动恢复为A:A
。A65536
为空,则可以跳过IF
部分:=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
=INDEX(A:A,COUNTA(A:A))
。=INDEX(19:19,COUNTA(19:19))
。 - Serj Sagan一种不使用数组公式的备选方案,可能比以前的回答中提供的不使用数组公式的解决方案更加健壮,是:
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
如果您要在A列中搜索,请使用以下方法:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
返回最后一个非空行号,indirect()返回单元格的值。
=MATCH("*";A1:A10;-1)
用于文本数据
=MATCH(0;A1:A10;-1)
用于数值数据