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

问题描述 投票:103回答:23

有谁知道公式找到一列中的最后一个非空单元格的值,在Microsoft Excel?

excel worksheet-function
23个回答
72
投票

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

它需要阵列的进入,这意味着你按你输入或粘贴后按Ctrl-Shift键进入下面是A列:

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

2
投票

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

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


1
投票

我用尽所有的非易失性版本,但上面给出的没有一个版本的工作.. Excel 2003中/ 2007update。当然这可以在2003年的Excel进行不作为数组也不标准公式。我要么得到只是一个空白,0或#VALUE错误。所以我诉诸挥发的方法..这个工作..

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

@Julian KRONE ..使用 “;”而不是“”不工作!我认为你正在使用自由报办公室不是MS Excel的?查找是如此烦人volitile我用它作为最后的手段只


0
投票

将这段代码放到一个VBA模块中。救。在功能,用户自定义查找此功能。

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

0
投票

为文本数据:

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

为数值数据:

EQUIV(0;A1:A10;-1)

这给你的最后一个非空单元格的相对指数的选择(这里是A1:A10)的范围内。

如果你想获得的价值,通过间接访问它建立-textually-绝对单元格引用,如后:

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

0
投票

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

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

14是第一行的要算行的行号。

慢性Clawtooth


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
投票

这个公式和我工作了22年事务:

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

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


0
投票

我觉得从W5ALIVE反应是最接近我用来发现数据的最后一排一列。假设我要寻找的最后一行与列的数据,不过,我会用更通用的查找以下内容:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

第一场比赛将找到的最后一个文本单元和第二场比赛找到的最后一个数字单元格。的IFERROR函数返回零如果第一MATCH查找所有数字单元或如果第二匹配查找所有文本细胞。

基本上,这是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))

伟大的线程!


122
投票

使用下面简单的公式更快

=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)

下面示出图像的区别:


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)

24
投票

这是另一种选择:=OFFSET($A$1;COUNTA(A:A)-1;0)


16
投票

由道格Glancy的答案给出的伟大领导的启发,我想出了一个办法,做同样的事情,而不需要一个数组公式。不要问我为什么,但我很希望避免使用数组公式,如果在所有可能的(没有什么特别的原因,它只是我的风格)。

这里是:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

用于找到使用柱A作为基准列中的最后非空行

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

用于找到使用行1作为基准列中的最后非空列

这可以在与索引函数来有效地定义动态命名区域一起进一步利用,但是这是用于因为这是不相关的本文中得到解决立即问题另一篇文章。

我测试过使用Excel 2010上面的方法,无论是“本地”和“兼容模式”(旧版本的Excel)和他们的工作。再次,这些你不需要做任何的按Ctrl + Shift +的输入。通过利用Excel中SUMPRODUCT的工作方式,我们可以得到我们的搂着需要携带阵列的操作,但我们这样做是没有的数组公式。我希望有人在那里可以欣赏这些建议SUMPRODUCT解决方案,我一样的美丽,简单和优雅。我不证实了上述解决方案的存储效率虽然。只是,他们是简单的,看上去很美,有利于预期目的,并具有足够的灵活性,以它们的用途扩展到其他用途:)

希望这可以帮助!

祝一切顺利!


12
投票

我知道这个问题是旧的,但我并不满足于提供的答案。

  • 查找,VLOOKUP和HLOOKUP有性能问题,确实应该永远不会被使用。
  • 阵列功能有很多的开销,也能有性能问题,所以应该只能作为最后的手段。
  • COUNT和COUNTA遇到问题,如果该数据不连续非空白,即你有空格然后重新将数据在有关范围内
  • 间接极易挥发,只应作为最后手段
  • OFFSET是挥发性的,所以应该只能作为最后的手段
  • 到最后一行或一列可能(在第六万五千五百三十六排在Excel 2003,例如)的任何引用不是额外的开销稳健和结果

这是我用什么

  • 当数据类型是混合:=max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
  • 当它知道该数据只包含数字:=MATCH(1E+306,[RANGE],1)
  • 当它知道该数据只包含文本:=MATCH("*",[RANGE],-1)

MATCH具有最低的开销,是非易失性的,所以如果你有大量的数据工作,这是最好的使用。


10
投票

这部作品在Excel 2003中(后来与小修改,见下文)。按下Ctrl + Shift + Enter键(不只是输入)输入此作为数组公式。

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

要知道,Excel 2003中是unable到数组公式应用到整列。这样做的产量#NUM!;可能发生不可预知的结果! (编辑:从微软相互矛盾的信息:同maymay not约Excel 2007中真实; may已修复在2010年的问题)

这就是为什么我申请的数组公式范围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))


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

4
投票

如果你在搜索栏(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))))

返回最后一个非空行数和间接()返回单元格值。


2
投票

=INDEX(A:A, COUNTA(A:A), 1) here

© www.soinside.com 2019 - 2024. All rights reserved.