|
楼主 |
发表于 2010-3-29 20:05
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
第一问: 取不重复值
推荐学习资料:
★★★★★ http://club.excelhome.net/viewth ... B%D6%D8%B8%B4%D6%B5
方版
通用格式:
=index(返回值列,small(if(条件,row(区域),65536),row(1:1)))&""
这个公式基本可以解决论坛的问题的60%以上,毫不夸张。
我不知道这个公式对大家的影响有多少深远,我以我的体会打一个比方:
VLOOKUP之于我初见EXCEL,正如此之于我想见EXCEL。
很多返回最大值,最小值,多值记录都可以用这个公式
近期案例:
http://club.excelhome.net/viewth ... p;page=1#pid3685400
使用心得:
1.条件的确认:
不能同时满足的条件用+,可以同时满足的条件用*
比如,部门为部门A和部门B,就用(区域="部门A")+(区域="部门B")
比如,年龄大于20小于30,就用(区域>20)*(区域<30)
我感觉这样比且,或更好理解。
再一点,关于if((区域="部门A")+(区域="部门B"),row(区域))
这样形式中的“+”与“*”的理解,我认为把他理解为两个true,false的数组相加,相乘,比or,and更好理解。
只要去关注数组返回的是1还是0就可以了。也可以用于理解不能同时满足用+这句话。
2.65536的作用:
为什么要用65536?
EXCEL2003版本最大行号为65536,所以当条件为false时,返回一个很大的行号,那么index时就会索引到后面没有
记录的行,从而生成一个空文本,可以防止公式下拉出错。其实可以换成索引区域最后非空单元格的下一个单元格,
但是要判断这个单元格,所以用了最后单元格来代替。因为我们一般很少用到那么远的区域。
另外index索引的时候,如果是空值,将返回0值,同offset,vlookup等。所以配合&""或者T()来防错返回空值。
3.诸多变形
当我们对这个公式运用的特别熟练了,可以对方版总结贴上的其它求不重复公式加以研究,选出自己喜欢的格式来
运用。下面我来说下我对这个公式(仅针对这个公式的这个格式而言)的一些变式说明如下:
A. 解决排序
基本形式是if条件后返回的row(区域),其实这也是一个默认的排序,就是按行号大小,也就是出现的先后顺序;
如果要满足条件的多记录,按其它条件排序返回结果呢?
变形
=index(返回值列,mod(small(if(条件,row(区域)+排序值区域*100,65536),row(1:1)),100))&""
在row()加上一个较大的排序区域值,让row()不能起作用,排序值来起作用.
而我们要返回的是row(),所以对排序后返回的数据要还原,用mod(,100)或者--right(,2)
向无限变形
=mod(small(if(条件,row(区域)+次排序值区域*100+主排序值区域*10000,65536),row(1:1)),100)
可以设置多重排序值。
这样,不管写多复杂的公式,多少次转换,你的思路都可以清晰明净,洒洒而书。
B.代替筛选
这应该是这个公式最为常见的一个应用。
if后的条件,等同于筛选的条件,不过更为灵活。
条件的设置参照前面我对+,*的理解
就是两组数的运算,来生成条件所需的TRUE,FALSE(即运算结果1,0)
同时结合排序思维可以解决,排序,筛选问题。
难点解析:
1.条件的设置是此公式的难点。
常见条件设置示例:
大于60,小于70
(区域>60)*(区域<70)
小于60,大于70
(区域<60)+(区域>70)
条件1大于60且条件2小于70
(区域1>60)*(区域2<70)
条件1大于60或条件2小于70 可能同时满足
(区域1>60)+(区域2<70) 那么这里就有可能生成2,但是对IF判断不起影响,如果用muult就要注意转换
2.排序关键值的返回易忽略点.
mod,--right返回 mid,right,left返回的结果均为文本,若要参与后续的数值引用,需进行转换
常见数值类文本转换数值
1*
+0
-0
/1
--
value()
信手写来,刍了一章,未加修饰,徒增刺目。一日续展一章,以慰众兴。
待续。
[ 本帖最后由 liuguansky 于 2010-3-29 20:12 编辑 ] |
|