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

Mic*_*elS 108 excel worksheet-function

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

Dmi*_*liv 125

使用以下简单公式要快得多

=LOOKUP(2,1/(A:A<>""),A:A)
Run Code Online (Sandbox Code Playgroud)

对于Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
Run Code Online (Sandbox Code Playgroud)

它具有以下优点:

  • 不是数组公式
  • 不是挥发性配方

说明:

  • (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)
Run Code Online (Sandbox Code Playgroud)

下图显示了差异:

在此输入图像描述

  • 1) 可选并不意味着不必要,如果省略它,查找将从 `1/(A:A&lt;&gt;"")` 返回值(除了空列 A 之外始终为 `1`)。2) `A:A&lt;&gt;""` 返回布尔数组,但你需要数字数组 - `=LOOKUP(2,1*(A:A&lt;&gt;""),A:A)`,但它也不起作用如您所愿 - 查找始终依赖于数组已排序的事实。由于最后一个元素始终小于查找值,因此查看数组的其余部分是没有意义的,查找只是返回它(或 _result_vector_ 中的相应值)。因此,`=LOOKUP(2,1*(A1:A10&lt;&gt;""),A1:A10)`总是从`A10`返回值(如果不是错误的话)。 (2认同)

Dou*_*ncy 74

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

它需要进行数组输入,这意味着键入或粘贴后按Ctrl-Shft-Enter.以下是A列:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Run Code Online (Sandbox Code Playgroud)

  • 这在Excel 2003中不起作用; 在我的回答中看到解释. (3认同)
  • @DontFretBrett,请务必按照答案中的指定使用Ctrl-Shift-Enter输入数组公式. (2认同)
  • 重要的区别是,这个返回一个单元格引用(因此它可以传递给例如`CELL()`或`OFFSET()`),而[投票较多的一个](http://stackoverflow.com/a/ 22192270/11683) 返回一个值,但不告诉您它在哪里。 (2认同)
  • `=INDEX($C:$C,SUMPRODUCT(MAX(($C:$C&lt;&gt;"")*(ROW($C:$C)))))` ...使用 SUMPRODUCT 因此不需要作为数组公式输入 (2认同)

Pat*_*rez 24

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

  • 如果存在具有非数值的单元格(使用`COUNTA`而不是`COUNT`),这将不起作用.更不用说空白细胞了. (9认同)
  • 它不应该在顶部,因为当结果嵌入空白时它是错误的. (9认同)
  • 这应该在顶部.它很简单,不依赖于不常见功能的模糊细节. (3认同)
  • 谢谢,这很有效.但不得不将`;`改为`,` (2认同)

小智 16

受到Doug Glancy的回答所带来的伟大领导的启发,我提出了一种方法来做同样的事情,而不需要数组公式.不要问我为什么,但我很想避免使用数组公式,如果可能的话(不是出于任何特殊原因,这只是我的风格).

这里是:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
Run Code Online (Sandbox Code Playgroud)

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

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
Run Code Online (Sandbox Code Playgroud)

使用第1行作为参考行查找最后一个非空列

这可以与索引函数结合使用以有效地定义动态命名范围,但这是另一个帖子的内容,因为这与本文所述的直接问题无关.

我已经使用Excel 2010测试了上述方法,包括"本机"和"兼容模式"(对于旧版本的Excel),它们都有效.再次,使用这些,您不需要执行任何Ctrl + Shift + Enter.通过利用sumproduct在Excel中的工作方式,我们可以满足于进行数组操作的需要,但我们没有使用数组公式.我希望有人能像我一样欣赏这些提出的副产品解决方案的美观,简洁和优雅.但我并没有证明上述解决方案的内存效率.只是它们很简单,看起来漂亮,有助于预期的目的,并且足够灵活,可以将其用途扩展到其他目的:)

希望这可以帮助!

祝一切顺利!


W5A*_*IVE 13

我知道这个问题已经过时了,但我对提供的答案并不满意.

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

  • 这是一个很好的答案(+1),但是该方法仍然存在一些漏洞。例如,如果存在具有逻辑值(“TRUE”/“FALSE”)的单元格,它们将不会被检测到。尽管这个答案并不是万无一失的,但我仍然认为这个答案对性能的影响最小。 (2认同)
  • Match返回一个索引,而不是单元格的值。您可以使用索引函数来获取值。另外,您可能应该包括有关[RANGE]的内容。我使用“ N:N”选择了整个列。这是一个对我有用的示例:`= INDEX(N:N,MATCH(1E + 306,N:N,1))` (2认同)

Jea*_*ett 10

这适用于Excel 2003(稍后进行次要编辑,见下文).按Ctrl + Shift + Enter(而不仅是Enter)将其作为数组公式输入.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
Run Code Online (Sandbox Code Playgroud)

请注意,Excel 2003 无法将数组公式应用于整个列.这样做会产生#NUM!; 可能会出现不可预知的结果!(编辑:从微软相互矛盾的信息:相同的5月可能不会是关于Excel 2007中真实的;问题可能已修复2010年)

这就是为什么我将数组公式应用于范围A1:A65535并对A65536Excel 2003中的最后一个单元格进行特殊处理.不能只说A:AA1:A65536后者自动恢复A:A.

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

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的是Excel 2007或2010,则最后一行编号为1048576而不是65536,因此请根据需要调整上述行.

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


san*_*ica 8

没有数组公式的替代解决方案,可能比使用没有数组公式的(提示)解决方案的先前答案更强大,

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
Run Code Online (Sandbox Code Playgroud)

这个答案作为一个例子.感谢布拉德巴里· 胡迪尼,他们帮助解决了这个问题.

偏好非阵列公式的可能原因如下:

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

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


Sha*_*tfi 6

如果您在列 (A) 中搜索,请使用:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
Run Code Online (Sandbox Code Playgroud)

如果您的范围是 A1:A10,您可以使用:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
Run Code Online (Sandbox Code Playgroud)

在这个公式中:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
Run Code Online (Sandbox Code Playgroud)

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