Excel VBA编程-一键删除重复行(只保留一条)
- 2026-11-05 16:00:52
Excel VBA编程-一键删除重复行(只保留一条)
上一讲我们学会了用 VBA「按条件批量删除行」,把"部门=已离职"这类不想要的行就地清掉。但办公里还有另一类高频痛点:一张大表里混进了完全一样的重复记录——同一笔单号录了两次、同一个客户躺了三行——手动一行行找、一行行删,又慢又容易漏。
这一讲我们从网络上整理了一批 Excel VBA「删除重复行」的实用技巧,核心就一句话:用 Excel 自带的 RemoveDuplicates 去重能力,把"完全相同的记录"一键清理掉、只保留第一条。这套做法在国内外都被公认为最省事、最稳的去重办法,我们来拆解一下大家公认的要点:
ExcelMojo 的标准写法: Range.RemoveDuplicates Columns:=1, Header:=xlYes一行就搞定——Columns指定"按哪一列判断重复",Header告诉 Excel 第一行是不是表头。单列传数字(如Columns:=1表示 A 列),多列则传入列号数组。Automate Excel 的提醒: RemoveDuplicates其实就是 Excel 界面里「数据 → 删除重复项」那个按钮的代码版;两个参数其实都可省,但不写Columns就什么都不会删,所以列号一定要给。ExcelMaster.ai 的两点忠告(很重要):① 它是"原地删除、保留第一条、运行后无法撤销"的破坏性操作,动手前一定先备份;② Columns是从"所选范围"左边算起的第几列,如果范围从 A 列起,列号刚好等于表格列号,一旦范围从别的列起就要小心数错——本篇范围都用UsedRange(从 A 列起),所以列号直接写 1、2、3 最稳妥。CSDN 实战经验:去重时不区分大小写("Apple"和"apple"算重复),但单元格前后的空格会被当成不同内容,所以数据最好先清理空格。
把这些经验揉到一起,我们这篇只讲一个核心套路:指定"按哪列判断重复" → RemoveDuplicates 一键去重、只留第一条 → 其余数据原封不动往上挪。下面用 3 个由浅入深的案例带你走一遍。
(小前提:下面所有代码都假设你当前打开的表里,第 1 行是表头、从 A 列起是数据。运行前先把要处理的那张表点成「当前表」。动手删数据前,强烈建议先另存一份副本!)
案例一(简单):一键删除 A 列里重复的行(只留第一条)
功能说明 这是最基础的「按列去重」。你只要把数据摆在当前表(假设 A 列是"姓名"或"单号"),运行这一段,Excel 就会按「A 列内容相同」把后面重复的行一次性删掉,只保留第一次出现的那一条,其余行自动往上补位。第一次试,强烈建议先把数据做一份副本再运行。
代码
Sub 一键删除重复行_按A列() ' 当前表:第1行表头,A列起数据 ' 按 A 列(第1列)判断重复,删掉重复行,只留第一条 Dim 表 As Worksheet Set 表 = ActiveSheet ' UsedRange 自动识别"有数据的范围"(从A列起算) ' Columns:=1 表示只看第1列(A列)是否重复 ' Header:=xlYes 表示第一行是表头,不参与比较 表.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes MsgBox "重复行已经清理完成,只保留了第一条!", vbInformationEnd Sub操作步骤
在 Excel 里准备好一张表:第 1 行写表头(A1 姓名、B1 金额、C1 地区……),第 2 行起每行一条数据,A 列里至少有几行是重复的名字/单号方便测试。 按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」,把上面的代码整段粘进去。回到 Excel,点一下你的数据表让它成为「当前表」,按 Alt + F8,选中「一键删除重复行_按A列」,点「运行」。程序会把 A 列里重复的行一次性删掉、只留第一条;A 列原本没有重复时,会提示"清理完成",原表不会发生任何改变。 想按别的列去重?把代码里的 Columns:=1改成Columns:=2(按 B 列)、Columns:=3(按 C 列)再运行即可。
小提示:本篇的
RemoveDuplicates和上一讲「按条件删行」不一样——上一讲要你先筛选再删,本篇是 Excel 自带的"删除重复项",一行RemoveDuplicates直接把完全相同的记录清掉,省掉了筛选那一步。Columns:=1代表"只看 A 列",A 列相同的行就算其他列不一样,也只留第一条。
案例二(中等):运行时输入列号,按你选的列去重
功能说明 案例一的列号写死在代码里。这个案例改成:运行后弹一个框,让你输入「要按第几列判断重复」(1 = A 列,2 = B 列……),比如列号填 3、就按第 3 列去重。这样同一段代码能按任意列去重,不用每次改代码。删完还会告诉你按的是哪一列。
代码
Sub 一键删除重复行_自选列() ' 运行时输入:要按第几列判断重复,删掉重复行只留第一条 Dim 表 As Worksheet Set 表 = ActiveSheet ' 让你输入用哪一列判断重复(1 代表 A 列,2 代表 B 列……) Dim 列号 As Integer 列号 = Val(InputBox("请输入要按第几列判断重复:" & vbCrLf & _ "(1 = A 列,2 = B 列,以此类推)", "选择判断列")) ' 如果没输入有效数字,就退出,不乱删 If 列号 < 1 Then MsgBox "没有输入有效列号,已取消。", vbExclamation Exit Sub End If ' 按你选的列删重复,保留第一条 表.UsedRange.RemoveDuplicates Columns:=列号, Header:=xlYes MsgBox "已按第 " & 列号 & " 列清理完重复行,只留第一条!", vbInformationEnd Sub操作步骤
把代码粘进同一个模块(和案例一放在一起也行)。 回到 Excel,点一下数据表让它成为「当前表」,按 Alt + F8运行「一键删除重复行_自选列」。弹出的框里输入要按第几列去重(比如金额在第 3 列就填 3),点「确定」。程序按你给的列把重复行一次性删掉、只留第一条,并提示按的是哪一列。 框里留空、或填成 0 / 非数字,程序会提示「已取消」并自动停下,不会乱删。
关键点:
InputBox弹出的文字先用列号存起来(用Val把文字转成数字),再用Columns:=列号当成去重依据的列。整段逻辑和案例一完全一样,只是列号由你运行时临时给,更灵活。
案例三(实用小案例):先数出重复条数再删,并报告"保留/删除"数量
功能说明 真实场景里,删之前你往往想知道"到底混进来多少重复、清完还剩多少条"。这个案例会在删除前先数一遍原有数据条数,删完再数一遍剩余条数,用两者的差算出"删掉多少条",最后弹一份小报告:原来多少条、删除多少条、保留多少条。心里有数,才敢下手。
代码
Sub 一键删除重复行_带报告() ' 删除前先数原有条数,删除后再数剩余条数,报告"保留/删除"数量 ' 按 A 列(第1列)去重,只保留第一条 Dim 表 As Worksheet Set 表 = ActiveSheet ' 先算出数据一共有多少行(不含表头) ' 从 A 列最下面往上找到最后一行 Dim 最后一行 As Long 最后一行 = 表.Cells(表.Rows.Count, 1).End(xlUp).Row ' 原来有多少条数据(总行数减掉表头那一行) Dim 原条数 As Long 原条数 = 最后一行 - 1 If 原条数 < 1 Then MsgBox "当前表没有数据,不需要清理。", vbExclamation Exit Sub End If ' 删除 A 列的重复行,只保留第一条 表.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes ' 删除后再数一遍剩下多少条 Dim 剩条数 As Long 剩条数 = 表.Cells(表.Rows.Count, 1).End(xlUp).Row - 1 ' 算出删掉了多少条 Dim 删条数 As Long 删条数 = 原条数 - 剩条数 MsgBox "清理完成!" & vbCrLf & _ "原来:" & 原条数 & " 条" & vbCrLf & _ "删除:" & 删条数 & " 条" & vbCrLf & _ "保留:" & 剩条数 & " 条", vbInformationEnd Sub操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。建议数据表 A 列里准备一些重复的名字/单号做测试。 点一下数据表让它成为「当前表」,按 Alt + F8运行「一键删除重复行_带报告」。程序先数原有条数,再按 A 列去重、只留第一条,最后弹窗报告:原来多少条、删除多少条、保留多少条。 如果 A 列本来就没有重复,会显示"删除 0 条、保留全部",原表不发生任何改变,你可以放心反复试。 想数别的列?把两处 Cells(表.Rows.Count, 1)和Columns:=1里的1改成对应列号即可(注意两处要一起改)。
关键经验(来自网络实战总结):
RemoveDuplicates 是"原地删除、保留第一条、无法撤销":删完 Ctrl+Z 也救不回,动手前务必另存副本。 Columns 从范围左边算起:本篇用 UsedRange(从 A 列起),所以Columns:=1就是 A 列;若以后范围从别的列起,要重新数。Header 一定要写对:有表头就写 xlYes,让第一行不参与比较;写漏了默认xlNo,会把表头当成一条数据,可能误删。不区分大小写,但认空格:"Apple"和"apple"算重复,可"Apple "(多了空格)和"Apple"不算,数据最好先清空格。 删前先备份:去重是不可逆的,另存一份副本最稳妥;保存工作簿一定要存成 .xlsm格式,否则宏会丢失。
知识点小结
用 VBA 删除重复行(只保留一条),本质上就是把「手动翻找、肉眼比对、一行行删」这件事,翻译成一行固定动作:指定按哪列判断 → RemoveDuplicates 一键去重、只留第一条 → 其余数据自动补位。三句话记牢就够用:
去重 → 表.UsedRange.RemoveDuplicates Columns:=列号, Header:=xlYes,Columns是从范围左边算起的第几列;表头 → 有表头就写 Header:=xlYes,让第一行不参与比较,绝不被误当数据删掉;安全 → 它是原地删除且无法撤销,动手前先备份;不区分大小写但认前后空格,数据最好先清干净。
它和前面学的「按条件删行」「筛选复制」「导出 PDF」是一套组合拳:筛选管「把想要的挑出来」、删行管「把没用的清走」、去重管「把重复的记录并成一条」、PDF 管「成果交出去」——从收数、挑数、清数到出成品,全程不用手动点一下。
【SVG 示意图】
下一篇预告:去重、删行、筛选都搞定后,日常最常见的是"表里某些词写错了、要批量改成正确的"。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁「一键批量查找并替换文本」——用 Range.Replace,把整张表里的旧词一次性换成新词,还能报告替换了多少处。
【往期 VBA 精选】
系列已更新 60+ 篇,挑几篇最实用的继续看:
从0学 Excel VBA 第1篇:认识 VBA,什么是宏?[1] 进销存实战第1篇:系统设计与初始化[2] CRM 客户管理第1篇:系统设计与初始化[3] Excel 一键系列:用 VBA 把表格批量导出成 PDF[4] 界面自定义第1篇:自定义菜单与工具栏[5]
关注公众号「西哥的AI幻觉」,对话框发送「VBA」可获取完整目录与配套源码。
【西哥能帮你做什么】
办公自动化 · AI 视频生产 · AI 编程助手落地 · 工厂数字化
把 Excel / VBA / Python 里那些重复到吐的活,一次性自动化掉 批量产出「古诗每日一诵」式 AI 古诗词视频(配音 + 配图 + 合成一键完成) OpenClaw / WorkBuddy 等 AI 编程助手的企业内训与落地陪跑 从 PLC 到 MES 的工厂务实数字化方案
【找到我】
公众号「西哥的AI幻觉」:点文章右上角「···」设为星标,更新不迷路 加微信:LekonWang(备注「VBA」进学习交流群)
本文由西哥原创,转载请注明出处「西哥的AI幻觉」。
引用链接
[1]从0学 Excel VBA 第1篇:认识 VBA,什么是宏?: https://mp.weixin.qq.com/s/e2yA1Nu72yg7sM45GXl9nA
[2]进销存实战第1篇:系统设计与初始化: https://mp.weixin.qq.com/s/2zg6E3UmNVrxF8W5u3nbcg
[3]CRM 客户管理第1篇:系统设计与初始化: https://mp.weixin.qq.com/s/-gt-sodNMhpPfB-kYZoTTQ
[4]Excel 一键系列:用 VBA 把表格批量导出成 PDF: https://mp.weixin.qq.com/s/Qrf_gRLkCBN-NrRA4DJUHg
[5]界面自定义第1篇:自定义菜单与工具栏: https://mp.weixin.qq.com/s/Rk3YX0bTwtmFs1XJzN7Vrg