列中的最后一个非空单元格

时间:2011-03-26 11:05:41

标签: excel worksheet-function

有没有人知道在Microsoft Excel中查找列中最后一个非空单元格值的公式?

23 个答案:

答案 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)
下面的图片显示了差异:

enter image description here

答案 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的maymay 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为例。 感谢Bradbarry houdini,他们帮助解决了this question

优先选择非数组公式的可能原因如下:

  1. An official Microsoft page(寻找“使用数组公式的缺点”)。
    数组公式看起来很神奇,但它们也有一些缺点:

    • 您可能偶尔会忘记按CTRL + SHIFT + ENTER。每当您输入或编辑数组公式时,请记住按此组合键。
    • 其他用户可能无法理解您的公式。数组公式相对没有文档,因此如果其他人需要修改您的工作簿,您应该避免使用数组公式或确保这些用户了解如何更改它们。
    • 根据计算机的处理速度和内存,大型数组公式可能会降低计算速度。
  2. Array Formula Heresy

答案 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)