excel - 找到单元格 block 中最后使用的单元格

标签 excel excel-formula

我需要一个公式来定位 block 中最后使用的单元格。上次使用的单元格我的意思是:

  1. 找到包含非空数据的最后一列(最右侧)
  2. 找到该列中包含非空数据的最低单元格
  3. 返回该单元格的地址

例如,在B2:I16 block 中:

Spreadsheet

该函数应返回:I15,而不是D16。我已经有一个正在尝试替换的 VBA UDF:

Public Function FindLast(r As Range) As String
    Dim nLastRow As Long, nLastColumn As Long
    Dim nFirstRow As Long, nFirstColumn As Long
    Dim i As Long, j As Long

    nLastRow = r.Rows.Count + r.Row - 1
    nLastColumn = r.Columns.Count + r.Column - 1
    nFirstRow = r.Row
    nFirstColumn = r.Column

    For i = nLastColumn To nFirstColumn Step -1
        For j = nLastRow To nFirstRow Step -1
            If Len(r(j, i)) > 0 Then
                FindLast = r(j, i).Address(0, 0)
                Exit Function
            End If
        Next j
    Next i
End Function

因为工作表必须在无宏的环境中工作。

最佳答案

这个{数组公式}有效:

=ADDRESS(MAX(ROW(L1:P5)*(LEN(L1:P5)>0)*(COLUMN(L1:P5)=
   MAX(COLUMN(L1:P5)*(LEN(L1:P5)>0)))),
   MAX(COLUMN(L1:P5)*(LEN(L1:P5)>0)), 4)

Ctrl + Shift + Enter

显然第二项捕获了正确的列(这是简单的部分)。第一项包含第二项,以便在该列中搜索最后填充的行。

在下图中,它应用于范围 L1:P5 并产生了正确的结果 O4

enter image description here

到目前为止,我发现的唯一缺点是,如果范围包含错误单元格,则会出错,但从读取 OP 的 UDF 来看,这似乎不是问题。如果确实如此,一些额外的 IFERROR 将解决它:

=ADDRESS(MAX(ROW(L1:P5)*IFERROR(LEN(L1:P5)>0, 0)*(COLUMN(L1:P5)=
  MAX(COLUMN(L1:P5)*IFERROR(LEN(L1:P5)>0,0)))),
  MAX(COLUMN(L1:P5)*IFERROR(LEN(L1:P5)>0, 0)), 4)

Ctrl + Shift + Enter

编辑:ADDRESS函数添加了参数4,以从结果中删除$。我修改了用 r.Parent.Cells(j, i) 替换 r(j, i) 后,测试结果与 OP 的 UDF 相匹配。

关于excel - 找到单元格 block 中最后使用的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44467110/

相关文章:

excel - 将匹配限制为三个而不是无限

java - Java 程序将日期转换为序列号,就像在 Excel 中一样

PHP MySQL Excel 到 xls?

vba - 如何检查单元格是否包含有效的 IPv6 地址?

excel - 如果单元格编号 123456 包含 1 如果不为空,则将 x 放入单元格中

excel-formula - Excel 公式 -> 如何更改 SUMPRODUCT 公式以跳过空单元格

excel - Excel 2019 是否有类似索引匹配或 vlookup 的功能来查找添加交叉表的行中的值?

Excel PowerPivot DAX 计算字段

javascript - 单元格最后修改日期的函数

Excel – 多列,不同的组合