EXCEL中如何用公式从重复项中提取唯一值
EXCEL中经常用到表格记一些流水账,希望在不断追加记录时自动统计出结果,固定的项目名称可以预先写出来,但追加的新记录中可能有新名称不断出现,且不知道这些名称前面有没有出现过,逐一查找比对是不现实的,这时就要想办法去重。
操作方法
- 01
比如要统计下表中每种水果的销售量,首先要列出每种水果的名称,然后用求和公式很容易可以做到:=SUMIF(B:B,F2,C:C)
- 02
在汇总之前,首先要从销售明细中将水果名称提取出来,如果名称是固定的那几个,可以复制B列,到F列粘贴,然后再从“数据“选项卡中,单击“数据工具”中的“删除重复项”即可得到各种不同的水果名。
- 03
或者用“数据透视表”以水果名为标签进行数量求和。
- 04
但不管用“删除重复项”还是用“数据透视表”,当有新的不同名称增加时,都不会自动改变,还要重复进行上面的步骤,尤其是后者,即使是已有的名称,追加或修改记录时都要重复处理。
- 05
因此对不断动态变化的数据进行汇总,用上面的方法并非良策,用公式法就可以解决要不断重复操作的问题,从B列中提取到不同的名称到F列,并向下扩大填充区域。
- 06
公式法就是要从上往下遍历,当单元格中的数据是第一次出现时,就将其取出来,非第一次出现就不取,因此可以使用MATCH函数,此函数返回该项在区域中的相对位置:=MATCH(B2,$B$1:B2,0),可以看出当返回的次序号与行号相同时,表示第一次出现,不同则代表上面已经出现过。
- 07
通常情况下,用IF函数来判断,如果上述条件为真,则返回水果名,为假返回空值:=IF(MATCH(B2,$B$1:B2,0)=ROW(2:2),B2,"")
- 08
不过这还不是想要的结果,在汇总时,特别是数据量大,重名较多的情况下,总不能看着汇总结果断断续续的吧,因此要将提取出来的结果去掉空单元,直接连在一起,此时就要用到数组公式,凡是符合条件的就返回行号,不符合的不要(通常用返回一个很大的数),然后再用SMALL函数,从上往下依次符合条件的行号:=SMALL(IF(MATCH($B$2:$B$1000&"",$B$2:$B$1000&"",0)=ROW($2:$1000)-1,ROW($2:$1000),4^8),ROW(1:1)),这是数组公式,数组公式与普通公式的编辑方式不同,编辑完成后,必须同时按住Ctrl+Shift+Enter三键结束公式编辑,会自动生成一对“{}”,这是数组公式的特征。
- 09
上面公式中的4^8,就是4的8次方,其值为65536,公式中用此值,是因为03版及以前的软件最多只有65536行,几乎不会在最后一行输入数据,从而当公式中返回此行中的数据时,是空值。MATCH函数返回的次序是从1开始的,现在的区域是从第二行开始的,所以公式中要用行号-1,返回行号后,再用INDEX函数返回相应行号的数据:=INDEX(B:B,SMALL(IF(MATCH($B$2:$B$1000&"",$B$2:$B$1000&"",0)=ROW($2:$1000)-1,ROW($2:$1000),4^8),ROW(1:1)))
- 10
从图中可以看出后面有许多0,这也不是想要的,出现这种情况,就是因为前面用了4^8,返回了B65536这个单元格的数据,这个单元格其实并没有数据,不做处理真正的空值会返回0,所以需要再加个判断,让其不返回无用的0,对于文本有更简单的处理方法,只要在公式后面再加个空值符号,空单元就会返回空值,不会返回0了:=INDEX(B:B,SMALL(IF(MATCH($B$2:$B$1000&"",$B$2:$B$1000&"",0)=ROW($2:$1000)-1,ROW($2:$1000),4^8),ROW(1:1)))&""
- 11
同样的对求和公式也要加个判断,在没有名称的情况下,不要出现0值:=IF(F2="","",SUMIF(B:B,F2,C:C))
- 12
输入公式并向下填充后,再追加记录时,就可以看到会自动跟随改变汇总结果,非常方便。