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

我想知道如果有人知道如何删除重复行..说例如,

ABC 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重复了两次。在其他一些情况下,名称可以是其他types,如NOON,Morning等。而第8行不一定是最后一行。 我不知道如何比较行来检查重复的名称,然后删除它们。 我需要运行一个macros,所以我需要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)有运行时错误。我不知道为什么它是..如果你知道什么可以与我分享或修改它小。 将感恩!

user1204868

build议删除行时,始终以反向模式进行。 看到这个代码。 在删除之前,您也不需要select单元格。 这会减慢你的代码:)

 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,那么@brettdjbuild议的一行代码是最快的:)

HTH

希德

手册
Bill Jelen的网站提供了三种非VBA技术

  1. 所有版本:使用高级筛选器中的唯一选项
  2. X107 / 10:使用条件格式来标记重复
  3. Xl 07/10:使用删除重复图标

对于(3)等价的VBA会是这样的(没有标题)
ActiveSheet.Range("$A$1:$C$100").RemoveDuplicates Columns:=1, Header:=xlNo

在这里输入图像描述

处理现有的重复
我的免费重复主插件会让你

  • select
  • 颜色
  • 名单
  • 删除

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

但更重要的是,它会让你运行比精确的string更复杂的匹配,即

  • 不区分大小写/区分大小写的search
  • 修剪/清洁数据
  • 删除所有空格(包括CHAR(160))
  • 运行正则expression式匹配
  • 匹配列的任何组合(即列A,所有列,列A和B等) 在这里输入图像说明

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

  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 

VBA(2007年或更高版本)最简单的方法:

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

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

我想我们需要在运行这个macros之前先对数据进行sorting,以完全删除重复项。