|
楼主 |
发表于 2014-10-27 15:49
|
显示全部楼层
本帖最后由 cleverzhzhf 于 2014-10-28 13:55 编辑
首先要得到不重复数据:
第一步:
=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的时候会报错,所以强行返回空白即可
数据有效性:
=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个字符的单元格有多少个。而空""是不包含任何字符的,所以不在统计范围内。
|
|