求删除Sheet1中与Sheet2重复行的VBA代码(保留表头)
可行,附VBA实现代码及说明
完全可以实现这个需求,以下是兼顾效率与准确性的VBA代码:
Sub DeleteDuplicateRows() Dim ws1 As Worksheet, ws2 As Worksheet Dim rowDict As Object Dim lastRow1 As Long, lastRow2 As Long Dim i As Long, j As Long Dim keyStr As String Dim rowsToDelete As Collection ' 绑定目标工作表 Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") Set rowDict = CreateObject("Scripting.Dictionary") Set rowsToDelete = New Collection ' 把Sheet2的所有数据行转成唯一标识,存入字典 lastRow2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row For i = 2 To lastRow2 ' Sheet2数据从第2行开始 keyStr = "" ' 拼接9列内容作为唯一键(用|分隔,避免和数据内容冲突) For j = 1 To 9 keyStr = keyStr & "|" & ws2.Cells(i, j).Value Next j If Not rowDict.Exists(keyStr) Then rowDict.Add keyStr, i End If Next i ' 遍历Sheet1,标记和Sheet2重复的行 lastRow1 = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row For i = 3 To lastRow1 ' Sheet1数据从第3行开始 keyStr = "" For j = 1 To 9 keyStr = keyStr & "|" & ws1.Cells(i, j).Value Next j If rowDict.Exists(keyStr) Then rowsToDelete.Add i End If Next i ' 批量删除重复行(从下往上删,避免行号错乱) If rowsToDelete.Count > 0 Then For i = rowsToDelete.Count To 1 Step -1 ws1.Rows(rowsToDelete(i)).Delete Next i End If ' 释放对象 Set rowDict = Nothing Set rowsToDelete = Nothing Set ws1 = Nothing Set ws2 = Nothing MsgBox "重复行删除完成!", vbInformation End Sub
代码说明:
- 效率优先:用
Scripting.Dictionary存储Sheet2的行标识,查找速度远快于逐行对比,适合数据量较大的场景。 - 唯一标识:用
|作为列内容分隔符,确保不同行的拼接字符串唯一;如果你的数据里包含|,可以换成^这类不会出现的字符。 - 安全删除:先收集所有待删除行号,再从下往上批量删除,避免删除行后后续行号偏移导致误删。
- 表头保护:代码明确限定了数据遍历的起始行,确保Sheet1和Sheet2的表头不会被修改或删除。
使用提示:
- 如果工作表名称不是
Sheet1/Sheet2,修改代码中Set ws1 = ...和Set ws2 = ...的工作表名。 - 若实际列数不是9列,调整
For j = 1 To 9的数字。 - 运行前建议备份文件,避免误操作。
内容的提问来源于stack exchange,提问作者Giovanni03
相关产品推荐
相关产品推荐

