|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 zmm101 于 2022-8-25 16:32 编辑
F列原数据列的最大非空行行号: =LOOKUP(1,0/(产品信息表!$F:F<>""),ROW(1:1000))
用数组公式1,通过Match函数对F列范围内内容进行去掉重复数据,并将不重复值列到另一列中:
=IFERROR(INDEX(Sheet1!$F:$F,SMALL(IF(MATCH(Sheet1!$F$2:$F$27,Sheet1!$F$2:$F$27,0)=ROW(Sheet1!$F$2:$F$27)-1,ROW(Sheet1!F$2:F$27),4^8),ROW(O2)))&"","")
1、 当:match的范围 Sheet1!$F$2:$F$27 ,从 F2 到 F27 范围中,如果F27是空值,那么 match返回值就会全部变成 是 #N/A 。中间存在空值是不会出错的,只是会增加一个空值行。就是最后行不能为空。
2、假如实际 源数据列是会增加 减少 行数的,也就是 Match范围实际是要动态调整的(否则如果实际数据变多后,还需要去修改这个公式)
所以,我将 F列原数据列的最大非空行行号: =LOOKUP(1,0/(产品信息表!$F:F<>""),ROW(1:1000)) ,放到指定单元格内 [A2]中,再用INDIRECT("Sheet1!$F2"&":$F"&Sheet1!$A$2)代替 Sheet1!$F$2:$F$27 实现了动态间接取数据范围,从而规避Match范围过大导致的错误
上述公式变成:
IFERROR(INDEX(Sheet1!$F:$F,SMALL(IF(MATCH(INDIRECT("Sheet1!$F2"&":$F"&Sheet1!$A$2),INDIRECT("Sheet1!$F2"&":$F"&Sheet1!$A$2),0)=ROW(INDIRECT("Sheet1!$F2"&":$F"&Sheet1!$A$2))-1,ROW(INDIRECT("Sheet1!$F2"&":$F"&Sheet1!$A$2)),4^8),ROW(Y1)))&"","")
------------------------------------------------------------------------
效果如图2, Match范围动态变化。
PS: 数据太多,好像会卡死。有没有别的解决方案,公式层面的。vba除外的方法
|
|