栏目分类
新闻动态
昨天我们分享了一对多查找的函数实现方式(传送门:一对多查找,讲解所谓万金油公式),比较详细地介绍了万金油公式的来源。今天我们趁热打铁,继续来使用万金油公式来实现去重。
首先简单回顾昨天分享的万金油公式:
1、万金油公式是INDEX+SMALL+IF+ROW的函数组合;
2、INDEX是最后发挥作用的函数,其第一参数是我们需要返回在其中返回值的单元格区域(昨天的案例中仅为一列数据);
3、INDEX函数的第二参数是第一参数所需要的行号,我们用了IF函数来比较查找值与查找区域的所有值,如果相等则返回其在区域中的行位置,如果不等则返回FALSE或一个较大的数;
4、在使用IF函数来返回查找值在第一参数单元格区域中的行位置时,我们借助了ROW函数来构造INDEX函数第一参数单元格区域中的所有行位置;
5、因为IF函数是根据INDEX函数第一参数单元格区域中的值是否与查找值相等,这个比较一定是按顺序进行的。所以IF函数返回的行号可能会是1;65536;3;4;65536;65536;65536;8等排序的行号,为了达成我们的查找目标,我们借助了SMALL函数,将IF函数返回的区域(作为SMALL函数的第一参数)进行了排序(使用ROW函数构造出1、2、3等数字,以获取IF函数返回区域的最小值,次最小值等等)
咱们暂且回忆到这里,接下来我们将讲解如何利用万金油公式变体来对数据进行去重,在文末我们将对一对多查找的函数套路作比较!希望能对读到文章的各位朋友有一些帮助。
| 问题引入:
如下所示,我们有一个简化版的去重需求:
可以看到A2:A7区域中,不重复值应该只有第2行、第3行、第5行和第6行。乍一看,这个跟万金油公式有什么关系呢?如果说昨天分享的一对多查找可以用IF函数来将查找值与INDEX第一参数单元格区域中的值一一比较,那么去重如何运用到INDEX+SMALL+IF+ROW的函数组合呢?
我们用跟昨天讲解一对多查找时一样的思路,下面来逐步分析:
| 站在INDEX函数的肩膀上思考:
INDEX函数是可以返回单元格区域行列交叉位置的值的,第一参数不用想肯定是单元格区域A2:A7,其实我们只要将第二参数构造出数组形式{1;2;4;5}(注意:1、2、4、5对应不重复值在单元格区域A2:A7中的行位置,并非这些不重复值在整个工作表中的行号!),即可返回上述不重复值。所以问题变成如何构造数组{1;2;4;5}
| 如何使用函数生成不重复值在INDEX函数第一参数单元格区域的行位置:
昨天在讲解一对多查找时,我们使用IF函数,其第一参数是是一个比较表达式,判断查找值与单元格区域中的值是否相等,如果相等则返回由ROW函数模拟出的行位置!那么今天这个求不重复值我们该如何返回行位置呢?
还记得我们昨天分析一对多查找时的讲过的VLOOKUP函数,XLOOKUP函数、MATCH函数都是返回匹配到的第一个数对应的值或位置吗?
这MATCH函数仅返回第一次匹配到的位置一特性刚好可以被用到今天的场景中,如果不太明白请再看下我们的原始单元格区域:
当“张三”出现第二次时我们将使用MATCH函数去匹配,让其仍返回第一个“张三”所在的行位置,这个过程也就是MATCH函数的第一参数(查找值)数组化的过程:
我们可以从MATCH函数返回的结果中看到,如果单元格中的第二次出现时,它在区域中的行位置便与当前的自然行序号出现不相等的情况。比如1第二次出现是因为“张三”第二次出现了,如果第二次出现“张三”的这个位置是别的未出现的名称,如“孙悟空”,则刚才返回的结果应该是纵向显示的1 2 3 4 5 2,而不是1 2 1 4 5 2.
| 如何去掉MATCH函数返回的{1;2;1;4;5;2}数组中非自然行序号
根据我们昨天一对多查找的思路,不需要的行我们用FALSE或者一个比较大的值去代替即可。我们将MATCH函数嵌套到IF函数中,并将其放入IF函数的第一参数,但是并没有完!
MATCH函数返回的数组{1;2;1;4;5;2}需要与自然行序号进行比较,也就是{1;2;1;4;5;2}与{1;2;3;4;5;6}进行比较,如果相等则继续返回行位置(IF函数的第二参数),如果不等则返回FALSE或一个较大的值(IF函数的第三参数)
| ROW函数依旧是个辅助函数
在刚才的分析中,我们说需要将MATCH函数返回的行位置序号与INDEX函数的第一参数中的自然行序号进行比较!如果相等则返回行位置,如果不等则返回FALSE或一个较大的值。自然行序号我们可以用ROW函数来来生成:
| 剩下的交给SMALL函数的INDEX函数
至此,最主要的部分我们已经完成了,剩下的部分与一对多查找的思路完全一致,利用SMALL函数将IF函数返回的行位置按顺序返回,将SMALL函数嵌套IF函数,SMALL函数的第二参数可以用ROW(A1)来表示1,在下拉时将变为ROW(A2)表示2等等。
我们在C2单元格中输入公式:
=INDEX($A$2:$A$7, SMALL(IF(MATCH($A$2:$A$7, $A$2:$A$7, ) = ROW($1:$6),ROW($1:$6) ), ROW(A1)), 1)
如果看不完,可以向右拖动进度条!
公式继续下拉即可返回所有不重复值,直到出现#NUM!错误表示没有值可以返回了!
好了,今天的分享就到这里了。欢迎在评论区留言讨论、私信或关注我
下一篇:多地下起“红包雨”!数币应用场景持续“上新”

