我正在尝试提出一个精简且防错的宏来删除列A中包含重复值的行。我有两个解决方案,两者都有其优点。它们都不是我想要的。
我需要删除包含重复项的行,但留下包含副本的最后一行。
这个很棒。它没有循环,可以即时工作。问题是它删除了包含重复的后续行,因此留下第一次出现的副本(我需要最后一次/或第二次 - 最多只出现两次)
Sub Delete()
ActiveSheet.Range("A:E").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
这个从底部开始删除重复项。它比第一个持续时间更长(我有大约6k行)但这个问题的一个问题是它并没有全部删除它们。剩下一些重复项,我再次运行相同的代码后会删除它们。仍然留下更少数量的重复。基本上需要运行它5次,然后我最终得到干净的清单。
`
Sub DeleteDup()
Dim LastRowcheck As Long, n1 As Long, rowschecktodelete As Long
LastRowcheck = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
For n1 = 1 To LastRowcheck
With Worksheets("Sheet1").Cells(n1, 1)
If Cells(n1, 1) = Cells(n1 + 1, 1) Then
Worksheets("Sheet1").Cells(n1, 1).Select
Selection.EntireRow.Delete
End If
End With
Next n1
End Sub
` 有没有办法改善其中任何一个能够正常工作还是有更好的解决方案?任何信息都非常感谢。谢谢
答案 0 :(得分:2)
最简单的方法是一次删除所有行。另外,为了提高速度,最好使用变量进行检查,而不是像这样的实际单元格值:
worker
答案 1 :(得分:1)
这个概念是正确的,但请记住,当您删除行时,Cells(n1 + 1, 1)
与删除行之前不一样。解决方案是简单地反转循环并从下到上测试行:
Sub DeleteDup()
Dim last As Long
Dim current As Long
Dim sheet As Worksheet
Set sheet = Worksheets("Sheet1")
With sheet
last = .Range("A" & .Rows.Count).End(xlUp).Row
For current = last To 1 Step -1
If .Cells(current + 1, 1).Value = .Cells(current, 1).Value Then
.Rows(current).Delete
End If
Next current
End With
End Sub
请注意,您可以使用循环计数器来索引.Rows
,而不是使用Selection
对象来显着提高性能。此外,如果您获取Worksheet
的引用并将整个内容放在With
块中,则无需继续取消引用Worksheets("Sheet1")
,这也可以提高性能。
如果它仍然运行得太慢,则下一步是标记要删除的行,对标志进行排序,在一次操作中删除整个标记范围,然后排序回原始顺序。我猜测上面的代码应该足够快~6K行。