龙空技术网

16.8 数组 - 数据筛选技术

章老师的Excel课堂 183

前言:

如今你们对“数组分段”大约比较关心,咱们都想要剖析一些“数组分段”的相关文章。那么小编也在网络上网罗了一些关于“数组分段””的相关知识,希望我们能喜欢,朋友们一起来学习一下吧!

提取不重复数据是指在一个数据表中提取出唯一的记录,即重复的记录只算1条。使函数和“高级筛选”功能均能够生成不重复记录结果。

一、一维区域取得不重复记录

例 从销售业绩表提取唯一销售人员姓名

下图所示的是某单位的销售业绩表,为了便于发放销售人员的提成工资,需要取得唯一的销售人员姓名列表,并统计各销售人员的销售总金额。

1.MATCH函数去重法

根据MATCH函数查找数据原理,当查找的位置序号与数据自身的位置序号不一致时,表示该数据重复。在F3单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键并向下复制到F9单元格。

{=INDEX(B:B,SMALL(IF(MATCH(B$2:B$11,B:B,)=ROW($2:$11),ROW($2:$11),65536),ROW(A1)))&""}

公式使用MATCH函数定位销售人员姓名,当MATCH函数结果与数据自身的位置序号相等时,返回当前数据行号,否则返回指定行号65536(这是容错处理,工作表6656行通常是无数据的空白单元格)。再通过SMALL通数将行号从小到大依次取出,最后由INDEX函数返回不重复的销售人员姓名列表。

在G3单元格中输入以下公式统计所有销售人员的销售总金额,并将公式复制到G9单元格。

=IF(F3="","",SUMIF(B:B,F3,D:D))

SUMIF函数统计各销售人员的销售总金额,IF函数用于屏蔽F列为空时公式返回的无意义0值。

2.COUNTIF函数去重法

在F3单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键,并向下复制到F9单元格。

{=INDEX(B:B,1+MATCH(,COUNTIF(F$2:F2,B$2:B12),))&""}

公式使用COUNTIF函数统计已有结果区域中所有销售人员出现的次数,使用MATCH函数查找第一个零的位置,并结合INDEX函数返回销售人员姓名,即已有结果区域中尚未出现的首个销售人员姓名。随着公式向下复制,即可依次提取不重复的销售人员姓名。

COUNTIF函数结合FREQUENCY函数及LOOKUP函数,可使用普通公式提取唯一的销售人员名单。在F3单元格中输入以下公式,并向下复制到F9单元格。

=LOOKUP(,0/FREQUENCY(0,COUNTIF(F$2:F2,B$2:B12)),B$2:B12)&""

公式使用COUNTIF函数统计已有结果区域中所有销售人员出现的次数,使用FREQUENCY函数将数字0按销售人员出现的次数数组分段计频,在首个0的位置计数为1,即首个未出现的销售人员位置计数为1。“0/”运算将1转换为0,其余转换为错误值。最后通过LOOKUP函数忽略错误值,查找0,返回对应位置的销售人员姓名。

B12单元格是真空单元格,用于容错处理。F2:F8单元格区域没有真空单元格,所以COUNTIF函数计数始终为0。当销售人员姓名提取完毕时,其余单元格计数均为1,只有空白单元格计数为0,如F8单元格公式中COUNTIF函数结果如下。

{1;1;1; 1; 1; 1; 1; 1; 1; 1;0;0;0;0;0;0}

此时FREQUENCY函数分频计数,在第一个0的位置计数1,经过“0/”运算,通过LOOKUP函数返回0对应位置,即B12单元格的值,最后在F8:F9单元格区域显示空白。

二、使用二维数据表提取不重复记录

例 使用二维单元格区域提取不重复姓名

如下图所示,A2:C5单元格区域中包含重复的姓名、空白单元格和数字,需要提取不重复的姓名列表。

在E2单元格中输入以下数组公式,按<Ctrl+Shift+Enter>组合键,并将公式向下复制到单元格显示为空白为止。

{=INDIRECT(TEXT(MIN((COUNTIF(E$1:E1,$A$2:$C$5)+(A$2:C$5<=""))/1%%+ROW(A$2:C$5)/1%+COLUMN(A$2:C$5)),"r0c00"),)&""}

该公式使用“+(A$2:C$5<="")”来判断A2:C5单元格区域中的非文本单元格,使空单元格和数字单元格返回1,有文本内容的单元格返回0(零)。使用COUNTIF函数在当前公式所在单元格上方的E列单元格区域中统计各姓名的出现次数,使已经提取过的名返回1,尚未提取的姓名返回0(零)。“(COUNTIF(E$1:E1,$A$2:$C$5)+(A$2:C$5<=""))/1%%”部分的作用就是使已经提取过的姓名或非姓名对应单元格位置返回大数10000,而尚未提取的姓名返回0(零),以此达到去重的目的。

通过数组运算“ROW(A$2:C$5)/1%+COLUMN(A$2:C$5)”构造A2:C5单元格区域列号位置信息数组。

使用MIN函数提取第一个尚未在E列中出现的姓名对应的单元格位置信息。最后使用INDIRECT函数结合TEXT函数将位置信息转换为该位置的单元格内容。

标签: #数组分段