有没有人知道在Microsoft Excel中查找列中最后一个非空单元格值的公式?
答案 0 :(得分:121)
使用以下简单公式更快
=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)
下面的图片显示了差异:
答案 1 :(得分:72)
这适用于文本和数字,并不关心是否有空格,即它将返回最后一个非空格。
需要输入数组,这意味着在后按Ctrl-Shft-Enter键入或粘贴它。以下是A列:< / p>
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
答案 2 :(得分:24)
这是另一种选择:=OFFSET($A$1;COUNTA(A:A)-1;0)
答案 3 :(得分:15)
受到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中的工作方式,我们可以满足于进行数组操作的需要,但我们没有使用数组公式。我希望有人能像我一样欣赏这些提出的副产品解决方案的美观,简洁和优雅。但我并没有证明上述解决方案的内存效率。只是它们很简单,看起来漂亮,有助于预期的目的,并且足够灵活,可以将其用途扩展到其他目的:)
希望这有帮助!
一切顺利!
答案 4 :(得分:10)
这适用于Excel 2003(以及稍后编辑,见下文)。按Ctrl + Shift + Enter(而不仅是Enter)将其作为数组公式输入。
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
请注意Excel 2003是unable将数组公式应用于整个列。这样做会产生#NUM!
;可能会出现不可预知的结果! (编辑:来自Microsoft的冲突信息:关于Excel 2007的may或may not是正确的;问题may已于2010年修复。)
这就是我将数组公式应用于范围A1:A65535
并对最后一个单元格进行特殊处理的原因,即Excel 2003中的A65536
。不能只说A:A
甚至{{ {1}}后者会自动恢复为A1:A65536
。
如果您完全确定A:A
为空,那么您可以跳过A65536
部分:
IF
请注意,如果您使用的是Excel 2007或2010,则最后一行编号为1048576而不是65536,因此请根据需要调整上述行。
如果数据中间没有空白单元格,那么我只想使用更简单的公式=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
。
答案 5 :(得分:10)
我知道这个问题已经过时了,但我对提供的答案并不满意。
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具有最低的开销并且是非易失性的,因此如果您处理大量数据,则最好使用它。
答案 6 :(得分:7)
没有数组公式的替代解决方案,可能更强大,而不是a previous answer with a (hint to a) solution without array formulas,
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
以this answer为例。 感谢Brad和barry houdini,他们帮助解决了this question。
优先选择非数组公式的可能原因如下:
An official Microsoft page(寻找“使用数组公式的缺点”)。
数组公式看起来很神奇,但它们也有一些缺点:
答案 7 :(得分:3)
如果您在(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()返回单元格值。
答案 8 :(得分:2)
=INDEX(A:A, COUNTA(A:A), 1)
取自here
答案 9 :(得分:2)
=MATCH("*";A1:A10;-1)
用于文本数据
=MATCH(0;A1:A10;-1)
答案 10 :(得分:1)
我尝试了所有非易失性版本,但上面给出的一个版本没有工作.. excel 2003 / 2007update。当然,这可以在excel 2003中完成。不是数组也不是标准公式。 我要么只得到一个空白,0或#value错误。 所以我诉诸于易变的方法..这有效..
= LOOKUP(2,1 /(T4:T369&LT;&gt; “中”),T4:T369)
@JulianKroné..使用“;”而不是“,”不起作用!我认为你使用自由办公室而不是MS excel? LOOKUP非常令人讨厌,我只把它作为最后的手段使用
答案 11 :(得分:0)
我使用了HLOOKUP
A1
有约会;
A2:A8
在不同时间捕获了预测,我想要最新的
=Hlookup(a1,a1:a8,count(a2:a8)+1)
这使用标准的hlookup公式,其中查找数组由条目数定义。
答案 12 :(得分:0)
用于文本数据:
EQUIV("";A1:A10;-1)
表示数字数据:
EQUIV(0;A1:A10;-1)
这将为您提供所选范围内最后一个非空单元格的相对索引(此处为A1:A10)。
如果要获取值,请在构建 - 文本 - 绝对单元格引用后通过INDIRECT访问它,例如:
INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
答案 13 :(得分:0)
我也有同样的问题。这个公式也同样有效: -
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14是您要计算的行中第一行的行号。
慢性Clawtooth
答案 14 :(得分:0)
如果您知道中间不会有空单元格,那么最快的方法就是这样。
=INDIRECT("O"&(COUNT(O:O,"<>""")))
它只计算非空细胞并指向适当的细胞。
它也可以用于特定范围。
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
这将返回O4:O34范围内的最后一个非空单元格。
答案 15 :(得分:0)
对于Microsoft Office 2013
非空行的“最后但只有一行”:
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)
“最后”非空行:
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
答案 16 :(得分:0)
这个公式适合我办公室2010年:
= LOOKUP(2; 1 /(A1:A100&LT;&GT;&#34;&#34); A1:A100)
A1:第一个细胞 A100:参考比较中的最后一个单元格
答案 17 :(得分:0)
我认为W5ALIVE的响应最接近于我用来查找列中最后一行数据的响应。假设我正在寻找A列中数据的最后一行,我会使用以下内容进行更通用的查找:
=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))
第一个MATCH将找到最后一个文本单元格,第二个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))
伟大的线程!
答案 18 :(得分:0)
如果您不害怕使用数组,那么以下是解决问题的非常简单的公式:
= SUM(IF(A:A <>“”,1,0))
您必须按CTRL + SHIFT + ENTER,因为这是一个数组公式。
答案 19 :(得分:0)
将此代码放在VBA模块中。保存。在功能下,用户定义查找此功能。
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
答案 20 :(得分:-1)
Okay, so I had the same issue as the asker, and tried both top answers. But only getting formula errors. Turned out that I needed to exchange the "," to ";" for the formulas to work. I am using XL 2007.
Example:
=LOOKUP(2;1/(A:A<>"");A:A)
or
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
答案 21 :(得分:-1)
一个适合我的简单:
=F7-INDEX(A:A,COUNT(A:A))
答案 22 :(得分:-3)
对于版本跟踪(将字母v添加到数字的开头),我发现这个在Xcelsius(SAP Dashboards)中运行良好
="v"&MAX(A2:A500)