Python+VBA刪除Excel重復(fù)行的兩種實(shí)用方法詳解
在日常處理Excel數(shù)據(jù)時(shí),重復(fù)行是高頻出現(xiàn)的問題,不僅會增加數(shù)據(jù)量,還可能導(dǎo)致統(tǒng)計(jì)分析出錯(cuò)。本文將詳細(xì)介紹兩種高效的去重方案:Free Spire.XLS for Python(適合自動化/批量處理)和 VBA 腳本(適合 Excel 內(nèi)直接操作),幫助你根據(jù)場景選擇最優(yōu)方式。
核心需求適配
你在處理 Excel 重復(fù)行時(shí),可能面臨這些場景:
- 需批量處理數(shù)十個(gè) Excel 文件,希望自動化腳本一鍵去重;
- 僅處理單個(gè) Excel 文件,不想安裝 Python,直接在 Excel 內(nèi)操作;
- 需保留 Excel 原生格式(樣式、公式),同時(shí)精準(zhǔn)控制去重規(guī)則;
- 既想掌握輕量化的 VBA 快速操作,也想學(xué)會 Python 的批量處理能力。
前置認(rèn)知:兩種方法核心對比
| 特性 | Python (Free Spire.XLS) | Excel VBA |
|---|---|---|
| 操作環(huán)境 | 需安裝 Python + Spire.XLS 庫 | 無需額外安裝,Excel 原生支持 |
| 適用場景 | 批量處理多文件、跨平臺 | 單個(gè)文件快速處理、輕量化操作、辦公場景 |
| 格式兼容性 | 保留 Excel 原生格式、公式、樣式 | 完全原生操作,格式無損耗 |
| 學(xué)習(xí)成本 | 入門級 Python 語法,代碼可復(fù)用 | 簡單 VBA 語法,僅需掌握核心判重邏輯 |
| 自動化能力 | 可集成到批量腳本、定時(shí)任務(wù) | 僅在 Excel 內(nèi)運(yùn)行,適合單次操作 |
方法1:通過 Python 刪除重復(fù)行
Free Spire.XLS for Python 是一款無需安裝 Microsoft Excel 即可操作 Excel 文件的免費(fèi) Python 庫,適合批量處理多個(gè) Excel 文件、自動化腳本開發(fā)場景。
1. 環(huán)境準(zhǔn)備
首先安裝Free Spire.XLS for Python,執(zhí)行以下命令:
pip install Spire.Xls.Free
2. 完整實(shí)現(xiàn)代碼
from spire.xls import *
# 創(chuàng)建Workbook實(shí)例
workbook = Workbook()
workbook.LoadFromFile("duplicates.xlsx")
sheet = workbook.Worksheets[0]
# 配置關(guān)鍵參數(shù)
key_column = 1 # A列(Spire.XLS中列號從1開始)
last_row = sheet.LastRow
# 定義要處理的范圍
data_range = sheet.Range[f"A1:A{last_row}"]
# 用于跟蹤已出現(xiàn)的值(去重核心)
seen_values = set()
rows_to_remove = []
# 獲取總行數(shù)
row_count = data_range.Rows.Length
# 核心邏輯:從最后一行向前遍歷
for i in range(row_count, 0, -1):
# 獲取單元格值并標(biāo)準(zhǔn)化
cell = data_range[i, key_column]
cell_value = str(cell.DisplayedText).strip()
# 規(guī)則:空值 或 已出現(xiàn)過的值 → 標(biāo)記為刪除
if not cell_value or cell_value in seen_values:
rows_to_remove.append(i)
else:
seen_values.add(cell_value)
# 批量刪除標(biāo)記的行(逆序遍歷收集的行號,直接刪即可)
for row in rows_to_remove:
sheet.DeleteRow(row)
# 保存并釋放資源
workbook.SaveToFile("RemoveDuplicates.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
3. 代碼關(guān)鍵解釋
Workbook():創(chuàng)建Excel工作簿對象,負(fù)責(zé)加載/保存文件;
LastRow:獲取工作表中實(shí)際有數(shù)據(jù)的最后一行,避免處理空行;
set:高效記錄已出現(xiàn)的單元格值;
行數(shù)據(jù)去重邏輯:
- 逆序遍歷:從最后一行到第一行,徹底規(guī)避 刪除行后行號偏移問題,無需調(diào)整行號;
- 清晰的判斷規(guī)則:拆分 空值處理和重復(fù)值處理邏輯,易讀易維護(hù);
- 批量標(biāo)記 + 批量刪除:先收集所有要?jiǎng)h除的行號,再統(tǒng)一刪除,減少 IO 操作。
DeleteRow():刪除標(biāo)記為空白的行;
Dispose():釋放資源,避免內(nèi)存泄漏。

方法2:VBA 腳本刪除 Excel 重復(fù)行
VBA(Visual Basic for Applications)是 Excel 內(nèi)置的腳本語言,無需額外安裝工具,適合手動操作單個(gè) Excel 文件、快速去重的場景。
1. 準(zhǔn)備工作:啟用 VBA 編輯器
- 打開 Excel 文件 → 【文件】→【選項(xiàng)】→【自定義功能區(qū)】→ 勾選 “開發(fā)工具”;
- 按
Alt + F11打開 VBA 編輯器 →【插入】→【模塊】,即可編寫代碼。
2. 完整 VBA 代碼
該代碼會刪除當(dāng)前工作表中基于第一列(A列)所有的重復(fù)行,保留第一條重復(fù)行:
Sub VBA_RemoveDuplicates_SpecCol()
Dim ws As Worksheet
Dim lastRow As Long
Dim dict As Object
Dim targetCol As String
Dim cellVal As String
Dim i As Long
' 指定判重列(如"A"列)
targetCol = "A"
Set ws = ActiveSheet
Set dict = CreateObject("Scripting.Dictionary")
lastRow = ws.UsedRange.Rows.Count
If lastRow < 2 Then
MsgBox "數(shù)據(jù)不足!", vbInfo
Exit Sub
End If
' 倒序遍歷,僅按指定列判重
For i = lastRow To 2 Step -1
cellVal = IIf(IsEmpty(ws.Cells(i, targetCol).Value), "", ws.Cells(i, targetCol).Value)
If dict.Exists(cellVal) Then
ws.Rows(i).Delete
Else
dict.Add cellVal, i
End If
Next i
Set dict = Nothing
Set ws = Nothing
MsgBox "按" & targetCol & "列去重完成!", vbInfo
End Sub

3. 代碼關(guān)鍵解釋
ActiveSheet:表示當(dāng)前選中的工作表,也可手動指定ThisWorkbook.Worksheets("Sheet1");targetCol = "A": 定義判重列,改值即可切換目標(biāo)列;- 判重依據(jù):僅提取指定列單元格值,用
IIf(IsEmpty(...))統(tǒng)一空值為"",避免判重錯(cuò)誤 lastRow To 2 Step -1:防止刪除行后索引錯(cuò)亂;Delete:刪除判斷為重復(fù)的列
4. 運(yùn)行 VBA 代碼的方法
- 在 VBA 編輯器中粘貼代碼;
- 按
F5運(yùn)行,或點(diǎn)擊 “運(yùn)行” 按鈕; - 回到 Excel,彈窗提示 “按A列去重完成”。

無論是 Python (Free Spire.XLS) 的批量自動化,還是 VBA 的輕量化原生操作,掌握這兩種方法就能覆蓋所有 Excel 去重場景,從根本上解決手動刪重復(fù)行的低效問題,大幅提升數(shù)據(jù)處理效率。
到此這篇關(guān)于Python+VBA刪除Excel重復(fù)行的兩種實(shí)用方法詳解的文章就介紹到這了,更多相關(guān)Python刪除Excel重復(fù)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Boston數(shù)據(jù)集預(yù)測放假及應(yīng)用優(yōu)缺點(diǎn)評估
這篇文章主要為大家介紹了Boston數(shù)據(jù)集預(yù)測放假及應(yīng)用優(yōu)缺點(diǎn)評估,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Python實(shí)現(xiàn)對一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)對一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器的方法,結(jié)合實(shí)例形式分析了Python編程中一個(gè)函數(shù)使用多個(gè)裝飾器的簡單操作技巧,需要的朋友可以參考下2018-02-02
Python Excel vlookup函數(shù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Python Excel vlookup函數(shù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Django調(diào)用支付寶接口代碼實(shí)例詳解
這篇文章主要介紹了Django調(diào)用支付寶接口代碼實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

