excel公式:提取出不重复数值
这个提问很有意思,要理解这个公式,不妨把问题再简化一下:
如图,在E1输入如下数组公式(用Shift+Ctrl+Enter输入):
=INDEX(D:D,SMALL(IF(MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20),ROW($1:$20),4^8),ROW(1:1)))&""
下拉
用鼠标在编辑栏把MATCH(D$1:D$20&"",D$1:D$20&"",)变成高亮,如下图:
按F9,得下图:
其中{1;2;2;4;2;2;2;1;2;1;4;2;1;4;15;2;4;4;1;4}就是公式MATCH(D$1:D$20&"",D$1:D$20&"",)的计算结果,它表示数组D$1:D$20={3;5;5;2;5;5;5;3;5;3;2;5;3;2;4;5;2;2;3;2}的每一项的数字在数组中第一次出现的位置。例如3;5;5;2对应1;2;2;4等等。
ROW($1:$20)={1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}
MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20)返回如下逻辑数组(可用按F9得到):
{TRUE;TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE}它反映数组D$1:D$20中某数字第一次出现的位置,TRUE为第一次出现,FALSE则不是。
IF(MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20),ROW($1:$20),4^8)则构造了如下数组(可用按F9得到):
{1;2;65536;4;65536;65536;65536;65536;65536;65536;65536;65536;65536;65536;15;65536;65536;65536;65536;65536}
它是当D$1:D$20中的数字在D$1:D$20中第一次出现时,返回它的行号,否则返回一个很大的数65536
SMALL(IF(MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20),ROW($1:$20),4^8),ROW(1:1))则返回上述数组的最小值
公式下拉后
SMALL(IF(MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20),ROW($1:$20),4^8),ROW(2:2))则返回上述数组的第二小值
如此等等。
于是INDEX(D:D,SMALL(IF(MATCH(D$1:D$20&"",D$1:D$20&"",)=ROW($1:$20),ROW($1:$20),4^8),ROW(1:1)))&""
在E列依次列出了D列中第一次出现的数,下拉到出现空格,则E列列出了D列全部的不重复数。
当然,分解任何公式都得从内而外,这个也不例外。
1、MATCH(D$1:D$1000&"",D$1:D$1000&"",)
在D1至D1000的范围连上“”,查找D1至D1000“”
2、IF(MATCH(D$1:D$1000&"",D$1:D$1000&"",)=ROW($1:$1000),ROW($1:$1000),4^8)
如果第1项返回的行号 等于 1至1000中的数字,就返回这些行号,否则就返回4^8(即65536)
3、SMALL(第2项公式,ROW(2:2)))
(注:你这里是ROW(2:2),上面一条公式应该有ROW(1:1))
这条公式明显是要向下填充的,SMALL(……,ROW(2:2)))意思就是,往下填充的时候,从第2项得到的数组中分别取出第1小、第2小、第3小……的数字。
4、INDEX(D:D,第3项公式)
公式下拉填充的时候,顺序插入D列所对应该的第3项取出来的行号。
比如:第三项分别取出了2、3、5、6、7,这里就是插入D列的第2行、第3行、第5行、第7行、第7行
总结:这就相当于一个按顺序排序或者叫做筛选的函数公式。
2014-03-23 · 知道合伙人软件行家
也可以使用审阅公式的功能