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


Answers:


76

这适用于文本和数字,并且不关心是否有空白单元格,即它将返回最后一个非空白单元格。

它需要输入数组,这意味着您键入或粘贴后按Ctrl-Shift-Enter。下面是A列:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))

@让-弗朗索瓦(Jean-François),对不起,我昨晚在评论中承认这一点,但误将其放在原始帖子中。它确实可以在XL 2​​007和2010中使用。谢谢。
Doug Glancy

在Excel 2007中不适用于我。我粘贴了确切的公式。我有一列(A),其值一直= ROW()一直下降到127ish,并且该公式返回“ 1”
DontFretBrett

2
@DontFretBrett,请确保使用答案中指定的Ctrl-Shift-Enter将其作为数组公式输入。
Doug Glancy

@DougGlancy在我这方面失败了。谢谢!
DontFretBrett

1
重要的区别在于,该函数返回一个单元格引用(因此可以将其传递给eg CELL()OFFSET()),而功能更强大的函数则返回一个值,而无需告诉您它在哪里。
Gserg '17

128

使用以下简单公式会更快

=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.文档LOOKUP指出最后一个参数result_vector是可选的。但是,如果我忽略它,将会得到一个非常奇怪的结果,我无法理解。
Honza Zidek 2014年

2.文档说:“如果LOOKUP函数找不到lookup_value,则函数匹配的最大值lookup_vector小于或等于lookup_value.”。如果我=LOOKUP(2,A:A<>"",A:A)不使用生成#DIV/0!错误而使用1/...,则似乎在中间返回了某个值向量。在这种情况下,我还没有找到确切的功能。
Honza Zidek 2014年

1
很好的解释。通过将公式从数组公式移动到非数组版本,最近节省了几分钟的计算时间,我一直在寻求不需要数组公式的逻辑。
tobriand 2014年

1
@Enissay,是的,此函数将返回行号,=LOOKUP(2,1/(A:A<>""),ROW(A:A))但添加ROW函数将添加“易失性”效果-每次在工作单上的任何单元格更改时都会重新计算公式
Dmitry Pavliv

1
嘿。感谢您发布此信息。很好奇,我在exceljet.net/formula/get-value-of-last-non-empty-cell中找到了完全相同的公式和几乎相同的措词。还是您还是其他人?没有明显的联系。
所罗门·鲁兹基


17

受到道格·格兰西(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解决方案的美丽,简单和优雅。我没有证明上述解决方案的内存效率。只是它们简单,美观,可以达到预期目的并且足够灵活,可以将其扩展到其他用途:)

希望这可以帮助!

祝一切顺利!


1
至于为什么使用非数组公式,请参见下面的答案
sancho.s ReinstateMonicaCellio 2014年

17

我知道这个问题很旧,但是我对提供的答案不满意。

  • 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具有最低的开销,并且是非易失性的,因此,如果要处理大量数据,则最好使用。


这是一个很好的答案(+1),但是此方法仍然存在一些漏洞。例如,如果存在具有逻辑值(TRUE/ FALSE)的单元格,则将无法检测到它们。尽管该答案并非绝对可靠,但我仍然认为此答案对性能的影响最小。
ImaginaryHuman072889'9

2
Match返回一个索引,而不是单元格的值。您可以使用索引函数来获取值。另外,您可能应该包括有关[RANGE]的内容。我使用“ N:N”选择了整个列。这是一个对我=INDEX(N:N,MATCH(1E+306,N:N,1))
有用

10

这在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并对A65536Excel 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))
Serj萨根

8

一个没有数组公式的替代解决方案,可能比以前的没有数组公式的提示更健壮,是

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

请参阅此答案作为示例。感谢BradBarry houdini,他们帮助解决了这个问题

首选非数组公式的可能原因如下:

  1. Microsoft的官方页面(查找“使用数组公式的缺点”)。
    数组公式看似神奇,但它们也有一些缺点:

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


我无法将其与D列配合使用。我用替换了所有A出现的内容D。我究竟做错了什么?
Marc.2377

5

如果您在(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()返回单元格值。



2

=MATCH("*";A1:A10;-1) 用于文本数据

=MATCH(0;A1:A10;-1) 用于数值数据


在您的答案中提供代码段时,请使用代码块。
β.εηοιτ.βε

我认为这些公式将为我们提供第一个非空单元格,而不是最后一个非空单元格。
Baodad

2

香港专业教育学院尝试了所有的非易失性版本,但上面给出的一个版本都没有。.excel 2003 / 2007update。当然,这可以在excel 2003中完成。不能作为数组或标准公式。我要么只是空白,0或#value错误。因此,我诉诸于易变的方法。

= LOOKUP(2,1 /(T4:T369 <>“”),T4:T369)

@JulianKroné..使用“;” 而不是“,”不起作用!我认为您使用的是Libre Office,不是MS excel?LOOKUP非常烦人,我只能将其用作最后的手段


0

将此代码放在VBA模块中。保存。在功能下,用户定义的将查找此功能。

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function

2
这不一定是LAST空白单元格,而只是NEXT空白单元格从顶部开始。
波特兰赛跑者2014年

现在的问题是关于配方,不VBA
帕特里克Honorez

0

对于文本数据:

EQUIV("";A1:A10;-1)

对于数字数据:

EQUIV(0;A1:A10;-1)

这将为您提供所选范围(此处为A1:A10)中最后一个非空单元格的相对索引。

如果要获取该值,请在构建-textually-绝对单元格引用后通过INDIRECT访问它,例如:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))

0

我也有同样的问题。这个公式也同样适用:

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14是要计数的行中第一行的行号。

慢性爪牙


0

我用过HLOOKUP

A1有个约会 A2:A8有在不同时间捕获的预测,我想要最新的

=Hlookup(a1,a1:a8,count(a2:a8)+1)

这将使用标准的hlookup公式,并具有由条目数定义的查找数组。


0

如果您知道两者之间不会有空单元格,那么最快的方法就是这样。

=INDIRECT("O"&(COUNT(O:O,"<>""")))

它只计算非空单元格,并引用适当的单元格。

它也可以用于特定范围。

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

这将返回O4:O34范围内的最后一个非空单元格。


0

对于Microsoft Office 2013

非空行中的“最后一个”:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

“最后”非空行:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)

0

这个公式适用于Office 2010:

= LOOKUP(2; 1 /(A1:A100 <>“”); A1:A100)

A1:第一个单元格A100:参考比较中的最后一个单元格


0

我认为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))

好线程!


0

如果您不害怕使用数组,那么以下是解决问题的非常简单的公式:

= SUM(IF(A:A <>“”,1,0))

您必须按CTRL + SHIFT + ENTER,因为这是一个数组公式。


-1

一个对我有用的简单方法:

=F7-INDEX(A:A,COUNT(A:A))

-1

好吧,所以我有一个与问问者相同的问题,并尝试了两个最佳答案。但是只会出现公式错误。原来我需要将“,”换成“;” 使公式起作用。我正在使用XL 2007。

例:

=LOOKUP(2;1/(A:A<>"");A:A)

要么

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))

-3

对于版本跟踪(将字母v添加到数字的开头),我发现此版本在Xcelsius(SAP仪表板)中运行良好

="v"&MAX(A2:A500)

1
似乎不够笼统,因为它依赖严格的升序。
内森·塔吉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.