获取 Excel 中一列的最后一行,无需 VBA

Vit*_*ata 2 excel vba excel-formula

通常,使用 VBA 中的用户定义函数可以轻松获取 Excel 中给定列的最后一行:

Function lastRow(wsName As String, Optional columnToCheck As Long = 1) As Long
    Dim ws As Worksheet
    Set ws = Worksheets(wsName)
    lastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row
End Function
Run Code Online (Sandbox Code Playgroud)

对于最后一行,到目前为止我发现了两个 excel 公式:

  • =SUMPRODUCT(MAX((A:A<>"")*ROW(A:A)))
  • =MAX(IFERROR(MATCH(E1+99,A:A),0),IFERROR(MATCH("zzz",A:A),0))

他们的问题是第一个不起作用,如果范围中有错误,第二个不返回真正的最后一行,如果是错误,而是最后一个非错误行,因此返回 6 而不是7:

在此处输入图片说明

问题是如何获得返回 7 的公式,因为这是 A 列中使用的最后一行?虽然,这是一个错误。没有VBA。

Pᴇʜ*_*Pᴇʜ 6

这个(没有数组公式)

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),ROW(A:A)) 
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

  1. NOT(ISBLANK(A:A))返回一个True和的数组False
  2. 1/(NOT(ISBLANK(A:A)))然后 1 除以该数组导致另一个数组1or#DIV/0!用作lookup_vector
  3. 我们使用2as lookup_valuewhich cannot be found 因为 the 中的最大值lookup_array是 is 1,所以查找将匹配1数组中的最后一个。
  4. 就像result_vector我们ROW(A:A)用来获取最后使用的单元格的行号一样
    (或者A:A用来获取值而不是行号)。

  • 甚至`=IFERROR(LOOKUP(2,1/(NOT(ISBLANK(A:A))),ROW(A:A)),0)`,让它在没有值的情况下工作:) (2认同)