求VBA代码:当第5、10、11、12列数据均重复时删除重复行
按指定列删除重复行的VBA代码
以下是针对需求编写的VBA代码,可自动识别第5、10、11、12列的重复组合并删除对应行:
Sub RemoveDuplicateRows() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim key As String Dim dict As Object ' 指定目标工作表,根据实际表名修改 Set ws = ThisWorkbook.Worksheets("Sheet1") Set dict = CreateObject("Scripting.Dictionary") ' 获取数据区域的最后一行 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 从末尾倒序遍历,避免删除行导致的索引错位 For i = lastRow To 2 Step -1 ' 拼接指定列的值作为唯一标识,用|分隔避免歧义 key = ws.Cells(i, 5).Value & "|" & ws.Cells(i, 10).Value & "|" & ws.Cells(i, 11).Value & "|" & ws.Cells(i, 12).Value If dict.Exists(key) Then ' 已存在相同组合,删除当前行 ws.Rows(i).Delete Else ' 首次出现的组合,存入字典记录 dict.Add key, i End If Next i ' 释放对象 Set dict = Nothing Set ws = Nothing MsgBox "重复行删除完成", vbInformation End Sub
关键说明:
- 使用
Scripting.Dictionary存储已出现的列值组合,比嵌套循环效率更高,适合处理大数据量 - 倒序遍历行:如果从第一行开始删除,后续行的索引会因行删除发生偏移,导致漏判或误删
- 分隔符
|:避免不同列值拼接后产生混淆(例如列5值为"AB"、列10值为"C",与列5值为"A"、列10值为"BC"的情况) - 默认跳过第1行(表头行),如果你的表头不在第1行,修改
To 2中的数字即可
自动触发方案(可选)
如果需要每次粘贴数据后自动执行去重,可将以下代码放入对应工作表的模块中(右键工作表标签→查看代码→粘贴):
Private Sub Worksheet_Change(ByVal Target As Range) RemoveDuplicateRows End Sub
注:若数据量极大,自动触发可能导致卡顿,此时建议手动执行宏(按Alt+F8选择RemoveDuplicateRows运行)
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

