find单元格块中最后使用的单元格
我需要一个公式来定位块中最后使用的单元格。 上次使用的单元格我的意思是:
- find包含非空数据的最后一列(最右侧)
- find该列中包含非空数据的最低单元格
- 返回该单元格的地址
例如,在块B2:I16 :
该函数应返回: I15而不是D16 。 我已经有一个VBA UDF,我想要replace:
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
由于工作表必须在无macros的环境中工作。
这个{数组公式}工作原理:
=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
显然第二学期捕获正确的列(这是很容易的部分)。 第一个术语包括第二个术语,以便在最后一行填充行中search该列。
在下图中,将其应用在范围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
编辑:添加参数4
到ADDRESS
函数从结果中删除$
。 在我的testing结果匹配OP的UDF后,我修改它replacer(j, i)
与r.Parent.Cells(j, i)
。
这是一个非CSE版本:
=ADDRESS(AGGREGATE(14,6,(ROW(INDEX(L1:P5,0,AGGREGATE(14,6,COLUMN(L1:P5)/(L1:P5<>""),1)-MIN(COLUMN(L1:P5))+1)))/(INDEX(L1:P5,0,AGGREGATE(14,6,COLUMN(L1:P5)/(L1:P5<>""),1)-MIN(COLUMN(L1:P5))+1)<>""),1),AGGREGATE(14,6,COLUMN(L1:P5)/(L1:P5<>""),1))
我的第一个方法类似于@ ScottCraner's。
=ADDRESS(MOD(AGGREGATE(14,6,(ROW(L1:P5)+COLUMN(L1:P5)*10^7)*(L1:P5<>""),1),10^7),AGGREGATE(14,6,COLUMN(L1:P5)*(L1:P5<>""),1),4)
这里第一个AGGREGATE
用来计算最大值:
COL_NUM*10^7+ROW_NUM
非空单元格(乘以10 ^ 7确保列优先)。 所以这个函数在技术上返回两个坐标(例如对于P4
是160000004
列和第4行)。 MOD
提取行号。
但是,如果一个AGGREGATE
可以返回两个坐标(作为一个数字),下一步就是试着找一个公式来使用AGGREGATE
只返回一次地址。 这是我能想到的最好的:
=BASE(AGGREGATE(14,6,(DECIMAL(ROW(L1:P5),36)+36^6*(DECIMAL(ADDRESS(1,COLUMN(L1:P5),4),36)-1)*(L1:P5<>"")),1),36)
这个公式:
- 将Base36的列字母(左移6位)解码为十进制
- 将行号(!)从Base36解码为十进制
- 计算非空单元的最大值
- 将结果编码为Base36
缺点:
-
BASE
是在Excel2013中引入的 - 公式返回
P000004
而不是P4
– 但它仍然是有效的单元格地址 – 可与INDIRECT
使用 - 执行大量的计算 – 只是试图用一个
AGGREGATE
解决问题。