两种实用方法删除 Excel 重复行:Python + VBA

两种实用方法删除 Excel 重复行:Python + VBA(2025-2026 实用版)

删除 Excel 中的重复行是非常常见的办公/数据清洗需求。下面介绍两种目前最实用、高效的方法:

  1. Python(pandas + openpyxl) —— 适合批量处理、自动化、跨文件、需要复杂去重逻辑的场景
  2. 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 里运行
  • 速度快(几十万行也很快)

步骤

  1. Alt + F11 打开 VBA 编辑器
  2. 插入 → 模块
  3. 粘贴下面代码
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
去重后自动筛选重复次数可加辅助列统计(高级用法)

快捷键运行

  1. 保存文件为 .xlsm 格式(启用宏)
  2. Alt + F8 → 选择 RemoveDuplicatesAdvanced → 运行

两种方法对比总结

维度Python (pandas)VBA (Excel 宏)
环境依赖需要安装 pandas + openpyxl无需安装,Excel 自带
处理数据量非常大(百万行轻松)几十万行也可以,百万行稍慢
灵活性极高(多条件、排序、逻辑复杂)中等(主要靠列号)
自动化程度最高(可定时、批量、命令行)中等(需手动触发)
学习成本中等(需会一点 Python)低(复制粘贴就能用)
推荐场景经常处理、批量、需要可复用脚本临时快速清理、手动操作

最终建议(2026 视角)

  • 日常小表、临时清理直接用 VBA,最快
  • 需要反复执行、批量处理、复杂去重逻辑、数据量大强烈推荐 Python + pandas
  • 企业内部自动化报表、ETL 流程 → 必选 Python

如果你有具体需求(例如:只去重某些列、保留最新记录、处理多个 sheet、去重后还要统计重复次数等),可以告诉我,我可以给你更针对性的代码!

文章已创建 4424

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部