如何查找重复的行然后删除其中一行?需要VBA

时间:2012-03-10 06:33:30

标签: excel excel-vba vba

我想知道是否有人知道如何删除重复的行..比如说,

   A        B       C

1  1        3       4
2  2        6       9
3  TEST     1       2
4  TEST     1       2
5  Both     1
6  Hi               2
7  None     3       3
8  Loud     4       4

对于上面的特定示例,TEST重复两次..在其他一些情况下,名称可以是其他类型,如NOON,Morning等。而第8行不一定是最后一行。 我不知道如何比较行来检查重复的名称,然后删除它们。我需要运行一个宏,所以我需要VBA。如果您知道,请与我分享..将会感恩!

尝试代码:

 Sub Macro1()

   Dim LastRow As Long, n As Long, rowstodelete As Long

    LastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

      For n = 1 To LastRow

    With Worksheets("Sheet1").Cells(n, 1)
         If .Cells(n, 1) = .Cells(n + 1, 1) Then
           rowstodelete = Worksheets("Sheet1").Cells(n, 1)
           Rows(rowstodelete).Select
           Selection.Delete Shift:=xlUp
         End If
   End With
       Next n

 End Sub

不幸的是,在.Cells(n,1)上有运行时错误。我不知道为什么会这样。如果你知道某些东西可以与我分享或者修改它。会很感激的!

5 个答案:

答案 0 :(得分:6)

user1204868

建议在删除行时,始终以反向模式执行。看到这段代码。您也无需在删除前选择单元格。这将减慢你的代码:)

Sub Sample()
    Dim LastRowcheck As Long, n1 As Long

    With Worksheets("Sheet1")
        LastRowcheck = .Range("A" & .Rows.Count).End(xlUp).Row

        For n1 = LastRowcheck To 1 Step -1
            If .Cells(n1, 1).Value = Cells(n1 + 1, 1).Value Then
               .Rows(n1).Delete
            End If
        Next n1
    End With
End Sub

这是一种更好的更快方式。

Sub Sample()
    Dim LastRowcheck As Long, n1 As Long
    Dim DelRange As Range

    With Worksheets("Sheet1")
        LastRowcheck = .Range("A" & .Rows.Count).End(xlUp).Row

        For n1 = 1 To LastRowcheck
            If .Cells(n1, 1).Value = Cells(n1 + 1, 1).Value Then
                If DelRange Is Nothing Then
                    Set DelRange = .Rows(n1)
                Else
                    Set DelRange = Union(DelRange, .Rows(n1))
                End If
            End If
        Next n1

        If Not DelRange Is Nothing Then DelRange.Delete
    End With
End Sub

<强>后续

  
    
      

任何想法为什么反向行删除更好? - 富兰克林29秒前

    
  

当您删除行时,For循环会因为您设定的行数目标而混乱。然后,您必须编写额外的代码行,以跟踪您删除的行。它也会减慢您的代码:)当您反向删除时,您不必考虑已删除的行,因为它不属于当前运行循环。这样你的代码就会更快。但是就像我上面提到的那样,如果你没有使用反向行删除,那么使用我给出的第二个代码。那更快。

我想提一点。如果您使用的是Excel 2007/2010,那么@brettdj建议的一行代码是最快的:)

HTH

西特

答案 1 :(得分:4)

<强>手册
Bill Jelen's website提供了三种非VBA技术

  1. 所有版本: 使用高级过滤器中的唯一选项
  2. Xl 07/10: 使用条件格式标记重复
  3. Xl 07/10: 使用删除重复项图标
  4. 对于(3),等价的VBA将是这样的(对于没有标题)
    ActiveSheet.Range("$A$1:$C$100").RemoveDuplicates Columns:=1, Header:=xlNo

    enter image description here

    处理现有重复
    我的免费Duplicate Master addin会让你

    • 选择
    • 颜色
    • 列表
    • 删除

    在单元格,整行(似乎是您的问题)或连续的某些列上重复

    但更重要的是,它会让你运行比完全字符串更复杂的匹配,即

    • 不区分大小写/区分大小写的搜索
    • 修剪/清理数据
    • 删除所有空格(包括CHAR(160))
    • 运行正则表达式匹配
    • 匹配任何列组合(即A列,所有列,A列和B列等) enter image description here

答案 2 :(得分:0)

我再次尝试了我的代码,它可以很好地工作..谢谢!我将在这里分享它以回答类似的问题!

  Sub Macro1()

  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 :(得分:0)

在VBA(2007年或更高版本)中执行此操作的最简单方法:

Worksheet("Sheet1").Range("A1").CurrentRegion.RemoveDuplicates(Array(1, 2, 3))

根据您的工作表布局,您可能需要将Range("A1").CurrentRegion调整为您的数据范围...

答案 4 :(得分:-3)

我认为我们需要在运行此宏之前先对数据进行排序,以完全删除重复项。