随着excel 2010版普及,去除重复值变得简单起来,因为2010版添加了去除复重复值的命令。本文中所涉及的不仅仅简单的去除,而会涉及如何显示重复值,如果用公式提取非重复值等内容。值得大家收藏和学习。
1 高级筛选法。选取数据区域,数据 - 高级筛选 - 选择不重复值的记录。
2 数据透视表法。
用数据透视表无疑是个非常不错的办法,不仅剔除了重复,还可以列出来每项重复了多少次:
3 加辅助列用COUNTIF可以显示出每个出现的次数,但在实际操作过程中这种方法并不实用,倒是可以用在条件格式上,让有重复的一目了然:
4 函数1
假如表头是A1,数据是A2:A24,在C列中用公式:
C2{=OFFSET($A$1,MATCH(,COUNTIF($C$1:C1,$A$2:$A$24),),)&''}
(结果顺排)
其中:
COUNTIF($C$1:C1,$A$2:$A$24)
COUNTIF第二个参数为区域时,这就是个数组函数,返回第二个参数中每个数在第一个区域中个数的一组数。
因为$C$1:C1中没有与数据中相同的值,所以返回的结果是一组均为0的数组;当公式拉至下一个单元格时,因为$C$1:C1变成了$C$1:C2,而C2是与数据中的第一个值相同的,这样就会返回第一个为1其余为0的一组数组;类推……
MATCH(,COUNTIF(),)
这个就是查找0值在COUNTIF这个数组中第一次出现的位置。
OFFSET($A$1,MATCH(),)
以A1为参照,向下偏移。
以上函数源自兰色幻想。
关于主要段结果的数组表:
5 函数2
函数法解决:
假如表头是A1,数据是A2:A24,在C列中用公式:
C2=LOOKUP(2,1/NOT(COUNTIF($C$1:C1,$A$2:$A$24)),$A$2:$A$24)
其中:
COUNTIF($C$1:C1,$A$2:$A$24)
COUNTIF第二个参数为区域时,这就是个数组函数,返回第二个参数中每个数在第一个区域中个数的一组数。
因为$C$1:C1中没有与数据中相同的值,所以返回的结果是一组均为0的数组;当公式拉至下一个单元格时,因为$C$1:C1变成了$C$1:C2,而C2是与数据中的第一个值相同的,这样就会返回第一个为1其余为0的一组数组;类推……
NOT(COUNTIF())
把COUNTIF结果为1的转为0,结果为0的转为1。
1/NOT()
把NOT结果为1的仍保留,结果为0的转为NA
LOOKUP(1/NOT())
利用的LOOKUP模糊查找,最后一个与1对应的位置的值。
以上函数源自Abigale(372014140)
关于主要段结果的数组表:
*注:正确的公式应为Lookup(2,1/...以前写这个公式的时候未正确认识Lookup,给您造成不便,非常抱歉。
6 函数3
假如表头是A1,数据是A2:A24,在C列中用公式:
C1{=IF(SUM(1/COUNTIF($A$1:$A$24,$A$1:$A$24))>=ROW(A1),OFFSET($A$1,SMALL(IF(MATCH($A$1:$A$24,$A$1:$A$24,0)=ROW($A$1:$A$24),ROW($A$1:$A$24)),ROW(A1))-1,),'')}
(结果顺排)
其中:
SUM(1/COUNTIF($A$1:$A$24,$A$1:$A$24))
用来计算不重复个数。
IF(SUM()>=ROW(A1),OFFSET(),'')
利用不重复个数与所在行数之间的关系来假空显示重复个数以外的值。
MATCH($A$1:$A$24,$A$1:$A$24,0)
返回A1:A24内各值位置的排列,每个值都只返回第一次出现的位置。
IF(MATCH()=ROW(),ROW())
利用条件来判断,如果是第一次出现的值,则返回该值所在的行数;如不是第一次出现,返回FALSE(0)。
SMALL(IF(),ROW())
返回IF()所得一系列数组中第N小的一个,N与公式所在行的行号值一致。
OFFSET($A$1,SMALL(),)
返回自A1起向第SMALL()出的结果偏移的值。
以上函数源自小爪(461699029)
关于主要段结果的数组表:
假如表头是A1,数据是A2:A24,在C列中用公式:
C2{=INDEX(A:A,SMALL(IF(FREQUENCY(MATCH($A$2:$A$24,$A$2:$A$24,),MATCH($A$2:$A$24,$A$2:$A$24,)),ROW($A$2:$A$24),65536),ROW(A1)))&''}
其中:
MATCH($A$2:$A$24,$A$2:$A$24,0)
返回A2:A24内各值位置的排列,每个值都只返回第一次出现的位置。
FREQUENCY(MATCH(),MATCH())
返回每个MATCH后的值的出现频次。
IF(FREQUENCY(),ROW(),65536)
当FREQUENCY值不为0时返回相对应的行号,为0时返回65536。
SMALL(IF(),ROW(A1))
返回第N小的值,这个N根据行号的变动而变动。
SMALL所返回的值,也就是数据中第一次出现的值的位置。
INDEX(A:A,SMALL())&''
这个就不用多解释了,后面的&''是为了消除0。
这里不用INDEX,而是用OFFSET($A$1,SMALL()-1,)也可以达到同样效果。
以上函数源自刀狐
关于主要段结果的数组表:
8 EXCEL2007/2010版解决:
9 函数法5:
假如表头是A1,数据是A2:A24,在C列中用公式:
C1{=INDEX($A$2:$A$24,SMALL(IF(MATCH($A$2:$A$24,$A$2:$A$24,)=ROW($A$2:$A$24)-1,ROW($A$2:$A$24)-1,65536),ROW(A1)))} (结果顺排)
其中:
MATCH($A$2:$A$24,$A$2:$A$24,)
返回A1:A24内各值位置的排列,每个值都只返回第一次出现的位置。
MATCH()=ROW($A$2:$A$24)-1
返回一组数,与行号一至时为TRUE,不一致时为FALSE。
IF(,ROW(),65536)
返回一组数,条件为TRUE时为行号,条件为FALSE时为65536。
SMALL(IF(),ROW())
依行号从小到大排列IF所返回的数组。
INDEX($A$2:$A$24,SMALL(),1)
返回A2:A24区域内SMALL所得结果。
当然,除了INDEXT以外,OFFSET/INDIRECT……也是一样用。
以上函数源自展翅
关于主要段结果的数组表:
10 VBA法
Sub M()
Dim myrow As Long
Dim myrng As Range
myrow = Range('a65536').End(xlUp).Row
Set myrng = Range('a1:a' & myrow)
myrng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range('B1'), Unique:=True
End Sub
其实没什么特别的,就是高级筛选而已啦……
11 函数法6:
假设数据在B2:D15区域内
先自定义函数名称AA=T(INDIRECT(TEXT(MOD(SMALL(COLUMN($B$2:$D$15)*10001+ROW($B$2:$D$15)*10,ROW($1:$42)),1000),'R0C0'),))(源自Lukyguy2008)
再设置函数:=INDEX(aa,SMALL(IF(MATCH(aa,aa,)=ROW($B$1:$B$42),ROW($B$1:$B$42),65536),ROW(B1)),1)(数组)下拉
以上公式未消除后面的错误值,如需要消除,需要再套ISERR。
以上公式还有缺陷,即只能用于文本的剔除重复。
关于主要段结果的数组表:
12 合并计算法。
合并计算功能添加多个表格的数据,生成的结果也会除去重复值,留下唯一值。
联系客服