无法使用VSTACK/HSTACK及VBA时,提取动态溢出多垂直数组的全局唯一值
无法使用VSTACK/HSTACK及VBA时,提取动态溢出多垂直数组的全局唯一值
嘿,完全理解你的痛点——三个靠公式动态溢出的垂直数组,要抓全局唯一值,还得自动跟着数组长度变化更新,还不能用VSTACK/HSTACK,这确实得绕点路,但咱们用基础函数组合就能搞定,而且完全支持动态更新。
假设你的三个动态溢出数组分别在A#、B#、C#(这里的#是Excel 365里的溢出范围引用,会自动覆盖整个公式生成的数组区域),我们可以用INDEX+AGGREGATE的组合来实现,具体步骤和公式如下:
核心公式(以在E1单元格开始输出唯一值为例)
=IFERROR(INDEX( CHOOSE( MOD(AGGREGATE(15,6,(ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/(COUNTIF($E$1:E1,CHOOSE(INT((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/ROWS(A#)+1,INDEX(A#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1,ROWS(A#))+1),INDEX(B#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#),ROWS(B#))+1),INDEX(C#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#)-ROWS(B#),ROWS(C#))+1)))=0),1),3)+1, INDEX(A#,MOD(AGGREGATE(15,6,(ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/(COUNTIF($E$1:E1,CHOOSE(INT((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/ROWS(A#)+1,INDEX(A#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1,ROWS(A#))+1),INDEX(B#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#),ROWS(B#))+1),INDEX(C#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#)-ROWS(B#),ROWS(C#))+1)))=0),1),ROWS(A#))+1), INDEX(B#,MOD(AGGREGATE(15,6,(ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/(COUNTIF($E$1:E1,CHOOSE(INT((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/ROWS(A#)+1,INDEX(A#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1,ROWS(A#))+1),INDEX(B#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#),ROWS(B#))+1),INDEX(C#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#)-ROWS(B#),ROWS(C#))+1)))=0),1)-ROWS(A#),ROWS(B#))+1), INDEX(C#,MOD(AGGREGATE(15,6,(ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/(COUNTIF($E$1:E1,CHOOSE(INT((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1)/ROWS(A#)+1,INDEX(A#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1,ROWS(A#))+1),INDEX(B#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#),ROWS(B#))+1),INDEX(C#,MOD((ROW(INDIRECT("1:"&ROWS(A#)+ROWS(B#)+ROWS(C#)))-1-ROWS(A#)-ROWS(B#),ROWS(C#))+1)))=0),1)-ROWS(A#)-ROWS(B#),ROWS(C#))+1) ), "")
公式原理拆解
- 动态范围适配:用
ROWS(A#)+ROWS(B#)+ROWS(C#)自动计算三个数组的总元素数,不管每个数组的长度怎么变,这个数值都会实时更新。 - 虚拟合并数组:通过
CHOOSE+INDEX的组合,把三个分散的垂直数组“虚拟合并”成一个连续的序列,遍历所有元素。 - 唯一值筛选:
AGGREGATE(15,6,...)会筛选出那些还没在已输出的唯一值列表($E$1:E1)中出现过的元素位置,确保每次提取的都是新的唯一值。 - 自动终止:
IFERROR会在没有更多唯一值时返回空文本,避免出现错误值,你直接下拉这个公式,它会自动停止在空值处。
自定义调整提示
如果你的数组不在A、B、C列,只需要把公式里的A#、B#、C#替换成你实际的溢出数组引用就行,比如第一个数组在D列的溢出范围,就改成D#,以此类推。
这个方法完全满足你的需求:不管三个数组的长度怎么变化,公式都会自动更新总元素数,提取的唯一值也会实时同步,不需要手动调整引用范围。
备注:内容来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

