Excel VBA:优化代码以根据列中的副本删除行

时间:2015-12-23 02:01:31

标签: excel vba excel-vba

我正在尝试提出一个精简且防错的宏来删除列A中包含重复值的行。我有两个解决方案,两者都有其优点。它们都不是我想要的。

我需要删除包含重复项的行,但留下包含副本的最后一行。

  1. 这个很棒。它没有循环,可以即时工作。问题是它删除了包含重复的后续行,因此留下第一次出现的副本(我需要最后一次/或第二次 - 最多只出现两次)

    Sub Delete() ActiveSheet.Range("A:E").RemoveDuplicates Columns:=1, Header:=xlNo End Sub

  2. 这个从底部开始删除重复项。它比第一个持续时间更长(我有大约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
    
  3. ` 有没有办法改善其中任何一个能够正常工作还是有更好的解决方案?任何信息都非常感谢。谢谢

2 个答案:

答案 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行。