分享

提取不重复值,你还不会吗?学起来吧!方法3:countif动态区域去重法

 刘卓学EXCEL 2021-04-02
这种方法的好处是公式较短,而且结合frequency函数不用按三键;坏处是公式不太好理解,因为下一个单元格的结果要借助上一个单元格的结果。重点还是从拆解公式的过程中,理解思路。
还是之前的案例,从B列的销售员中提取出不重复值,结果如F列所示。在F3单元格输入下面的公式,按ctrl+shift+enter三键,向下填充。

=INDEX(B$3:B$15,MATCH(,COUNTIF(F$2:F2,B$3:B$15),))&""


在解释这个公式之前,先说以下几点注意事项:

第1,countif的第1参数F$2:F2是一个动态区域,前一个F2的行号锁定,后一个F2的行号不锁定。当公式下拉到F4时,F$2:F2变为F$2:F3区域扩展了。公式再下拉时,区域继续扩展。

第2,countif的第2参数B$3:B$15比实际数据区域B3:B14多了个空白单元格,这样做是为了容错,后面会说明的。

第3,match的第1和第3参数都是省略写法,用逗号留出位置,都代表0。相当于MATCH(0,COUNTIF(F$2:F2,B$3:B$15),0)

第4,公式最后必须连接空文本,也就是&""

下面来拆解下这个公式,由于各单元格公式中countif的区域不同,所以只能一个单元格一个单元格的来拆解。

先看F3单元格,COUNTIF(F$2:F2,B$3:B$15)这部分用countif统计F2:F2这个区域中B13:B15的个数,结果为{0;0;0;0;0;0;0;0;0;0;0;0;0}。

换句话来说,就是判断B13:B15的销售员有没有在F2:F2这个区域出现过。第一次肯定都没有出现,所以都返回0。

MATCH(,COUNTIF(F$2:F2,B$3:B$15),)这部分用match函数在countif返回的结果中查找第1个0的位置,结果为1。然后用index返回B$3:B$15这个区域中第1个销售员“陈梅”。对应关系如下图所示。

当公式下拉到F4时,countif部分变为COUNTIF(F$2:F3,B$3:B$15),统计F2:F3这个区域中B3:B15的个数。由于F3的结果已经是“陈梅”了。所以B3:B15中的“陈梅”会计数为1,最后的结果为{1;0;0;1;0;0;0;0;0;0;0;0;0},如下图G列所示。

MATCH(,COUNTIF(F$2:F3,B$3:B$15),)这部分同样用match函数从countif返回的结果中查找第1个0的位置,结果为2。然后用index返回B$3:B$15这个区域第2个销售员“马婵娟”,如上图所示。
看到这里,你应该有点理解这个公式的思路了。就是判断B3:B15中的销售员有没有在F列的结果区域中出现过,如果出现过被排除掉,如果没有出现过,则取第一个销售员。

当公式再下拉时,还是一样的理解方式,不在一一列举。当所有的不重复值都被提取完,公式下拉到F8单元格时,countif的区域变为COUNTIF(F$2:F7,B$3:B$15),返回的结果为{1;1;1;1;1;1;1;1;1;1;1;1;0},如下图G列所示。

MATCH(,COUNTIF(F$2:F7,B$3:B$15),)这部分用match函数在countif返回的结果中查找第1个0的位置,结果为13。
然后用index返回B3:B15这个区域中第13个单元格,也就是B15单元格,是个空白单元格,最后的结果会返回0,为了让0变为空,要&""。
假如countif的第2参数为B$3:B$14,COUNTIF(F$2:F7,B$3:B$15)返回的结果为{1;1;1;1;1;1;1;1;1;1;1;1},然后用match查找0的位置,肯定找不到,会出现错误值。所以最开始说了countif的第2参数为B$3:B$15可以容错。
还可以结合frequency来完成,不用按三键。在J3单元格输入下面的公式,下拉完成。这个公式中countif的第2参数还是借用了一个空白单元格来容错。

=LOOKUP(,0/FREQUENCY(0,COUNTIF(J$2:J2,B$3:B$15)),B$3:B$15)&""

在K3单元格输入下面的公式,下拉完成。countif的第2参数没有借用空白单元格。由于时间关系,不能详细说明了。

=LOOKUP(,0/FREQUENCY(1,1-COUNTIF(K$2:K2,B$3:B$14)),B$3:B$14)&""

链接:

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

提取码:1bah

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多