列中最后一个非空单元格

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

404608 次浏览

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

它需要用数组输入 ,这意味着您需要键入或粘贴 按 Ctrl-Shift-Enter。A 栏如下:

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

这可以在 Excel2003中使用(稍后稍作修改,见下文)。按 Ctrl + Shift + Enter (不仅仅是 Enter)输入数组公式。

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

请注意,Excel2003是 不能,用于将数组公式应用于整个列。这样做的结果是 #NUM!; 可能会出现不可预测的结果!来自 Microsoft 的相互冲突的信息: 关于 Excel2007,同样的 也许不会是正确的; 问题 已经在2010年得到修复。)

这就是为什么我将数组公式应用于范围 A1:A65535,并对最后一个单元格进行特殊处理,即 Excel2003中的 A65536。不能只说 A:A或甚至 A1:A65536,因为后者会自动恢复为 A:A

如果你完全确定 A65536是空白的,那么你可以跳过 IF部分:

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

请注意,如果使用的是 Excel2007或2010,则最后一行编号为1048576,而不是65536,因此可以适当调整以上内容。

如果您的数据中间没有空白单元格,那么我将使用更简单的公式 =INDEX(A:A,COUNTA(A:A))

还有一个选择: =OFFSET($A$1;COUNTA(A:A)-1;0)

将此代码放在 VBA 模块中。

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

受到 Doug Glancy 答案的启发,我想出了一个不需要数组公式就可以做同样事情的方法。不要问我为什么,但我热衷于尽可能避免使用数组公式(不是出于任何特殊原因,这只是我的风格)。

这就是:

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

用于查找使用列 A 作为引用列的最后一个非空行

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

用于查找使用第1行作为引用行的最后一个非空列

这可以进一步与索引函数结合使用,以有效地定义动态命名范围,但这是另一个职位的东西,因为这与本文讨论的直接问题无关。

我已经用 Excel2010测试了上面的方法,包括“原生的”和“兼容模式”(针对较老版本的 Excel) ,它们都可以工作。同样,使用这些命令,您不需要执行任何 Ctrl + Shift + Enter 命令。通过利用 sumproduct 在 Excel 中的工作方式,我们可以理解进行数组操作的必要性,但是我们没有使用数组公式。我希望有人能像我一样欣赏这些提议的总结解决方案的美丽、简洁和优雅。不过,我不能证明上述解决方案的记忆效率。只要它们简单、漂亮、有助于实现预期目的,并且足够灵活,可以将其用于其他用途:)

希望这个能帮上忙!

一切顺利!

没有数组公式(可能是 更有活力而不是 之前的一个答案,有一个没有数组公式的(提示)解)的另一种解决方案是

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

这个答案为例。 向帮助解决 这个问题布拉德Barry Houdini致敬。

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

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

    • 您可能偶尔会忘记按 Ctrl + Shift + Enter。记住,在输入或编辑数组公式时,请按此组合键。
    • 其他用户可能不理解您的公式。数组公式相对来说没有文档记录,所以如果其他人需要修改您的工作簿,您应该避免使用数组公式,或者确保这些用户了解如何更改它们。
    • 根据计算机的处理速度和内存,大型数组公式可能会降低计算速度。
  2. 阵列公式异端邪说。

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

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

使用以下简单公式 更快

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

Excel2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

它具有以下优点:

  • 这是 不是数组配方
  • 这是 不会反复无常配方

说明:

  • 返回数组 {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")将此数组修改为 {1,1,..,#DIV/0!,..}
  • 由于 LOOKUP期望 解决了数组按 LOOKUP0顺序排列,并且考虑到如果 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

我用了 HLOOKUP

A1有一个日期; A2:A8有不同时期的天气预报,我要最新的

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

这使用一个标准查找公式,查找数组由条目数量定义。

文字资料:

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

数值资料:

EQUIV(0;A1:A10;-1)

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

如果你想得到这个值,在构建绝对单元格引用之后通过 INDIRECT 访问它,例如:

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

取自 给你=INDEX(A:A, COUNTA(A:A), 1)

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

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

好吧,我和提问者有同样的问题,并且尝试了两个最佳答案。但只能得到公式错误。结果我需要把“ ,”换成“ ;”,这样公式才能正常工作。我正在使用 XL 2007。

例如:

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

或者

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

我也有同样的问题。这个公式也同样有效:-

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

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

慢性爪牙综合症

对于版本跟踪(将字母 v 添加到数字的开头) ,我发现这个在 Xcelius (SAP 仪表板)中工作得很好

="v"&MAX(A2:A500)

如果你知道中间不会有空的单元格,最快的方法是这样的。

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

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

它也可以用于特定的范围。

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

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

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

  • LOOKUP、 VLOOKUP 和 HLOOKUP 都有性能问题,真的不应该使用。

  • 数组函数有很多开销,而且还可能存在性能问题,因此只能作为最后的手段使用。

  • 如果数据不是连续的非空白数据,那么 COUNT 和 COUNTA 就会遇到问题,也就是说,在有问题的范围内有空格,然后又有数据

  • INDIRECT 是不稳定的,因此只能作为最后的手段使用

  • OffSET 是不稳定的,因此只能作为最后的手段使用

  • 对最后一行或列的任何引用(例如 Excel2003中的第65536行)都是不健壮的,并导致额外的开销

我就用这个

  • 当数据类型混合时: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • 当已知数据只包含数字时: =MATCH(1E+306,[RANGE],1)

  • 当已知数据只包含文本时: =MATCH("*",[RANGE],-1)

MATCH 具有最低的开销,并且是非易失性的,因此如果要处理大量数据,这是最好的选择。

用于 MicrosoftOffice2013

非空行的“最后但是一个”:

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

“ Last”非空行:

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

我尝试了所有的非易失性版本,但没有一个版本给出了以上工作。.Excel 2003/2007更新。当然,这可以在 Excel 2003中完成。不作为数组或标准公式。 我要么得到一个空白,0或 # 值错误。 所以我采取了反复无常的方法. . 这很有效. 。

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

@ Julian Kroné..使用“ ;”代替“ ,”不起作用!我想你使用的是自由办公而不是微软的卓越? 查找是如此令人讨厌的不稳定,我使用它作为最后的手段

2010年,这个公式在我的办公室里奏效了:

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

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

我认为 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”返回整个值数组(除了一个值外,其他值都不需要)。我仍倾向于将单元格寻址为其中的 index 函数,换句话说,返回单元格值的方法是:

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

好线!

如果你不害怕使用数组,那么下面是一个非常简单的公式来解决这个问题:

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

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

如在(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))))

返回最后一个非空白行号,间接()返回单元格值。

INDEX 根据数组中的索引位置返回一个值,然后使用 ROWS 指定数组的最后一个位置。

=LET(array,A1:A10,INDEX(array,ROWS(array)))

在将 INDEX 的参数[ column _ num ]设置为0时,也可用于多列:

=LET(array,A1:C10,INDEX(array,ROWS(array),0))