对一列文本取不重复值并且结果按升序排序

大家好,昨天说了对文本的排序,今天再来升级一下难度。从一列文本中取出不重复值,并且结果要按升序排序。还是通过一个例子说明。

如下图所示,A列的数据源是一些费用名称,其中有重复的。现在的要求是提取出不重复的费用名称,并且按升序排序,结果如C列所示,D列是C列结果的拼音首字母,为了方便大家比较。这个题目就有点难度了,既要取不重复的值,还要升序排序,该怎么办呢?我这里提供2种方法,第1种是万金油的方法,第2种是lookup+frequency+match的方法。

先来看第1种,万金油的方法,公式为=INDEX(A:A,RIGHT(SMALL(IF(MATCH(A$3:A$21,A$3:A$21,)=ROW($3:$21)-2,COUNTIF(A$3:A$21,"<="&A$3:A$21)/1%%+ROW($3:$21),8^9),ROW(A1)),4))&"",按ctrl+shift+enter三键结束,向下填充。

我们从内往外看,先来看if函数IF(MATCH(A$3:A$21,A$3:A$21,)=ROW($3:$21)-2,COUNTIF(A$3:A$21,"<="&A$3:A$21)/1%%+ROW($3:$21),8^9)。它的第1参数是match=row,我们知道这是用来去重复值的;第2参数是用countif求出以升序排序的名次然后乘以1万再加上对应的行号,这个昨天刚说的。这2个参数返回的结果分别如下图B列和C列所示。第3参数8^9等于134217728,为了得到一个比较大的数,并且让最后4位数接近1万,但不能等于1万。

if函数最后返回的结果如下图D列所示,也就是第1参数是true的,返回对应的第2参数;第1参数是false的返回第3参数。接下来就是用small分别提取第1个最小值,第2个最小值,。。。一直提取完。

=SMALL(IF(MATCH(A$3:A$21,A$3:A$21,)=ROW($3:$21)-2,COUNTIF(A$3:A$21,"<="&A$3:A$21)/1%%+ROW($3:$21),8^9),ROW(A1))这部分就是用small提取上一步结果的第1个最小值20003,公式下拉提取第2个最小值,再下拉提取第3个最小值,。。。一直提取完。返回的结果如下图D列所示。再下一步就是取出行号。

=RIGHT(SMALL(IF(MATCH(A$3:A$21,A$3:A$21,)=ROW($3:$21)-2,COUNTIF(A$3:A$21,"<="&A$3:A$21)/1%%+ROW($3:$21),8^9),ROW(A1)),4)这部分就是用right从右边取出4位数,得到了对应的行号,如下图所示。最后用index返回A列对应行号的内容就可以了。

=INDEX(A:A,RIGHT(SMALL(IF(MATCH(A$3:A$21,A$3:A$21,)=ROW($3:$21)-2,COUNTIF(A$3:A$21,"<="&A$3:A$21)/1%%+ROW($3:$21),8^9),ROW(A1)),4))这部分就是用index返回A列对应行的内容。如下图所示。为了将最后空单元格返回的0变为空,所以公式后面还要&""。

再来看第2种方法,lookup+frequency+match。在E3单元格输入公式=LOOKUP(,0/FREQUENCY(1,ISNA(MATCH(A$3:A$21,E$2:E2,))*COUNTIF(A$3:A$21,"<="&A$3:A$21)),A$3:A4)&"",不用三键,向下填充。

这个公式用的是动态区域,随着单元格的向下填充,match第2参数的区域会动态变化,所以每个单元格的公式都会不同。先来看E3单元格的公式,也就是上面的公式。

还是从里到外看,先看frequecny的第2参数ISNA(MATCH(A$3:A$21,E$2:E2,))*COUNTIF(A$3:A$21,"<="&A$3:A$21)。绿色的isna部分是先用match查找A$3:A$21有没有在E$2:E2这个区域中出现过,没有出现过的返回错误值#N/A,出现过的返回对应的位置。isna将错误值返回true,不是错误值的返回false。简单来说就是找不到的返回true,找到的返回false。红色的countif部分是返回升序排序的对应名次。这2部分返回的结果分别如下图B列和C列所示,2部分相乘的结果如D列所示。

因为frequency的第1参数是1,所以在第2参数中大于等于1的最小值的位置计数1,其他位置计数0。如下图所示,然后用0除,1变为0,0变为错误值。最后用lookup查找0的位置,返回A列对应的"办公用品"。截图演示要截取好几列,和我开始演示的位置差太多了。所以就简单说明一下吧,不再多截取几列了。也建议大家最好参考文件查看。

下拉填充到E4单元格,公式变为=LOOKUP(,0/FREQUENCY(1,ISNA(MATCH(A$3:A$21,E$2:E3,))*COUNTIF(A$3:A$21,"<="&A$3:A$21)),A$3:A5)&"",match的第2参数变为E$2:E3。其中isna和countif返回的结果如下图BC两列所示,因为办公用品已经在E$2:E3中找到了,所以isna返回的结果为false。最后这2部分相乘的结果为D列所示。

然后用frequecny在第2参数中大于等于1的最小值的位置计数1,也就是5的位置计数1,其他位置计数0。然后用0除以将1变为0,0变为错误值;最后用lookup查找0,返回A列对应的"差旅费"。其他单元格也是这样的方式,大家自己分步查看结果。第2种方法没有一定的基础还是不太好理解。你也可以想想如果按降序排序该怎么办?

文件链接:

https://pan.baidu.com/s/1WApdvzZyHtuzqGmTSOP2OA

提取码:ruo7

(0)

相关推荐