excel函数技巧:reduce+filter/offsettocol三种排列组合的方法-趣帮office教程网

如图,从A列21个字母中选出3个进行排列组合,忽略字母顺序,共有1330种可能,如何公式实现呢?公式如下:

方法1:

=LET(t,TOCOL(TRANSPOSE(A2:A22)&TOCOL(A2:A22&TRANSPOSE(A2:A22))),p,MAP(t,LAMBDA(x,CONCAT(UNIQUE(SORT(MID(x,ROW($1:$3),1)))))),UNIQUE(FILTER(p,LEN(p)=3)))

方法2:

=DROP(UNIQUE(REDUCE("",A2:A22,LAMBDA(x,y,VSTACK(x,REDUCE("",FILTER(A2:A22,A2:A22<>y),LAMBDA(i,j,VSTACK(i,REDUCE("",FILTER(A2:A22,ISERROR(XMATCH(A2:A22,VSTACK(j,y)))),LAMBDA(m,n,VSTACK(m,IF(OR(BYROW(IFERROR(FIND(HSTACK(y,j,n),VSTACK(x,i,m)),0),LAMBDA(s,AND(s<>0)))),"",y&j&n))))))))))),1)

方法3:

=DROP(UNIQUE(REDUCE("",A2:A22,LAMBDA(x,y,VSTACK(x,REDUCE("",OFFSET(y,1,,MAX(1,22-ROW(y))),LAMBDA(i,j,VSTACK(i,REDUCE("",OFFSET(j,1,,MAX(1,22-ROW(j))),LAMBDA(m,n,IF(OR(OFFSET(y,1,,MAX(1,22-ROW(y)))="", OFFSET(j,1,,MAX(1,22-ROW(j)))=""),"",VSTACK(m,y&j&n))))))))))),1)

公式思路:

公式1利用字母两次纵横结合,得到了所有的排列组合,然后利用函数进行排序、去重、长度过滤、再去重得到结果,方法很简洁,运算速度也很快,是首选方法,它充分利用了excel二维表格的特点。

公式2利用了reduce函数实现三次循环,同时利用filter函数去除了重复,加快效率,并以累积器中是否存在为判断条件,返回不重复的组合。这个公式适用于内存数组,但对于区域数组来说运算速度较慢。

公式3同样利用了reduce函数实现了三次循环,每次循环数组,根据变量的索引用offset函数进行了精准的控制,快速得到了结果。