ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Excel查重与去重:条件格式、COUNTIF、数据透视表、删除重复项怎么选

Excel查重与去重:条件格式、COUNTIF、数据透视表、删除重复项怎么选

拿着一张两万行的客户明细表,被同事问“这里面有没有重复的”,这件事我经历过太多次。更麻烦的不是查不出来,而是很多人上来就点“数据”选项卡里的“删除重复项”,点完弹个框说“删除了 13482 个重复值”,然后发现表里只剩三分之一的行,原本该对得上的金额合计直接腰斩。Excel 的重复项处理从来不是“一个按钮解决”的问题,真正决定结果对不对的,是你在动手之前有没有想清楚:你要的到底是把重复的标出来看一眼,还是统计每个值重复了几次,还是只留一条、把多余的清掉。这三种诉求对应的是完全不同的四种操作路径——条件格式、COUNTIF 辅助列、数据透视表、高级筛选与删除重复项。这篇就把这四种方法从操作路径、适用边界、参数逻辑到踩坑细节一次讲透,不管你是刚接手台账的新人,还是天天跟报表打交道的老手,都能直接抄作业。

1. 先分清“标出来”“数清楚”“删干净”是三件事

1.1 三种诉求对应三条完全不同的操作路径

重复项处理最容易被混淆的地方,是把“判断”和“处置”当成一个动作。我习惯把它拆成三层:第一层是感知层,你只需要知道“这张表里有没有重复、重复多不多”,这时候眼睛看、条件格式标色就够了,原表一个字符都不用改;第二层是分析层,你要知道“哪些值重复了、每个重复了几次、重复集中在哪个时间段或哪个业务员名下”,这就需要数字,COUNTIF 或者数据透视表才能给出答案;第三层才是处置层,你要真的删掉多余的记录,只保留一条。

这三层的操作成本、风险等级、可逆性完全不同。感知层和分析层是“只读”的,怎么做都不会破坏数据;处置层是“写”操作,一旦落盘就可能回不去。很多人翻车的根本原因,就是用处置层的方法去做感知层的事——本来只想看看有没有重复,结果直接把表改了。所以我的第一条建议很朴素:在没搞清楚重复的判定粒度之前,任何删除动作都不要在原始数据上做。先复制一个工作表出来,命名成“备份_原始”,所有破坏性操作都在副本上跑,跑完对比数字没问题了,再回头处理正表。

还有一个常被忽略的点:重复的“粒度”是谁定的?一张订单明细表,按整行判断重复和按订单号判断重复,结论可能完全相反。整行重复意味着所有字段都一模一样,那是典型的重复录入;订单号重复但商品行不同,那是正常的一对多关系,删了就是事故。所以动手前先在纸上写一句话:“在这张表里,什么情况下两条记录算同一条?”这句话写不出来,四种方法用了也白用。

1.2 “删除重复项”为什么是最容易出事的那个按钮

我得单独说说这个按钮,因为它是 Excel 里被误用频率最高的功能之一。位置在“数据”选项卡 →“数据工具”组 →“删除重复项”。点开之后会让你勾选“数据包含标题”,然后列出所有列让你勾选判断依据。问题就出在这个勾选上:默认是全选的,全选意味着整行所有字段完全相同才算重复,这个逻辑本身没问题;但很多人为了“快”,只勾了业务主键那一列,结果同一个订单的多条明细被压成一条,金额合计直接少了一大截。

它还有两个隐蔽特性。第一,保留的是“第一次出现”的那条,而且它不会问你要保留哪条。如果你的表是按录入时间倒序排的,那保留的就是最新那条;如果按正序排,保留的就是最早那条。业务上经常需要“保留最新状态”,这时候你必须先按时间排序,让最新记录排在上面,再去点删除,否则留下的就是过期数据。第二,它的结果提示框只弹一次,“发现了 X 个重复值,保留了 Y 个唯一值”,关掉就没有了,事后没人能复现你当时删了多少。我的习惯是先在备份表上跑一遍,把 X 和 Y 两个数字截图或者记到备注里,再回正表操作。

至于可逆性,Ctrl+Z 在当前会话里确实能撤销,但只要你保存关闭、或者中间又做了别的操作把撤销栈冲掉、或者文件放在共享位置别人已经同步走了,就彻底回不去了。合并单元格是另一个雷,带合并单元格的区域执行删除重复项,行为会变得很难预测,删之前先“开始”→“合并后居中”取消合并,把值填满。

2. 条件格式:三十秒让重复值自己跳出来,但它有四个盲区

2.1 操作路径与两个容易选错的参数

这是四种方法里上手最快的一个,也是我给别人演示时第一个教的。路径是:先选中要检查的数据区域(比如 A2:A2000,建议连表头一起选或者干脆用 Ctrl+A 选中整个数据区),然后“开始”选项卡 →“样式”组 →“条件格式”→“突出显示单元格规则”→“重复值”。弹出来的对话框只有两个下拉框,左边选“重复”还是“唯一”,右边选格式。

左边这个下拉框很多人从来没点开过。默认是“重复”,也就是把出现两次以上的值标出来;切成“唯一”就是把只出现一次的值标出来。什么时候用“唯一”?比如你要找“只下过一单的客户”做回访,或者找“只出现过一次的物料编码”排查是不是录错了。这个切换几乎零成本,但知道的人不多。

右边这个格式下拉框,预设的“浅红填充色深红色文本”其实不太醒目,尤其是表里本来就有底色的情况下。点最后一项“自定义格式”,把填充色换成亮黄或者亮橙,字体加粗,视觉冲击力会强很多。另外范围选择有个自动扩展的坑:如果你只选中了一个单元格就点条件格式,Excel 会自动把范围扩展到“当前区域”,而“当前区域”是以空行空列为边界的。如果数据中间有整行空白,扩展出来的范围就会断在空白处,后面那一段根本没被检查,你还以为全表都查过了。所以选中范围这件事,手动框选比让它自动扩展靠谱。

2.2 用公式版条件格式做出“可筛选”的重复标记

预设的“重复值”规则有个局限:它只能标色,你要把这些行单独拎出来复制走,还得靠“筛选 → 按颜色筛选”,这在几百行的时候没问题,几万行的时候体验一般。更灵活的做法是用公式自定义规则。

操作路径:选中 A2:A2000 →“条件格式”→“新建规则”→ 选最后一项“使用公式确定要设置格式的单元格”→ 在框里输入公式 → 点“格式”设置填充色 → 确定。公式这么写:

=COUNTIF($A$2:$A$2000,$A2)>1

这里的引用方式是有讲究的,不是随手加的美元符号。$A$2:$A$2000是统计范围,必须绝对锁定,因为每一行判断时统计的都是同一整列;$A2是当前行的判断值,列锁定、行不锁定,这样规则应用到整列时,每一行判断的都是自己那一格。如果写成$A$2,那就所有行都在跟 A2 比,全表要么全标要么全不标,这是新手最常见的公式错误。

理解了这个结构,多列组合判断就顺手了:

=COUNTIFS($A$2:$A$2000,$A2,$B$2:$B$2000,$B2)>1

意思是“姓名和手机号同时相同”才算重复。这个在客户名单、员工花名册这类场景里比单列判断准确得多,因为重名是常态,重名且重手机号才可疑。

公式版条件格式还有一个隐形好处:标出来的颜色可以直接被“数据”→“筛选”→“按颜色筛选”利用,一键把所有重复行筛出来,Ctrl+C 复制到新表,原表纹丝不动。这条链路我用了很多年,比任何插件都稳。

2.3 条件格式照不出来的四类“假重复”与“真漏网”

条件格式的判断逻辑是“值相等”,而 Excel 对“相等”的定义比你想象中宽松,也比你想的严格,两头都会出问题。

第一类是前后空格。"张三"和"张三 "(尾巴上多一个空格)在条件格式眼里是两个不同的值,不会被标重复,但业务上就是同一个人。这类问题在从系统导出的数据里极其常见,尤其是复制粘贴过来的姓名列。解决办法不是手动删空格,而是加一列清洗:=TRIM(A2),然后把清洗结果选择性粘贴为值覆盖原列。

第二类是不可见字符。TRIM 能去掉普通空格(CHAR(32)),但去不掉不间断空格 CHAR(160)——这个字符从网页或者某些系统导出时特别容易混进来,肉眼看和普通空格一模一样。更彻底的做法是:

=TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160)," ")))

先把这个特殊空格替换成普通空格,再 CLEAN 掉 ASCII 0-31 的不可打印字符(制表符、换行符都在这个范围),最后 TRIM 收尾。这一条公式我基本是当成肌肉记忆在用的。

第三类是全角半角。全角的“A”和半角的“A”、全角的“123”和半角的“123”,Excel 认为是不同的值。用=ASC(A2)可以把全角英文字母和数字转成半角,反过来=WIDECHAR(A2)是转全角。清洗完再查重,准确率立刻上去。

第四类是大小写。这一条比较反直觉:条件格式的“重复值”规则不区分大小写,"ABC"和"abc"会被标成重复。大部分场景这是好事,但如果你在处理区分大小写的编码(比如某些产品序列号),就会误判。要区分大小写,条件格式得换成:

=SUMPRODUCT(--EXACT($A$2:$A$2000,$A2))>1

EXACT 是严格比较函数,区分大小写、不做类型转换,SUMPRODUCT 负责把布尔数组求和。这个公式在几万行数据上会慢一些,用之前心里有数。

反过来还有“真漏网”:两个值业务上不同,但被标成了重复。最典型的是文本型数字和数值型数字。单元格里显示123,一个存成文本、一个存成数值,条件格式会把它们标成重复,但如果你这列是物料编码,00123和123可能是完全不同的两个东西(前导零丢失)。这类问题的判断标准不在 Excel 里,在你的业务规则里,机器给不了答案。

3. COUNTIF 辅助列:把模糊的“好像重复”变成能排序的数字

3.1 三种计数方向,决定你最终保留哪一条记录

条件格式告诉你“是不是重复”,COUNTIF 告诉你“重复了几次、这是第几次”,信息量大一个量级。基础写法是在数据旁边插一列辅助列,B2 输入:

=COUNTIF($A$2:$A$2000,A2)

下拉填充,结果大于 1 的就是重复项。这是最常见的写法,但它回答不了“该删哪一条”的问题。真正实用的是另外两种方向。

从上往下累加:=COUNTIF($A$2:A2,A2)。注意起始单元格是绝对的$A$2,结束单元格是相对的A2,随着下拉,统计范围逐行扩大。结果是“这个值从表头到当前行出现了几次”。第一次出现返回 1,第二次出现返回 2,第三次返回 3。筛选出“大于 1”的行,就是需要删掉的重复行,保留下来的是最早出现的那条。

从下往上累加:=COUNTIF(A2:$A$2000,A2)。起始单元格相对、结束单元格绝对,统计范围逐行收缩。第一次出现(也就是全表最后一次)返回 1,往上依次递增。筛选“大于 1”删掉,保留的是最后出现的那条。

这两者的区别在实际业务里非常关键。假设你在做客户状态表,同一客户有多条记录,一条是三个月前的“待跟进”,一条是上周的“已成交”。如果你用从上往下的写法保留最早那条,留下的就是过期状态;用从下往上的写法保留最新那条,才是对的。前提是你的表按时间正序排,如果表是倒序的,判断方向就得反过来。所以这个技巧有一个前置动作:先确认你的表是按什么顺序排的,顺序不对,方向再对也白搭。

顺带说一个 COUNTIF 的硬伤:判断值超过 255 个字符时,结果不可靠。如果你要查重的是长备注、长地址、整段文本,别用 COUNTIF,换=SUMPRODUCT(--($A$2:$A$2000=A2)),SUMPRODUCT 是全等比较,没有长度限制,代价是慢。

3.2 多列组合查重:连接符选错等于白做

单列查重解决不了“姓名+电话组合判断”的需求,因为重名太常见了。这时候的标准做法是拼一个组合键辅助列:

=A2&"|"&B2&"|"&C2

然后在组合键上做 COUNTIF。这里最容易被忽略的是那个分隔符。如果直接写成=A2&B2,会出现经典的串味问题:A 列是“张”、B 列是“三”,拼出来是“张三”;另一行 A 列是“张三”、B 列是空,拼出来也是“张三”,明明是两个不同的人却被判成重复。加上分隔符"|"之后变成“张|三”和“张三|”,就区分开了。

分隔符的选择也有讲究。理论上最安全的是CHAR(1)这种不可打印字符,因为正常业务数据里不可能出现;但它在界面上完全看不见,事后排查时你会一脸懵,不知道两列之间到底拼了什么。所以我实际工作中一般用"|"、"#"或者"~~",然后在用之前先验证一下数据里确实没有这个字符,方法很简单:在这列上做一次查找,搜~|(波浪号是 Excel 查找通配符的转义符),能搜到就换一个。

还有一个更隐蔽的类型坑。拼接的时候 Excel 会自动把数值转成文本,所以 A 列是文本“1”、B 列是数值 2,拼出来是“12”;另一行 A 列是文本“12”、B 列是空,拼出来也是“12”。要避免这种情况,拼接前先把各列统一成文本格式,或者干脆在每段前后都加分隔符:"|"&A2&"|"&B2&"|",这样结构就固定了,不会错位。

3.3 十万行以上,COUNTIF 会拖垮表格,换成排序比对法

COUNTIF 的算法复杂度是平方级的:每一行都要扫一遍全表。五千行的时候你感觉不到,五万行的时候下拉填充要等十几秒,二十万行的时候 Excel 直接假死,风扇狂转。我吃过这个亏,一张三十万行的流水表,加了三个 COUNTIF 辅助列,整个文件卡到没法操作,最后只能强制结束进程。

大表查重的正确姿势是排序 + 相邻比对。步骤是:先按要查重的列排序(“数据”→“排序”,或者直接点列标题右键排序),然后在旁边加辅助列 B2 写=IF(A2=A1,"重复",""),从 B3 开始下拉(B2 没有上一行可比,留空)。这个公式只比较相邻两行,一次线性扫描,三十万行也是秒出结果。

原理很简单:排序之后,相同的值必然挨在一起,重复项的判断就退化成了“看上一行跟自己一不一样”。排序的复杂度是 O(n log n),比 COUNTIF 的 O(n²) 快几个数量级。

这个方法有两个注意点。第一,排序会打乱原始行序,如果你的表行号有意义(比如行号对应录入顺序),排序前先在旁边加一列序号列,处理完再按序号排回来。第二,Excel 的排序对文本不区分大小写,"ABC"和"abc"会排在一起,而=比较符对文本也不区分大小写,所以相邻比对的结果和 COUNTIF 是一致的,不用额外处理;但如果你的业务需要区分大小写,=就不够用了,得换成=IF(EXACT(A2,A1),"重复","")。

如果是多列组合的大表查重,先把组合键拼好放辅助列,再对辅助列排序比对,逻辑一样,只是多一步。

4. 数据透视表:不只看有没有重复,还要看重复长什么样

4.1 字段摆放顺序决定结果的可读性

数据透视表在查重这件事上被严重低估了。多数人觉得它是做汇总的,其实它的“计数”功能天生就是查重工具,而且它能回答条件格式和 COUNTIF 都回答不了的问题:重复的分布规律是什么。

操作路径:选中数据区域 →“插入”→“数据透视表”→ 选择“新工作表”或“现有工作表”→ 确定。右侧出现字段列表,把要查重的字段拖到“行”区域,再拖一次同一个字段到“值”区域。拖第二次的时候 Excel 可能会默认给你“求和项”,如果这列是文本,自动就变成“计数项”;如果自动识别错了,双击值区域的字段 →“值字段设置”→ 选“计数”。

结果就是一张两列的表:左边是去重后的唯一值列表,右边是每个值出现的次数。按次数列降序排一下,重复最多的排在最上面,一眼就能看出问题规模。

多列场景更能体现它的价值。把“日期”拖到行区域、“客户名称”拖到它下面,再把“客户名称”拖到值区域计数,得到的就是“每天每个客户出现了几次”。行区域字段的先后顺序直接决定分组层级:日期在前,就是先按日分组、日内再按客户细分;客户在前,就是先按客户分组、再看这个客户在哪些日期出现过。做异常排查的时候,前者能定位“哪天出了问题”,后者能定位“哪个客户出了问题”,问的问题不一样,排的顺序就不一样。

透视表还有个杀手级特性:它不改动源数据,而且可以随时切换字段重新组合视角。查完客户名称的重复,想换成手机号的,把行区域的字段拖走换一个就行,不用重新写公式、不用清理辅助列。

4.2 透视表结果的二次利用:排序、筛选、导出

透视表算完之后,那列计数不要浪费。按次数降序排好,用值筛选功能筛出“大于 1”的项(点击行标签的下拉箭头 →“值筛选”→“大于”→ 输入 1),屏幕上剩下的就是完整的重复值清单,直接复制到新表,就是一份干净的“问题名单”。

拿到这份名单之后可以做两件事。一件是回原表标记:把名单放到新的一列,在原表用=COUNTIF(名单区域,A2)或者=VLOOKUP(A2,名单区域,1,0)判断这一行是不是在黑名单里,返回非错误值的就是重复行,筛选出来处理。另一件是做规模判断:如果十万行数据里有八千行重复、且集中在某几个值上,说明是批量导入造成的系统性问题,得回头查导入流程;如果只有零星几十条,那可能是人工录入时的手误,改一改就行。这个判断决定你接下来是“修数据”还是“修流程”,价值远超过单纯把重复标出来。

用透视表有两个坑要知道。第一,空值会单独成行,显示为“(空白)”,如果原表这列有空单元格,那一行的计数可能很大,别把它当成重复项误删,它其实是“没填”。第二,源数据变了要手动刷新,透视表不会自动更新,右键 →“刷新”或者“数据透视表分析”→“刷新”。很多人查完一轮、改了源数据、再看透视表还是老数字,就是因为忘了刷新。

5. 高级筛选与删除重复项:批量出清单与批量清数据

5.1 高级筛选“不重复记录”保留的是哪一条

高级筛选是我最喜欢推荐给需要“出一份去重清单”的场景的方法,因为它是四种方法里唯一能把结果复制到别处、原表完全不动的批量方案。

路径:“数据”选项卡 →“排序和筛选”组 →“高级”。弹窗里有个“方式”选项,选“将筛选结果复制到其他位置”。下面几个框:列表区域填你的数据范围,比如$A$1:$D$2000;条件区域留空(留空表示不加筛选条件,只是去重);复制到填一个空白区域的左上角,比如$F$1;最后勾选“选择不重复的记录”,点确定。

几秒钟后,F 列往右就会出现一份去重后的数据,第一行是表头,下面是唯一值。原表一个单元格都没动,这个安全感是“删除重复项”给不了的。

但它的保留逻辑需要特别注意:保留的是排序后“第一次出现”的那条。这跟“删除重复项”的底层逻辑是一样的。所以如果你需要保留最新记录,还是那个老规矩——先按时间倒序排,让最新的行排在最前面,再做高级筛选,复制出来的就是最新状态的那一条。

设置的时候有两个细节容易出错。一个是“复制到”的位置必须是空白的,如果目标区域原来有数据,高级筛选会直接覆盖而且不弹任何提示,覆盖完就没了。另一个是列表区域一定要包含表头,否则 Excel 会把第一行数据当成标题,结果里少一行,你还以为是筛选逻辑出了问题。

至于它区分不区分大小写,答案是不区分。高级筛选的“不重复”判断基于值相等,"ABC"和"abc"会被当成同一个值合并掉。如果你的场景需要区分,这条路走不通,得回到 COUNTIF + EXACT 的组合。

5.2 删除重复项的勾选逻辑,勾错一列全盘皆输

再回来说这个“危险按钮”,这次说清楚它到底怎么勾。弹窗里第一项是“数据包含标题”,如果第一行是表头就勾上,这样表头不会被当成数据参与判断;如果不勾,Excel 会把表头也算成一条记录,结果里可能出现一行“姓名”混在数据里。

下面的列清单是判断依据,勾哪些列,意思就是“这些列的值全部相同才算重复”。全勾 = 整行完全一致才算重复,这是最安全的默认状态,适合清理“同一份数据被导入了两次”这种场景。只勾一列 = 只要这一列相同就算重复,其他列的值会被无视,只保留第一次出现那行的其他列内容,这是最容易出事故的勾法。

举个具体的例子。一张销售明细表,列有“订单号、商品名、数量、单价、金额”,一个订单对应三个商品,三行记录的订单号相同。如果只勾“订单号”去重,结果是三行变一行,这张订单只剩下一个商品,金额合计直接少了三分之二。正确的做法是勾“订单号+商品名”两列,或者干脆全勾。这个道理说起来简单,但真正在实操中,看到弹窗里一长串列名、想快点搞定的时候,手很容易滑。

我给自己定了个硬规矩:执行删除重复项之前,先在备份表上跑一遍,把提示框里的“发现 X 个重复值、保留 Y 个唯一值”两个数字记下来;然后回到正表,把勾选状态截图或者口述确认一遍,再执行。两次结果必须一致。这个习惯帮我避开了至少两次数据事故。听起来有点繁琐,但跟事后重做一遍报表比起来,这点时间不值一提。

还有个小细节:删除重复项之后,那些被删掉的行不会留下任何痕迹,行号会直接跳过去。如果你后续要跟别人解释“为什么少了这些行”,没有记录是说不清的。所以在原始数据旁边加一列序号,或者干脆保留一份带时间戳的备份,是处理这类问题的基本素养。

6. 查重之前先洗数据:不做这一步,四种方法全会失灵

6.1 空格、不可见字符与全半角,是三种最常见的“假不重复”

前面几节反复提到清洗,这里单独拉出来讲,因为它不是可选项,而是前置条件。四种查重方法全部基于“值相等”这个判断,而 Excel 的“相等”是逐字符比较。两个值在业务上明明是同一个人、同一个东西,只要存储上有任何一个字符的差异,所有方法都会告诉你“不重复”。这一类问题我统称为“假不重复”,它比“假重复”更危险,因为假重复你会去核对,假不重复你会直接放过。

普通空格用=TRIM(A2)处理,它去掉首尾空格并且把中间的连续空格压成一个。注意 TRIM 只认 ASCII 32,不认别的。

不可见字符是重灾区。CHAR(160) 不间断空格从网页复制时最容易带进来,CHAR(9) 制表符在文本导入时常见,还有 CHAR(10) 换行符。这三个 TRIM 都搞不定。通用清洗公式是:

=TRIM(CLEAN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,CHAR(160)," "),CHAR(9)," "),CHAR(10)," ")))

看着长,但逻辑很直白:先把三种常见的不见字符换成普通空格,再 CLEAN 掉剩下的不可打印字符,最后 TRIM 收尾。用的时候在旁边插一列,公式下拉,然后复制 → 右键 →“选择性粘贴 → 值”覆盖原列,最后把辅助列删掉。顺序别搞反,先粘值再删辅助列。

全角半角用=ASC(A2)统一转成半角,这个函数对英文字母、数字、部分标点都有效,但对汉字无效(也不需要)。注意全角空格 CHAR(12288) 不在 ASC 的处理范围内,得单独用 SUBSTITUTE 换掉。

这三种处理完之后,再做一次查重,你会发现之前标不出来的重复项突然冒出来一大堆。这不是方法变了,是数据终于统一了。

6.2 文本型数字与大小写统一,决定查重的最终准确率

文本型数字是另一个隐形杀手。判断方法很简单:选中这列,看有没有单元格左上角带绿色小三角,或者用=ISTEXT(A2)判断。带绿三角的就是“看起来是数字、实际存成了文本”。

这种数据混在一列里,查重结果会非常诡异:文本“123”和数值 123 会被 COUNTIF 判成重复(因为 Excel 比较时会做隐式类型转换),条件格式也会标成重复,但排序的时候它们又会被分到不同位置,相邻比对法就失效了。更麻烦的是 VLOOKUP,文本型“123”去匹配数值型 123 会返回 #N/A。

统一的方法有两种。一种最快:选中整列 →“数据”→“分列”→ 什么都不改,直接点“完成”。Excel 会重新识别一遍数据类型,把文本型数字批量转成数值。另一种用公式:=VALUE(A2)或者=A2*1,转完再粘值覆盖。

但这里要留个心眼:不是所有数字都该转成数值。像工号“00123”、物料编码“0004567”这种带前导零的编号,本来就是文本,转成数值会把前导零吃掉,变成 123 和 4567,反而制造了新的重复。编号类列应该保持文本格式,要统一就统一成文本,用=TEXT(A2,"0")或者干脆设成“文本”格式再录入。

大小写统一用=UPPER(A2)全部转大写,或者=LOWER(A2)全部转小写,视业务习惯而定。虽然 COUNTIF 和条件格式本身不区分大小写,但排序比对法里如果用了 EXACT,或者你后续要把数据导到别的系统里做匹配,统一大小写能省掉很多麻烦。

清洗的完整顺序我建议这么走:先不可见字符和空格(SUBSTITUTE + CLEAN + TRIM)→ 再全角转半角(ASC)→ 再统一大小写(UPPER/LOWER)→ 最后统一数据类型(文本还是数值,按业务定)→ 然后才进入查重环节。这个顺序不是随便排的,先清字符再转格式,否则类型转换之后可能又产生新的空格或者字符问题。

7. 四种方法怎么选:一张对照表加一套组合拳

7.1 按诉求选方法,别按习惯选

聊完四种方法,最后落到“什么时候用哪个”。我把常见的诉求和对应的首选方法整理成一张表,照着对号入座就行。

你要解决的问题首选方法大概耗时是否改动原表关键注意点
快速确认有没有重复条件格式-重复值30 秒否选中范围要手动框选,别依赖自动扩展
把重复行筛出来复制走条件格式-公式版 + 按颜色筛选2 分钟否公式的绝对/相对引用别写错
知道每个值重复几次数据透视表-计数1 分钟否源数据变动后要手动刷新
保留首次出现、标记其余COUNTIF 从上往下累加2 分钟加辅助列先确认表的排序方向
保留最后出现、标记其余COUNTIF 从下往上累加2 分钟加辅助列表若倒序,方向要反过来
多列组合判断重复拼接辅助列 + COUNTIF3 分钟加辅助列分隔符要选数据里没有的字符
导出一份去重后的清单高级筛选-不重复记录1 分钟否复制目标区域必须是空白
直接清理源表删除重复项30 秒是,需备份勾选列的粒度决定生死
几十万行大表查重排序 + 相邻比对2 分钟否先加序号列,方便排回原序

看完这张表你会发现,除了最后一行“删除重复项”,其他所有方法都是不破坏原表的。这也是我一直在强调的:把“看”和“改”分开,先看清楚,再动手改。

7.2 我实际工作中的标准流程

最后分享一下我自己处理一张陌生数据表的完整链路,这套流程跑了几年,基本没出过事。

第一步,复制备份。在底部工作表标签上右键 →“移动或复制”→ 勾选“建立副本”,把副本拖到最前面,命名成“备份_日期”。这一步花五秒钟,能救命。

第二步,清洗。按 6.2 的顺序走一遍:SUBSTITUTE + CLEAN + TRIM 去字符、ASC 转半角、UPPER 统一大小写、按业务判断是否转数值。清洗完的辅助列选择性粘贴为值,覆盖原列,删掉辅助列。

第三步,条件格式探规模。先选中关键列,套一次“重复值”规则。这一步不打数字,纯粹是用眼睛估一下重复的比例。如果标出来一片红,说明是系统性问题,得往上游查;如果只有零星几个,那基本是录入手误。

第四步,透视表看分布。如果重复量大,用数据透视表把计数拉出来,降序排,看集中在哪几个值上。这一步决定后续是“按业务规则处理”还是“按主键直接去重”。

第五步,辅助列定序。确定要保留哪一条之后,用 COUNTIF 累加辅助列标出“第几次出现”,需要保留最新的用从下往上的写法,需要保留最早的用从上往下的写法。这时候千万别急着删,先筛选出来数一数,跟透视表的数字对一下,对得上再往下走。

第六步,高级筛选出清单。如果要把重复项交给别人确认,用高级筛选把去重后的清单复制到新表,或者把重复项筛选出来单独存一张表。原表始终保持不动。

第七步,最后才动刀。所有确认工作做完,在备份表上跑一遍“删除重复项”,记录 X 和 Y 两个数字,跟前面统计的对得上,再回正表执行。

这套流程看着步骤多,实际操作下来一张两万行的表也就十几分钟。真正花时间的永远不是点按钮,而是想清楚“哪个算重复”。

我个人在这些年操作里最看重的一个习惯是:辅助列永远不删。每次查重加的 COUNTIF 列、拼接列、序号列,我倾向于留着,命名成“查重_第几次”“组合键”“行号”。理由是这笔账迟早有人要复查——领导会问“这些行为什么删了”,同事会问“你当时按什么规则判断的”。有这几列在,答案就写在表上,不用凭记忆复述。表格文件大个几兆不算什么,说不清才麻烦。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进