前置说明
在Excel数据处理中,去重是最常用的操作之一。本文汇总了Excel中所有常用的去重方法,包括内置功能、公式法、条件格式、Power Query等,并对核心公式进行逐段详细解析,帮助你深入理解原理、灵活运用。
本文示例数据均假设存储在A列(A2:A100),实际使用时请根据数据范围修改单元格引用。
一、删除重复值(Excel内置功能)
这是最简单直接的去重方法,适合快速删除重复数据。
操作步骤
1. 选中需要去重的数据区域(如A1:A100)
2. 点击「数据」选项卡 → 「数据工具」组 → 「删除重复值」
3. 在弹出的对话框中选择去重依据的列
4. 点击确定,Excel会自动删除重复行,保留唯一值
适用场景
● 数据量不大,需要快速去重
● 不需要保留原始数据,直接修改原表
● 多列组合去重(如姓名+身份证号同时重复才算重复)
【注意】此方法会直接修改原始数据,建议操作前先备份数据。如需保留原数据,可先复制一份再操作。
二、高级筛选去重
高级筛选可以在不修改原数据的情况下,将不重复值提取到新的位置。
操作步骤
1. 选中数据区域(包含表头)
2. 点击「数据」选项卡 → 「排序和筛选」组 → 「高级」
3. 选择「将筛选结果复制到其他位置」
4. 勾选「选择不重复的记录」
5. 在「复制到」中选择目标位置的起始单元格
6. 点击确定
优缺点
● 优点:不破坏原数据,可将结果提取到指定位置
● 缺点:需要手动操作,数据更新后需重新筛选
三、条件格式高亮重复值
使用条件格式可以将重复值用不同颜色标记出来,直观展示重复情况,不删除数据。
高亮所有重复值
=COUNTIF($A:$A,A2)>1
设置方法
1. 选中数据区域(如A2:A100)
2. 开始 → 条件格式 → 新建规则 → 使用公式确定要设置格式的单元格
3. 输入上述公式
4. 设置填充色为浅红色(或其他醒目颜色)
5. 确定
公式解析
COUNTIF($A:$A,A2)
统计A列中等于A2单元格内容的单元格数量。$A:$A是绝对引用整列,确保公式向下复制时统计范围不变;A2是相对引用,向下复制时会自动变为A3、A4……
>1
判断统计结果是否大于1。如果大于1,说明该值出现了至少两次,即为重复值,条件格式生效。
只高亮重复出现的(首次不标)
=COUNTIF($A$2:A2,A2)>1
此公式的特点是统计范围的起始行固定($A$2),结束行随公式位置变化(A2)。这样只有第二次及以后出现的重复值才会被标记,第一次出现的不标记,方便快速定位需要删除的重复项。
四、COUNTIF判断重复(公式法)
使用COUNTIF函数可以在辅助列中标记每个值是否重复,是最基础、最常用的去重判断公式。
基础公式:统计出现次数
=COUNTIF($A$2:$A$100,A2)
公式逐段解析
1. COUNTIF(范围, 条件):条件计数函数,统计指定范围内满足条件的单元格数量。
2. $A$2:$A$100:绝对引用的数据范围,$符号锁定行和列,公式向下复制时范围不变。
3. A2:相对引用的条件单元格,向下复制时自动变为A3、A4……
4. 返回结果:该值在范围内出现的总次数。1表示唯一,2及以上表示重复。
进阶:直接显示「重复」或「不重复」
=IF(COUNTIF($A$2:$A$100,A2)>1,"重复","不重复")
用IF函数对COUNTIF的结果做判断:出现次数大于1则显示「重复」,否则显示「不重复」。结果更直观,便于筛选。
进阶:标记首次出现和重复项
=IF(COUNTIF($A$2:A2,A2)=1,"首次","重复")
公式解析
这个公式的关键在于统计范围是「混合引用」:$A$2是绝对引用(固定起始行),A2是相对引用(随公式位置变化)。
● 在B2单元格时,统计范围是$A$2:A2,即只看A2自己,结果为1,显示「首次」
● 在B3单元格时,统计范围是$A$2:A3,即看A2到A3,如果A3的值在前面出现过,结果就大于1,显示「重复」
● 以此类推,每个值第一次出现时标记为「首次」,之后出现的都标记为「重复」
【注意】此方法非常实用,标记后筛选「首次」即可得到不重复值,筛选「重复」可快速定位需要删除的行。
五、提取不重复值(经典INDEX+MATCH公式)
这是Excel中最经典的提取不重复值公式,适用于所有Excel版本,无需365新函数。公式较为复杂,下面逐段详细解析。
公式(数组公式,旧版需按Ctrl+Shift+Enter)
=INDEX($A$2:$A$100,MATCH(0,COUNTIF($B$1:B1,$A$2:$A$100),0))
使用方法
1. 在B2单元格输入公式(旧版Excel需按Ctrl+Shift+Enter三键确认)
2. 向下拖动填充,直到出现#N/A错误为止
3. 出现#N/A表示不重复值已全部提取完毕
公式逐段解析(从内到外)
第一层:COUNTIF($B$1:B1, $A$2:$A$100)
这是整个公式的核心,也是最难理解的部分。COUNTIF在这里是数组运算,它会逐个检查A列的每个值是否已经出现在上方的结果列(B列)中。
● $B$1:B1:已提取结果的范围。$B$1固定起始行(通常是表头),B1随公式向下复制而扩展,形成一个不断增长的「已提取列表」
● $A$2:$A$100:原始数据范围,绝对引用保持不变
● 返回结果:一个由0和1组成的数组。0表示该值还没被提取过(首次出现),1表示已经提取过了
举例说明:假设A列数据是「苹果,香蕉,苹果,橙子,香蕉」,在B2(第一个结果)时:
● 已提取范围$B$1:B1是空的(B1是表头)
● COUNTIF返回数组:{0, 0, 0, 0, 0} —— 所有值都没被提取过
在B3(第二个结果)时,假设B2已经提取了「苹果」:
● 已提取范围$B$1:B2包含「苹果」
● COUNTIF返回数组:{1, 0, 1, 0, 0} —— 「苹果」已经出现过(标记为1),其他还没出现(标记为0)
第二层:MATCH(0, COUNTIF结果, 0)
MATCH函数在COUNTIF返回的0/1数组中查找第一个0的位置。
● 0:查找值,即找「还没被提取过」的值
● COUNTIF结果:0和1组成的数组
● 第三个参数0:精确匹配
● 返回结果:第一个0在数组中的位置(第几个)
继续上面的例子,数组{1, 0, 1, 0, 0}中第一个0出现在第2位,所以MATCH返回2。
第三层:INDEX($A$2:$A$100, MATCH结果)
INDEX函数根据MATCH返回的位置号,从原始数据中取出对应的值。
● $A$2:$A$100:原始数据范围
● MATCH返回的位置号:第几个未提取的值
● 返回结果:该位置对应的原始数据,即下一个不重复值
上面例子中MATCH返回2,INDEX就取出A列第2个值「香蕉」,这就是第二个不重复值。
防错优化版(不显示#N/A)
=IFERROR(INDEX($A$2:$A$100,MATCH(0,COUNTIF($B$1:B1,$A$2:$A$100),0)),"")
用IFERROR包裹,当提取完毕出现#N/A错误时,显示为空文本,表格更美观。
【注意】此公式是数组公式,Excel 2019及更早版本必须按Ctrl+Shift+Enter三键确认才能正确计算;Excel 365和2021支持动态数组,直接回车即可。
六、LOOKUP提取不重复值
LOOKUP也可以实现提取不重复值,写法略有不同,但原理与INDEX+MATCH类似。
公式
=LOOKUP(1,0/(COUNTIF($B$1:B1,$A$2:$A$100)=0),$A$2:$A$100)
公式解析
COUNTIF($B$1:B1,$A$2:$A$100)=0
和前面一样,生成一个由TRUE/FALSE组成的数组,TRUE表示该值还没被提取过(计数为0)。
0/(...)
用0除以TRUE/FALSE数组。在Excel中,TRUE相当于1,FALSE相当于0,所以:
● 0/TRUE = 0/1 = 0(未提取过的值对应0)
● 0/FALSE = 0/0 = #DIV/0!(已提取过的值对应错误值)
结果是一个由0和#DIV/0!错误组成的数组。
LOOKUP(1, 0/..., 原始数据)
LOOKUP在数组中查找1。由于数组中只有0和错误值,没有1,LOOKUP会自动找到最后一个小于查找值的有效数据(即最后一个0),并返回对应位置的原始数据。
【注意】LOOKUP法的特点是找「最后一个」未提取的值,而INDEX+MATCH法找「第一个」未提取的值。结果都是不重复值,只是提取顺序可能不同。
七、Excel 365 UNIQUE函数(最简单)
如果你使用的是Excel 365或Excel 2021及以上版本,UNIQUE函数是提取不重复值最简单的方法,一个公式搞定,自动溢出结果。
基础用法
=UNIQUE(A2:A100)
只需在第一个单元格输入此公式,所有不重复值会自动向下溢出,无需拖动填充。
参数详解
=UNIQUE(array, [by_col], [exactly_once])
● array:要去重的数据范围(必需)
● by_col:可选,按列去重(TRUE)还是按行去重(FALSE,默认)
● exactly_once:可选,TRUE表示只返回恰好出现一次的值(即完全不重复的),FALSE返回所有不重复值(默认)
只返回出现过一次的值(真正的「唯一值」)
=UNIQUE(A2:A100,,TRUE)
第三个参数设为TRUE时,只返回在数据中恰好出现一次的值。注意这和「不重复值」不同:不重复值是每个值保留一个(不管原来出现几次);恰好出现一次是指原来就只出现过一次的值。
多列去重
=UNIQUE(A2:B100)
直接选择多列范围,UNIQUE会自动按多列组合去重,只有两列都相同才算重复。
结合其他函数的高级用法
提取不重复值并排序
=SORT(UNIQUE(A2:A100))
统计不重复值的个数
=COUNTA(UNIQUE(A2:A100))
按条件提取不重复值
=UNIQUE(FILTER(A2:A100,B2:B100="条件"))
【注意】UNIQUE是动态数组函数,仅Excel 365和Excel 2021及以上版本支持。旧版Excel请使用前面的INDEX+MATCH方法。
八、多条件去重
实际工作中经常需要按多列组合判断重复(如姓名+部门同时相同才算重复),即多条件去重。
COUNTIFS多条件判断重复
=COUNTIFS($A$2:$A$100,A2,$B$2:$B$100,B2)
COUNTIFS是多条件计数函数,语法与COUNTIF类似,只是可以同时指定多个条件范围和条件。只有所有条件都满足时才计数。
多条件标记首次出现
=IF(COUNTIFS($A$2:A2,A2,$B$2:B2,B2)=1,"首次","重复")
原理与单条件的COUNTIF标记法相同,只是把条件从一个扩展为多个。筛选「首次」即可得到多条件组合的不重复数据。
多条件提取不重复值(365版)
=UNIQUE(A2:B100)
Excel 365中直接使用UNIQUE选择多列即可,非常简单。
多条件提取不重复值(通用版)
=INDEX($A$2:$A$100,MATCH(0,COUNTIFS($C$1:C1,$A$2:$A$100,$D$1:D1,$B$2:$B$100),0))
将单条件公式中的COUNTIF换成COUNTIFS,增加对应的条件列即可。原理完全相同,只是条件从一个变成多个。
九、高亮显示重复项(条件格式)
除了用公式在辅助列标记,还可以用条件格式直接在原数据上高亮重复值,视觉效果更直观。
快速标记重复值(内置规则)
1. 选中数据区域
2. 开始 → 条件格式 → 突出显示单元格规则 → 重复值
3. 选择样式(默认浅红填充深红色文本)
4. 确定
这是最快的方法,无需写公式,适合快速查看重复情况。
自定义公式标记重复(更灵活)
=COUNTIF($A:$A,A2)>1
用自定义公式可以实现更灵活的标记规则,比如只标记重复出现3次以上的、只标记特定列的重复等。
整行高亮重复
=COUNTIF($A:$A,$A2)>1
选中整行数据区域(如A2:D100),输入此公式,即可实现A列重复时整行高亮。注意$A2是列绝对引用、行相对引用,确保每一行都判断A列的值。
十、Power Query去重
Power Query是Excel中的数据处理利器,去重功能强大且支持刷新,适合数据量大、需要定期更新的场景。
操作步骤
1. 选中数据区域 → 数据 → 从表格/区域(将数据加载到Power Query)
2. 在Power Query编辑器中,选中要去重的列(按住Ctrl可多选)
3. 右键 → 移除重复项(或点击「开始」选项卡 → 移除重复项)
4. 关闭并上载 → 选择上载位置
优点
● 处理大数据量速度快,比公式高效
● 数据源更新后只需右键刷新即可,无需重新操作
● 支持多列组合去重
● 不破坏原始数据
【注意】Power Query在Excel 2016及以上版本是内置功能,Excel 2010/2013需要安装插件。
十一、数据透视表去重
数据透视表也可以快速提取不重复值,方法是将字段拖入行区域,透视表会自动合并相同项。
操作步骤
1. 选中数据 → 插入 → 数据透视表
2. 将需要去重的字段拖到「行」区域
3. 透视表的行标签就是去重后的结果
4. 如需复制为普通数据,可复制 → 选择性粘贴 → 值
适用场景
● 快速查看有哪些不重复项
● 同时需要统计每个值出现的次数(将字段同时拖到值区域)
● 数据量大,公式计算慢时
十二、VBA去重
对于复杂的去重需求或需要自动化的场景,可以使用VBA编写代码实现去重。
简单示例:删除A列重复值
Sub 去重()Range("A1:A100").RemoveDuplicates Columns:=1, Header:=xlYesEnd Sub
这是VBA中最简单的去重方法,直接调用RemoveDuplicates方法,和Excel内置的「删除重复值」功能效果相同。
提取不重复值到新列
Sub 提取不重复值()Dim dict As Object, cell As RangeSet dict = CreateObject("Scripting.Dictionary")For Each cell In Range("A2:A100")If Not dict.exists(cell.Value) Then dict.Add cell.Value, ""NextRange("B2").Resize(dict.Count) = Application.Transpose(dict.keys)End Sub
使用字典对象(Dictionary)提取不重复值,效率高,适合大数据量。
【注意】VBA适合有编程基础的用户,或需要自动化批量处理的场景。普通用户掌握前面的公式和内置功能即可应对大多数情况。
十三、方法对比与选择建议
各方法对比表
下面汇总各种去重方法的特点,方便你根据实际场景选择最合适的方法。
方法 | 难度 | 是否改原数据 | 适用场景 |
删除重复值 | ★☆☆☆☆ | 是 | 快速删除、数据量小 |
高级筛选 | ★★☆☆☆ | 否 | 提取到新位置、不常更新 |
COUNTIF判断 | ★★☆☆☆ | 否 | 标记重复、灵活筛选 |
INDEX+MATCH提取 | ★★★★☆ | 否 | 所有Excel版本、自动提取 |
UNIQUE函数 | ★☆☆☆☆ | 否 | Excel 365、最简单 |
条件格式高亮 | ★★☆☆☆ | 否 | 直观展示、不删数据 |
Power Query | ★★★☆☆ | 否 | 大数据量、需刷新 |
数据透视表 | ★★☆☆☆ | 否 | 快速查看、同时统计 |
VBA | ★★★★★ | 可选 | 自动化、复杂需求 |
选择建议
1. 只是想快速删掉重复:用「删除重复值」,最快
2. 想保留原数据,提取不重复值:Excel 365用UNIQUE,旧版用INDEX+MATCH
3. 想看看哪些重复了,不删除:用条件格式高亮
4. 数据量很大(上万行):用Power Query,速度快
5. 需要定期更新数据:用Power Query,一键刷新
6. 多列组合去重:以上方法大多支持,选你最熟悉的
十四、常见问题与技巧
为什么去重后还有重复?
● 可能存在空格:看似相同的内容,实际一个有空格一个没有。用TRIM函数去除首尾空格后再去重
● 可能存在不可见字符:用CLEAN函数清除不可见字符
● 大小写不同:Excel默认区分大小写吗?默认不区分,但某些情况下可能有差异。可用UPPER统一转大写后再比较
● 数字格式不同:一个是文本型数字,一个是数值型数字。用VALUE函数统一转换
去重前的数据清洗建议
=TRIM(CLEAN(A2))
去重前建议先用TRIM去除首尾空格、CLEAN清除不可见字符,确保数据干净,避免「看起来一样实际不一样」的假重复。
统计不重复值的个数
方法一:SUMPRODUCT+COUNTIF(通用)
=SUMPRODUCT(1/COUNTIF(A2:A100,A2:A100))
这是经典的不重复计数公式。原理:每个值出现n次,1/n就是1/n,n个加起来就是1,所有值加起来就是不重复值的个数。
方法二:COUNTA+UNIQUE(365版)
=COUNTA(UNIQUE(A2:A100))
Excel 365中最简单的写法,先用UNIQUE提取不重复值,再用COUNTA计数。
提取不重复值并按出现次数排序
=SORTBY(UNIQUE(A2:A100),COUNTIF(A2:A100,UNIQUE(A2:A100)),-1)
Excel 365中可用此公式,提取不重复值并按出现次数从多到少排序,方便快速找出高频项。
总结
Excel去重的方法很多,从最简单的内置功能到复杂的数组公式、VBA代码,各有适用场景。掌握以下核心即可应对绝大多数情况:
● 快速删除:删除重复值按钮
● 标记判断:COUNTIF/COUNTIFS公式
● 提取不重复值:365用UNIQUE,旧版用INDEX+MATCH
● 直观展示:条件格式高亮
● 大数据/需刷新:Power Query
选择方法时,优先考虑简单、易维护的方案,能用内置功能就不用公式,能用简单公式就不用复杂公式,确保自己和同事都能看懂和维护。