excel函数与技巧:lambda+scan+take处理复杂排序问题-趣帮office教程网

如图,前A列、B列为源数据,数据中有些省份的名称是相同的,有些不同,要求进行排序,使相同的都在同一行,同时排序后每一列的省份出现顺序与源数据保持一致,也就是说中间可以有空行,但上下顺序要保持一致。公式如下:

=LET(

排序,LAMBDA(r,s,t,SCAN(0,s,LAMBDA(x,y,LET(a,COUNT(XMATCH(r:y,t,)),IFERROR(IF(XMATCH(y,t,),a),x 1%%))))),

数组一,排序(A2,A2:A26,B2:B26),

数组二,排序(B2,B2:B26,A2:A26),

排序2,UNIQUE(SORTBY(TOCOL(A2:B26),TOCOL(HSTACK(数组一,数组二)),)),

去空格,FILTER(排序2,LENB(排序2)>1),

IF(COUNTIF(TAKE(A2:B26,,{1,-1}),去空格),去空格,"")

)

公式思路:通过构建排序数组,完成对两列数据的排序,再根据源数据与去空格后的排序数据的计数结果决定显示内容。

亮点有两个:

一是变量排序的使用,将匹配不到的结果生成“上一个结果加上小数0.0001“的数值,这样保证了数据相同的部分用整数表示,不同的部分用小数表示,同时小数前面的整数部分又能带来位置上的标记。

二是COUNTIF(TAKE(A2:B26,,{1,-1}),去空格)的使用,首先TAKE(A2:B26,,{1,-1})形成了一个多维数组,通过excel是直接体现不出来的,但确引用了两列具体的位置。这样countif就可以使用具体的位置与内存数组“去空格"进行比较的计数,生成两列数据,正好与结果相符合。