首页 文章

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

提问于
浏览
98

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

23 回答

  • 7

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

    It needs to be array-entered ,这意味着您输入或粘贴了它 . 以下是A列:

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

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

  • -1

    一个适合我的简单:

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

    使用以下简单公式 is much faster

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

    对于Excel 2003:

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

    It gives you following advantages:

    • 这是 not array 公式

    • 这是 not volatile 公式

    Explanation:

    • (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 )返回相应的值 .

    Also little note - 上面的公式没有考虑有错误的单元格(只有当最后一个非空单元格有错误时才能看到它) . 如果您想将它们考虑在内,请使用:

    =LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
    

    下图显示了差异:

    enter image description here

  • 10

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

  • 13

    受到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中的工作方式,我们可以满足于进行数组操作的需要,但我们不使用数组公式 . 我希望有人能像我一样欣赏这些提出的副产品解决方案的美观,简洁和优雅 . 但我并没有证明上述解决方案的内存效率 . 只是他们很简单,看起来很漂亮,有助于预期的目的,并且足够灵活,可以将其用途扩展到其他目的:)

    希望这可以帮助!

    祝一切顺利!

  • 0

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

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

    请注意,Excel 2003是unable将数组公式应用于整个列 . 这样做会产生 #NUM! ;可能会出现不可预知的结果! (EDIT :来自Microsoft的冲突信息:与Excel 2007相同的maymay not;问题may已于2010年修复. )

    这就是为什么我将数组公式应用于范围 A1:A65535 并对最后一个单元格进行特殊处理,这在Excel 2003中是 A65536 . 不能只说 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)) .

  • 0

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

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

  • 23

    好的,所以我和提问者有同样的问题,并尝试了两个最佳答案 . 但只得到公式错误 . 原来我需要将“,”换成“;”使公式起作用 . 我正在使用XL 2007 .

    例:

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

    要么

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

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

    ="v"&MAX(A2:A500)
    
  • 2

    没有数组公式的替代解决方案,可能 more robust ,而不是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 .

    更喜欢非阵列公式的可能原因如下:

    • An official Microsoft page(寻找"Disadvantages of using array formulas") .
      数组公式看起来很神奇,但它们也有一些缺点:

    • 您可能偶尔忘记按CTRL SHIFT ENTER . 每当您输入或编辑数组公式时,请记住按此组合键 .

    • 其他用户可能无法理解您的公式 . 数组公式相对没有文档,因此如果其他人需要修改您的工作簿,您应该避免使用数组公式或确保这些用户了解如何更改它们 .

    • 根据计算机的处理速度和内存,大型数组公式可能会降低计算速度 .

    • Array Formula Heresy .

  • 0

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

  • -3

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

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

  • 117

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

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

    @JulianKroné..使用“;”而不是“,”不起作用!我觉得你在使用Libre Office而不是MS excel? LOOKUP非常令人讨厌,我只把它作为最后的手段

  • 2

    将此代码放在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) .

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

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

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

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

    14是要计算的行中第一行的行号 .

    慢性Clawtooth

  • 67

    我用了HLOOKUP

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

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

    这使用标准的hlookup公式,其中查找数组由条目数定义 .

  • 1

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

    =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

    这个公式与我合作办公室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将找到最后一个数字单元格 . 如果第一个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,因为这是一个数组公式 .

相关问题