Dmi*_*liv 125
使用以下简单公式要快得多
=LOOKUP(2,1/(A:A<>""),A:A)
Run Code Online (Sandbox Code Playgroud)
对于Excel 2003:
=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
Run Code Online (Sandbox Code Playgroud)
它具有以下优点:
说明:
(A:A<>"") 返回数组 {TRUE,TRUE,..,FALSE,..} 1/(A:A<>"")将此数组修改为{1,1,..,#DIV/0!,..}.LOOKUP预期排序数组按升序排列,并考虑到如果LOOKUP函数无法找到完全匹配,它会选择lookup_range(在我们的例子中{1,1,..,#DIV/0!,..})小于或等于该值的最大值(在我们的例子中2),公式1在数组中找到最后一个并从result_range(第三个参数 - A:A)返回相应的值.还有一点注意 - 上面的公式没有考虑有错误的单元格(只有当最后一个非空单元格有错误时才能看到它).如果您想将它们考虑在内,请使用:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
Run Code Online (Sandbox Code Playgroud)
下图显示了差异:

Dou*_*ncy 74
这适用于文本和数字,并不关心是否有空白单元格,即它将返回最后一个非空白单元格.
它需要进行数组输入,这意味着在键入或粘贴后按Ctrl-Shft-Enter.以下是A列:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Run Code Online (Sandbox Code Playgroud)
Pat*_*rez 24
这是另一种选择: =OFFSET($A$1;COUNTA(A:A)-1;0)
小智 16
受到Doug Glancy的回答所带来的伟大领导的启发,我提出了一种方法来做同样的事情,而不需要数组公式.不要问我为什么,但我很想避免使用数组公式,如果可能的话(不是出于任何特殊原因,这只是我的风格).
这里是:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
Run Code Online (Sandbox Code Playgroud)
用于使用列A作为参考列查找最后一个非空行
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
Run Code Online (Sandbox Code Playgroud)
使用第1行作为参考行查找最后一个非空列
这可以与索引函数结合使用以有效地定义动态命名范围,但这是另一个帖子的内容,因为这与本文所述的直接问题无关.
我已经使用Excel 2010测试了上述方法,包括"本机"和"兼容模式"(对于旧版本的Excel),它们都有效.再次,使用这些,您不需要执行任何Ctrl + Shift + Enter.通过利用sumproduct在Excel中的工作方式,我们可以满足于进行数组操作的需要,但我们没有使用数组公式.我希望有人能像我一样欣赏这些提出的副产品解决方案的美观,简洁和优雅.但我并没有证明上述解决方案的内存效率.只是它们很简单,看起来漂亮,有助于预期的目的,并且足够灵活,可以将其用途扩展到其他目的:)
希望这可以帮助!
祝一切顺利!
W5A*_*IVE 13
我知道这个问题已经过时了,但我对提供的答案并不满意.
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具有最低的开销并且是非易失性的,因此如果您正在处理大量数据,则最好使用它.
Jea*_*ett 10
这适用于Excel 2003(稍后进行次要编辑,见下文).按Ctrl + Shift + Enter(而不仅是Enter)将其作为数组公式输入.
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
Run Code Online (Sandbox Code Playgroud)
请注意,Excel 2003 无法将数组公式应用于整个列.这样做会产生#NUM!; 可能会出现不可预知的结果!(编辑:从微软相互矛盾的信息:相同的5月或可能不会是关于Excel 2007中真实的;问题可能已修复2010年)
这就是为什么我将数组公式应用于范围A1:A65535并对A65536Excel 2003中的最后一个单元格进行特殊处理.不能只说A:A或A1:A65536后者自动恢复A:A.
如果您完全确定A65536是空白的,那么您可以跳过该IF部分:
=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用的是Excel 2007或2010,则最后一行编号为1048576而不是65536,因此请根据需要调整上述行.
如果数据中间没有空白单元格,那么我只会使用更简单的公式=INDEX(A:A,COUNTA(A:A)).
没有数组公式的替代解决方案,可能比使用没有数组公式的(提示)解决方案的先前答案更强大,
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
Run Code Online (Sandbox Code Playgroud)
见这个答案作为一个例子.感谢布拉德和巴里· 胡迪尼,他们帮助解决了这个问题.
偏好非阵列公式的可能原因如下:
官方Microsoft页面(查找"使用数组公式的缺点").
数组公式看起来很神奇,但它们也有一些缺点:
如果您在列 (A) 中搜索,请使用:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
Run Code Online (Sandbox Code Playgroud)
如果您的范围是 A1:A10,您可以使用:
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
Run Code Online (Sandbox Code Playgroud)
在这个公式中:
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
Run Code Online (Sandbox Code Playgroud)
返回最后一个非空行号,indirect() 返回单元格值。
| 归档时间: |
|
| 查看次数: |
343856 次 |
| 最近记录: |