两种实用方法删除 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、去重后还要统计重复次数等),可以告诉我,我可以给你更针对性的代码!

功能: 1、多运营商综合缴费:支持移动、联通、电信、网通联合缴费及手机上号和游戏点卡值。 2、代理商管理:系统对代理商统一分配登录帐号;各代理端统一结算预存话费、佣金,实时查询缴费帐单,佣金情况,预存款自动上帐。 3、数据导出:系统中的数据以及各项操作记录均可以导出成EXCEL文件。 4、资金安全保障:保障数据在传输过程中的安全;使用IP绑定及电脑绑定方式,安全可靠。 5、余额查询:查询缴费号码的机主姓名、余额以及欠费情况,缴费前查询、缴费后查询。 6、独立运营:独立服务器,不受任何第三方控制,自主运营,定制客户界面;是缴费加盟运营商首选平台。 7、权限分配:系统可针对不同的代理用户开通 缴费、查询、管理等不同的权限。 8、全自动运行:服务器全自动无人值守运行,所执行的各项操作以黑匣子方式实时记录,永久备查。 9、数据安全保障:服务器可双机同步运行,两台主机可在不同的两个场所,任何一台主机出现灾难故障,都不会对数据造成丢失风险。 10、实时消息:完备的实时消息系统,新定单、处理结果消息通知,服务器广播消息,内部代理商互发消息。 11、语音报号:用户缴费时会有语音进行二次核对;等语音通知 12号码自助输入:当用户缴费时可选用手动输入号码,避免失误发生。 政策: 平台支持全国运营,如果您是一个还没入门的用户,但是又想发展代理。那么,我们是 您最好的选择。正式合作以后,公司会派人上门安装讲解,并给您提供一整套适合当地操作的营销方案,让您更快掌握市场先机,赢得更大利润。
代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
代码转载自:https://pan.quark.cn/s/46fd08fb879c 网管教程 从入门到精通软件篇 ★一。★详尽的xp修复控制台指令及其应用!!! 放入xp(2000)的光盘,安装时选择R,执行修复! Windows XP(涵盖 Windows 2000)的控制台指令是在系统遭遇某些意外状况时的一种极具效用的诊断、检测以及恢复系统功能的工具。笔者确实一期望能够将这方面的指令进行归纳,此次由老范辛苦整理了这份极具价值的秘籍。 Bootcfg bootcfg 命令用于启动配置故障恢复(对大多数计算机而言,即 boot.ini 文件)。 带有特定参数的 bootcfg 命令仅在运用故障恢复控制台时方可使用。能够在命令行界面下运用带有不同参数的 bootcfg 命令。 用法: bootcfg /default 设定默认引导选项。 bootcfg /add 向引导清单中增添 Windows 安装。 bootcfg /rebuild 重复整个 Windows 安装流程并让用户选择需添加的项目。 注意:运用 bootcfg /rebuild 之前,应先借助 bootcfg /copy 命令备份 boot.ini 文件。 bootcfg /scan 探查用于 Windows 安装的全部磁盘并展示结果。 注意:这些结果被静态存储,并用于当前会话。若在当前会话期间磁盘配置发生变动,为获取更新的探查结果,必须先重启计算机,然后再次探查磁盘。 bootcfg /list 列示引导清单中已有的项目。 bootcfg /disableredirect 在启动引导程序中禁用重定向。 bootcfg /redirect [ PortBaudRrate] |[ useBio...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值