ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5979|回复: 8

[原创] 【辅助列解决实际问题_系列7】提取不重复值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-2 16:04 | 显示全部楼层 |阅读模式
本帖最后由 cleverzhzhf 于 2014-10-20 11:13 编辑

不重复值是一个永恒的话题,而且又是大家常用的,就因为此,微软从2007版本开始增加了一个直接的选项“删除重复项”,足见此功能的需求。
既然手动处理那么方便,为什么还要用函数呢?是否多次一举?

使用Excel的目的是什么?减少重复工作,能让系统一次性做好的,就尽量不要每次都要手动来处理,或者是减少手动处理的相应步骤。

三国公司8月份上旬各员工的销售业绩,现在要通过有销售额的员工,提取出来不重复的人员姓名,并且做一个数据有效性:
  1. D4:=IFERROR(IF(MATCH(B4,B:B,0)=ROW(),ROW()),"")
  2. E4:=IFERROR(INDEX(B:B,SMALL(D:D,ROW()-3)),"")
复制代码
数据有效性可供参考的三个方法:
  1. =OFFSET($E$4,0,0,MATCH("",E:E,)-4)
  2. =OFFSET($E$4,0,0,COUNTA($E$4:$E$30)-COUNTBLANK($E$4:$E$30))
  3. =OFFSET($E$4,0,0,COUNTIF(E:E,"?*")-1)
复制代码
提取不重复值.png
提取不重复值.zip (11.34 KB, 下载次数: 475)



一个公式得到E列的值,E4数组公式:
  1. =IFERROR(INDEX(B:B,SMALL(IF(MATCH($B$4:$B$30,B:B,)=ROW($B$4:$B$30),ROW($B$4:$B$30)),ROW(1:1))),"")
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-2 16:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不错,使用辅助列,以空间换时间。
COUNTA($E$4:$E$30)-COUNTBLANK($E$4:$E$30)可以用COUNTIF($E$4:$E$30,"?*")代替。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-2 16:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cleverzhzhf 于 2014-9-2 16:45 编辑

首先要得到不重复数据:
第一步:
=IFERROR(IF(MATCH(B4,B:B,0)=ROW(),ROW()),"")
1、MATCH(B4,B:B,)=ROW()
这是一个比较经典的判断重复的方式
首先,通过MATCH,来判断C2的数字在C列第一次出现的位置
然后,用这个第一个出现的位置,与自己所在的行号作比较:
    如果相等:说明该数字,是在此列第一次出现
    如果不等:说明该数字,在靠上的位置,之前出现过,不是第一次出现
(相似使用方法可参考:[原创] 【辅助列解决实际问题_系列2】中国式排名
2、IF(条件,ROW())
如果是第一次出现,则返回相应的行号
如果不是第一次出现,这里面用了一个技巧,省略IF的第三个参数,使得返回结果为FALSE。在数字比较当中,FALSE这种逻辑值是大于一切数字的,所以Small最后才会取到FALSE。
3、IFERROR(IF(条件,ROW()),"")
这里面就是为了容错。第一次可以把D列的辅助列做的很长很长,以后添加数据的时候,也不必每次还要改D列的尺寸。

第二步:
=IFERROR(INDEX(B:B,SMALL(D:D,ROW()-3)),"")
1、SMALL(D:D,ROW()-3)
从D列里面依次取最小值、次小值、再小值……,由于此公式写在了第4行,所以“-3”调整数值。根据个人喜好,也可以换成ROW(1:1)
2、INDEX(B:B,SMALL(D:D,ROW()-3))
通过Small取得相应的行号,使用Index进行简单的取值
3、IFERROR(INDEX,"")
这里面就是为了容错,当Small需要取到FALSE的时候会报错,所以强行返回空白即可

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-2 16:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
数据有效性:
=OFFSET($E$4,0,0,MATCH("",E:E,)-4)
1、MATCH("",E:E,)
由公式返回的空白"",是可以进行精确匹配位置的。不过这里有一个弊端,当提取的不重复值那一列扩展的区域不够,有可能查不到""。
所以在使用的时候,一定需要知道自己的表格在做什么,需要什么数据。因为没有一成不变万能的方法,都可能需要根据细节来调整。
2、OFFSET($E$4,0,0,MATCH("",E:E,)-4)
通过MATCH可以知道第一个""的位置在哪,进而调整数值,得到有多少不重复的结果。
然后就是OFFSET的神奇扩展的功效了。

=OFFSET($E$4,0,0,COUNTA($E$4:$E$30)-COUNTBLANK($E$4:$E$30))
COUNTA($E$4:$E$30)-COUNTBLANK($E$4:$E$30)
由公式生成的空"",虽然眼睛看不到,但是Counta认识他,所以骗不过去。
而无论是“真空”,还是“公式生成的空”,CountBlank统统收入囊中。
这里使用这两个数值的差,便得到最终的结果。

=OFFSET($E$4,0,0,COUNTIF(E:E,"?*")-1)
(由gvntw版主提供)
COUNTIF(E:E,"?*")
这里面是巧妙的使用了通配符:
"?",代表任意“1个”字符
"*",代表任意“n个”字符,n大于等于0
"?*",说明统计E列中,大于等于1个字符的单元格有多少个。而空""是不包含任何字符的,所以不在统计范围内。

TA的精华主题

TA的得分主题

发表于 2014-9-2 17:01 | 显示全部楼层
前排旺铺招租!先顶再看!
好多人不喜欢辅助列,但辅助列确实可以大大降低工作难度。
顶!!!!!!

TA的精华主题

TA的得分主题

发表于 2014-9-2 17:08 | 显示全部楼层
处理复杂的数据时,我一般都会用到辅助列(行),这样键盘上的F9键兴许能多用上几年

TA的精华主题

TA的得分主题

发表于 2014-9-2 23:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
路过,学习下。

TA的精华主题

TA的得分主题

发表于 2016-7-31 11:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-4 14:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做个记号,收藏学习
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-2 21:06 , Processed in 0.037924 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表