find单元格块中最后使用的单元格

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

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

例如,在块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

编辑:添加参数4ADDRESS函数从结果中删除$ 。 在我的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确保列优先)。 所以这个函数在技术上返回两个坐标(例如对于P4160000004列和第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) 

这个公式:

  1. 将Base36的列字母(左移6位)解码为十进制
  2. 将行号(!)从Base36解码为十进制
  3. 计算非空单元的最大值
  4. 将结果编码为Base36

缺点:

  1. BASE是在Excel2013中引入的
  2. 公式返回P000004而不是P4 – 但它仍然是有效的单元格地址 – 可与INDIRECT使用
  3. 执行大量的计算 – 只是试图用一个AGGREGATE解决问题。