两种实用方法删除 Excel 重复行:Python + VBA(2025-2026 实用版)
删除 Excel 中的重复行是非常常见的办公/数据清洗需求。下面介绍两种目前最实用、高效的方法:
- Python(pandas + openpyxl) —— 适合批量处理、自动化、跨文件、需要复杂去重逻辑的场景
- VBA(Excel 自带宏) —— 适合快速手动操作、不想安装额外环境、直接在 Excel 里完成的场景
方法一:Python(pandas + openpyxl) —— 推荐用于自动化和批量处理
优点
- 可以处理超大文件(几十万行)
- 支持多列组合去重、保留第一条/最后一条、按某列排序后去重
- 可以把结果写回原文件或生成新文件
- 完全可脚本化、定时任务
代码示例(保留第一条重复记录)
import pandas as pd
# 方法1:简单一行代码(最常用)
def remove_duplicates_simple(file_path, sheet_name='Sheet1', output_path=None):
# 读取 Excel
df = 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')
# 保存结果
if output_path is None:
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")
更灵活版本(保留最后一条 + 指定去重列 + 不保存索引)
import pandas as pd
def remove_duplicates_advanced(
input_file,
output_file=None,
sheet_name='Sheet1',
subset_columns=None, # 例如 ['姓名', '电话']
keep='last', # 'first' / 'last' / False
sort_by=None # 先排序再去重,例如 ['日期']
):
df = pd.read_excel(input_file, sheet_name=sheet_name, engine='openpyxl')
original_rows = len(df)
if sort_by:
df = df.sort_values(by=sort_by)
cleaned_df = df.drop_duplicates(
subset=subset_columns,
keep=keep
)
if output_file is None:
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、去重后还要统计重复次数等),可以告诉我,我可以给你更针对性的代码!