手把手教你,学会提取不重复值
提取客户代表姓名
图26-8展示的是某单位销售记录表的部分内容,需要提取不重复的客户代表姓名。
1. MATCH函数去重法在F2单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键将公式向下复制到单元格显示空白为止。
{=INDEX(C:C,SMALL(IF(MATCH(C$2:C$11,C:C,)=ROW($2:$11),ROW($2:$11),4^8),ROW(A1)))&''}
公式中的“MATCH(C$2:C$11,C:C,)”部分利用MATCH函数在C列中依次查找C2:C11单元格区域中每个元素首次出现的位置,结果如下。
{2;2;2;5;6;6;6;9;9;9}
然后将以上内存数组结果与数据所在行号“ROW($2:$11)”进行比对,如果查找的位置序号与数据自身的位置序号一致,则表示该数据是首次出现;否则是重复出现。
当MATCH函数结果与数据自身的位置序号相等时,返回当前数据行号;否则返回65 536。再通过SMALL函数将行号从小到大依次取出,最终由INDEX函数返回该位置的姓名,得到不重复的姓名列表。
2. COUNTIF函数和MATCH函数结合法
在F2单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键将公式向下复制到单元格显示空白为止。
{=INDEX(C:C,1+MATCH(,COUNTIF(F$1:F1,C$2:C$12),))&''}
公式中的“COUNTIF(F$1:F1, C$2:C$12)”部分,利用COUNTIF函数在公式所在位置上方的单元格区域中,分别查找C$2:C$12单元格区域中每个数据的个数。COUNTIF函数的第一参数F$1:F1利用绝对引用和相对引用的技巧,形成一个自动扩展的数据范围。当公式向下复制时,查找区域依次变为$F$1:$F2、$F$1:$F3、…、$F$1:$F11。
COUNTIF函数返回一个由0和1构成的数组,其中0表示该姓名在公式上方未出现过,1表示该姓名在公式上方已出现过。
然后用MATCH函数在COUNTIF函数返回的数组中查找第一个0的位置,即查找下一个尚未出现的姓名所在的位置。再利用INDEX函数,根据MATCH函数的结果从C列中返回对应位置的内容。由于数据表有一个标题行,因此,将MATCH函数的结果加1,用于匹配在数据表中的位置。
本例中COUNTIF函数的第二参数C$2:C$12比实际数据区域多出一行,目的是当公式复制的行数超出不重复数据的个数时,得到的内存数组中最后一个元素始终为0,从而避免MATCH函数由于查找不到0而返回错误值。
3. COUNTIF函数和MIN函数结合法
在H2单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键将公式向下复制到单元格显示空白为止。
{=INDEX(C:C,MIN(IF(COUNTIF(H$1:H1,C$2:C$11),4^8,ROW($2:$11))))&''}
公式中的“IF(COUNTIF(H$1:H1,C$2:C$11),4^8,ROW($2:$11))”部分表示,如果数据在公式之前的范围中出现过,则返回65536;否则返回对应的行号。
以H2单元格为例,返回内存数组结果如下。{2;3;4;5;6;7;8;9;10;11}以H3单元格为例,由于H2单元格中的姓名已经在C列出现过,因此返回内存数组结果如下。
{65536;65536;65536;5;6;7;8;9;10;11}随着公式的向下复制,用MIN函数依次提取尚未出现的姓名的最小行号。最后用INDEX函数得到该行号对应的姓名。