两种实用方法删除 Excel 重复行:Python + VBA(2025-2026 实用版)
删除 Excel 中的重复行是非常常见的办公/数据清洗需求。下面介绍两种目前最实用、高效的方法:
- Python(pandas + openpyxl)—— 适合批量处理、自动化、跨文件、需要复杂去重逻辑的场景
- VBA(Excel 自带宏)—— 适合快速手动操作、不想安装额外环境、直接在 Excel 里完成的场景
方法一:Python(pandas + openpyxl) —— 推荐用于自动化和批量处理
优点
- 可以处理超大文件(几十万行)
- 支持多列组合去重、保留第一条/最后一条、按某列排序后去重
- 可以把结果写回原文件或生成新文件
- 完全可脚本化、定时任务
代码示例(保留第一条重复记录)
importpandasaspd# 方法1:简单一行代码(最常用)defremove_duplicates_simple(file_path,sheet_name='Sheet1',output_path=None):# 读取 Exceldf=pd.read_excel(file_path,sheet_name=sheet_name,engine='openpyxl')# 删除重复行(保留第一条出现的记录)# keep='first'(默认) / 'last' / False(全部删除)cleaned_df=df.drop_duplicates(keep='first')# 如果想按某些列去重(比如只看“姓名+身份证”组合)# cleaned_df = df.drop_duplicates(subset=['姓名', '身份证号'], keep='first')# 保存结果ifoutput_pathisNone:output_path=file_path.replace('.xlsx','_cleaned.xlsx')cleaned_df.to_excel(output_path,index=False,engine='openpyxl')print(f"去重完成!原始{len(df)}行 → 去重后{len(cleaned_df)}行")print(f"结果保存至:{output_path}")# 使用示例remove_duplicates_simple("原始数据.xlsx")更灵活版本(保留最后一条 + 指定去重列 + 不保存索引)
importpandasaspddefremove_duplicates_advanced(input_file,output_file=None,sheet_name='Sheet1',subset_columns=None,# 例如 ['姓名', '电话']keep='last',# 'first' / 'last' / Falsesort_by=None# 先排序再去重,例如 ['日期']):df=pd.read_excel(input_file,sheet_name=sheet_name,engine='openpyxl')original_rows=len(df)ifsort_by:df=df.sort_values(by=sort_by)cleaned_df=df.drop_duplicates(subset=subset_columns,keep=keep)ifoutput_fileisNone:output_file=input_file.replace('.xlsx','_去重后.xlsx')cleaned_df.to_excel(output_file,index=False,engine='openpyxl')print(f"去重完成!")print(f"原始行数:{original_rows}")print(f"去重后行数:{len(cleaned_df)}")print(f"保存路径:{output_file}")# 使用示例remove_duplicates_advanced("客户名单.xlsx",subset_columns=['姓名','手机号','身份证号'],# 只看这三列组合keep='last',# 保留最后出现的记录sort_by=['登记日期']# 先按登记日期排序)方法二:VBA(Excel 宏) —— 适合快速手动清理
优点
- 无需安装任何软件
- 直接在 Excel 里运行
- 速度快(几十万行也很快)
步骤
- 按Alt + F11打开 VBA 编辑器
- 插入 → 模块
- 粘贴下面代码
Sub RemoveDuplicatesAdvanced() Dim ws As Worksheet Dim rng As Range Dim lastRow As Long Dim lastCol As Long ' 设置要处理的工作表(可以改成 Sheets("Sheet1")) Set ws = ActiveSheet ' 找到最后一行和最后一列 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ' 设置要处理的区域(从第1行表头开始) Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)) ' ====================== ' 方式一:删除所有完全重复的行(保留第一条) ' ====================== rng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), _ Header:=xlYes ' 如果有表头就写 xlYes ' ====================== ' 方式二:只按指定列去重(例如只看第1列+第3列+第5列) ' ====================== ' rng.RemoveDuplicates Columns:=Array(1, 3, 5), Header:=xlYes MsgBox "去重完成!" & vbCrLf & _ "当前剩余行数:" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row, vbInformation End Sub常用修改方式
| 需求 | 修改方式 |
|---|---|
| 只看 A、B、C 三列去重 | Columns:=Array(1,2,3) |
| 保留最后一条记录 | 先按某列排序(Sort),再去重 |
| 包含表头 | Header:=xlYes |
| 不包含表头 | Header:=xlNo |
| 去重后自动筛选重复次数 | 可加辅助列统计(高级用法) |
快捷键运行
- 保存文件为.xlsm格式(启用宏)
- 按Alt + F8→ 选择
RemoveDuplicatesAdvanced→ 运行
两种方法对比总结
| 维度 | Python (pandas) | VBA (Excel 宏) |
|---|---|---|
| 环境依赖 | 需要安装 pandas + openpyxl | 无需安装,Excel 自带 |
| 处理数据量 | 非常大(百万行轻松) | 几十万行也可以,百万行稍慢 |
| 灵活性 | 极高(多条件、排序、逻辑复杂) | 中等(主要靠列号) |
| 自动化程度 | 最高(可定时、批量、命令行) | 中等(需手动触发) |
| 学习成本 | 中等(需会一点 Python) | 低(复制粘贴就能用) |
| 推荐场景 | 经常处理、批量、需要可复用脚本 | 临时快速清理、手动操作 |
最终建议(2026 视角)
- 日常小表、临时清理→直接用 VBA,最快
- 需要反复执行、批量处理、复杂去重逻辑、数据量大→强烈推荐 Python + pandas
- 企业内部自动化报表、ETL 流程→ 必选 Python
如果你有具体需求(例如:只去重某些列、保留最新记录、处理多个 sheet、去重后还要统计重复次数等),可以告诉我,我可以给你更针对性的代码!