如何使用VBA删除Excel中整行完全匹配的重复行?
VBA删除整行完全重复行的实现方案
问题原因说明
你之前调用RemoveDuplicates报错或误删的原因有两个:
- 仅传入部分列作为判断依据,自然会把部分列相同但整行不同的行误判为重复删除
- 没有传入全部20列构造合法的列参数数组,导致方法调用报错
方案1:直接调用系统自带RemoveDuplicates方法(最简实现)
系统自带的去重方法本身支持多列判断,只要正确传入全部20列的数组即可实现整行重复判断:
Public Sub DeleteFullDuplicateRows() Dim ws As Worksheet Dim colArr As Variant Dim i As Integer ' 绑定目标工作表 Set ws = ThisWorkbook.Worksheets("BD - Tarifas") ' 构造1-20列的数组,对应所有参与重复判断的列 ReDim colArr(0 To 19) For i = 0 To 19 colArr(i) = i + 1 Next ' 执行去重:基于全部20列判断重复,保留首次出现的行,识别表头 ws.UsedRange.RemoveDuplicates Columns:=colArr, Header:=xlYes End Sub
方案2:数组+字典实现(万行以上大数据量效率更高)
如果你的数据量超过1万行,用数组+字典批量处理的效率会远高于逐行比对和系统自带方法:
Public Sub DeleteFullDuplicateRowsFast() Dim ws As Worksheet Dim dataArr As Variant Dim dict As Object Dim i As Long, j As Long Dim rowKey As String Dim delRng As Range Set ws = ThisWorkbook.Worksheets("BD - Tarifas") Set dict = CreateObject("Scripting.Dictionary") ' 一次性把所有数据读入内存数组,避免频繁读写单元格 dataArr = ws.UsedRange.Value ' 从第2行开始遍历(跳过表头) For i = 2 To UBound(dataArr, 1) rowKey = "" ' 用特殊分隔符拼接整行所有列内容作为唯一标识,避免不同列内容拼接巧合重复 For j = 1 To 20 rowKey = rowKey & "||" & dataArr(i, j) Next j If dict.exists(rowKey) Then ' 重复行加入待删除区域 If delRng Is Nothing Then Set delRng = ws.Rows(i) Else Set delRng = Union(delRng, ws.Rows(i)) End If Else ' 首次出现的行存入字典 dict.Add rowKey, True End If Next i ' 批量删除所有重复行 If Not delRng Is Nothing Then delRng.Delete End Sub
注意:拼接用的
||分隔符可以换成你数据里不会出现的任意特殊字符,避免不同列内容拼接后出现巧合一致的情况。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

