Answers:
这适用于文本和数字,并且不关心是否有空白单元格,即它将返回最后一个非空白单元格。
它需要输入数组,这意味着您键入或粘贴后按Ctrl-Shift-Enter。下面是A列:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
使用以下简单公式会更快
=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!,..}
)小于或等于该值(在我们的情况下2
)的最大值,公式1
在数组中查找最后一个,并从result_range
(第三个参数- A:A
)返回相应的值。还要注意一点 -上面的公式没有考虑到有错误的单元格(只有在最后一个非空单元格有错误的情况下,您才能看到它)。如果要考虑它们,请使用:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
下图显示了区别:
LOOKUP
指出最后一个参数result_vector
是可选的。但是,如果我忽略它,将会得到一个非常奇怪的结果,我无法理解。
LOOKUP
函数找不到lookup_value
,则函数匹配的最大值lookup_vector
小于或等于lookup_value.
”。如果我=LOOKUP(2,A:A<>"",A:A)
不使用生成#DIV/0!
错误而使用1/...
,则似乎在中间返回了某个值向量。在这种情况下,我还没有找到确切的功能。
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
但添加ROW
函数将添加“易失性”效果-每次在工作单上的任何单元格更改时都会重新计算公式
这是另一种选择: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
代替COUNT
),则此方法将无效。更不用说空白单元格了。
受到道格·格兰西(Doug Glancy)的回答的启发,我想到了一种无需阵列公式即可完成相同操作的方法。不要问我为什么,但是我渴望尽可能避免使用数组公式(不是出于任何特殊原因,这只是我的风格)。
这里是:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
使用列A作为参考列查找最后一个非空行
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
使用第1行作为参考行查找最后一个非空列
这可以与索引函数一起进一步使用,以有效地定义动态命名范围,但这是另一篇文章,因为这与此处解决的紧迫问题无关。
我已经在Excel 2010中“本机”和“兼容模式”(对于Excel的较早版本)中测试了上述方法,并且它们都可以工作。同样,使用这些您不需要执行任何Ctrl + Shift + Enter。通过利用sumproduct在Excel中的工作方式,我们可以满足进行数组运算的需要,但我们无需使用数组公式。我希望外面的人能像我一样欣赏这些提议的sumproduct解决方案的美丽,简单和优雅。我没有证明上述解决方案的内存效率。只是它们简单,美观,可以达到预期目的并且足够灵活,可以将其扩展到其他用途:)
希望这可以帮助!
祝一切顺利!
我知道这个问题很旧,但是我对提供的答案不满意。
LOOKUP,VLOOKUP和HLOOKUP存在性能问题,因此切勿使用。
数组函数有很多开销,并且还可能存在性能问题,因此仅应将其用作最后的选择。
如果数据不是连续的非空白,则COUNT和COUNTA会出现问题,即您有空格,然后再次在所讨论的范围内进行数据
INDIRECT是易变的,因此只能用作最后的手段
偏移量是易失的,因此只能用作最后的手段
对最后一行或最后一行的任何引用(例如,Excel 2003中的第65536行)都不可靠,并且会导致额外的开销
这就是我用的
当数据类型混合时: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
当已知数据仅包含数字时: =MATCH(1E+306,[RANGE],1)
当已知数据仅包含文本时: =MATCH("*",[RANGE],-1)
MATCH具有最低的开销,并且是非易失性的,因此,如果要处理大量数据,则最好使用。
TRUE
/ FALSE
)的单元格,则将无法检测到它们。尽管该答案并非绝对可靠,但我仍然认为此答案对性能的影响最小。
=INDEX(N:N,MATCH(1E+306,N:N,1))
这在Excel 2003中有效(&稍后进行较小的编辑,请参见下文)。按Ctrl + Shift + Enter(不仅仅是Enter)可以将其作为数组公式输入。
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
请注意,Excel 2003 无法将数组公式应用于整个列。这样做产生了#NUM!
; 可能会发生不可预测的结果!(编辑:从微软相互矛盾的信息:相同的5月或可能不会是关于Excel 2007中真实的;问题可能已修复2010年)
这就是为什么我将数组公式应用于range A1:A65535
并对A65536
Excel 2003中的最后一个单元格给予特殊处理的原因。不能说A:A
,甚至A1:A65536
后者会自动恢复为A:A
。
如果您绝对确定A65536
为空白,则可以跳过以下IF
部分:
=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
请注意,如果您使用的是Excel 2007或2010,则最后一行是1048576而不是65536,因此请适当调整上面的行。
如果您的数据中间没有空白单元格,那么我将使用更简单的公式, =INDEX(A:A,COUNTA(A:A))
。
=INDEX(19:19,COUNTA(19:19))
一个没有数组公式的替代解决方案,可能比以前的没有数组公式的提示更健壮,是
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
请参阅此答案作为示例。感谢Brad和Barry houdini,他们帮助解决了这个问题。
首选非数组公式的可能原因如下:
Microsoft的官方页面(查找“使用数组公式的缺点”)。
数组公式看似神奇,但它们也有一些缺点:
A
出现的内容D
。我究竟做错了什么?
如果您在(A)栏中搜索,请使用:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
如果您的范围是A1:A10,则可以使用:
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
在这个公式中:
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
返回最后一个非空白行号,indirect()返回单元格值。
=INDEX(A:A, COUNTA(A:A), 1)
从这里取
=MATCH("*";A1:A10;-1)
用于文本数据
=MATCH(0;A1:A10;-1)
用于数值数据
将此代码放在VBA模块中。保存。在功能下,用户定义的将查找此功能。
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
如果您知道两者之间不会有空单元格,那么最快的方法就是这样。
=INDIRECT("O"&(COUNT(O:O,"<>""")))
它只计算非空单元格,并引用适当的单元格。
它也可以用于特定范围。
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
这将返回O4:O34范围内的最后一个非空单元格。
我认为W5ALIVE的响应与我用来查找列中最后一行数据的响应最接近。但是,假设我要在列A中查找包含数据的最后一行,那么我将使用以下内容进行更通用的查找:
=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))
第一个MATCH将找到最后一个文本单元格,第二个MATCH将找到最后一个数字单元格。如果第一个匹配找到所有数字单元格,或者第二个匹配找到所有文本单元格,则IFERROR函数返回零。
基本上,这是W5ALIVE的混合文本和数字解决方案的细微变化。
在测试时序时,这比等效的LOOKUP版本快得多。
要返回最后一个单元格的实际值,我更喜欢使用间接单元格引用,如下所示:
=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))
sancho.s提供的方法也许是一种更干净的选择,但是我将修改找到行号的部分:
=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)
唯一的区别是“,1”返回第一个值,而“,0”返回整个值数组(除了一个,就不需要所有)。我仍然倾向于将单元格寻址到索引函数,换句话说,使用以下命令返回单元格值:
=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))
好线程!
好吧,所以我有一个与问问者相同的问题,并尝试了两个最佳答案。但是只会出现公式错误。原来我需要将“,”换成“;” 使公式起作用。我正在使用XL 2007。
例:
=LOOKUP(2;1/(A:A<>"");A:A)
要么
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))