我需要一个公式来定位 block 中最后使用的单元格。上次使用的单元格我的意思是:
- 找到包含非空数据的最后一列(最右侧)
- 找到该列中包含非空数据的最低单元格
- 返回该单元格的地址
例如,在B2:I16 block 中:
该函数应返回: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
。
到目前为止,我发现的唯一缺点是,如果范围包含错误单元格,则会出错,但从读取 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/