2012-03-10 115 views
3

我不知道是否有人知道如何删除重复的行..比方说,如何查找重复的行然后删除其中的一个?需要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 

对于具体的例子以上,试验重复两次。在其他一些情况下,该名称可以是一些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)。我不知道为什么它..如果你知道的东西可以与我分享或者修改它一下。会很感激!

+2

而不是重复行(即A2,B2,C3匹配A3,B3和C3等),它似乎你只想删除列A中重复的记录。删除行时,最好删除底部以避免跳过行。 – brettdj 2012-03-10 10:49:45

+1

+1同意“自下而上” – 2012-03-11 10:58:46

+0

我认为你可能错过了我的帖子下面的我的一行VBA解决方案 – brettdj 2012-03-12 02:26:20

回答

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

希德

+0

任何想法为什么反向行删除更好? – franklin 2012-03-13 17:46:58

+0

更新了我的文章:) – 2012-03-13 17:54:34

+0

@SiddharthRout:我正在经历类似于问题中描述的情况。我试过你的代码,但得到错误''联盟'没有宣布。“请帮助。 – slyclam 2013-07-30 10:34:58

4

手册
Bill Jelen's website提供三种非VBA技术

  1. 所有版本:使用在高级筛选唯一选项
  2. XL 07/10:使用条件格式化以重复标记
  3. XL 07/10:使用删除重复图标

对于(3)相当于VBA会是这样的(因为没有头)
ActiveSheet.Range("$A$1:$C$100").RemoveDuplicates Columns:=1, Header:=xlNo

enter image description here

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

  • 选择
  • 颜色
  • 列表
  • 删除的任何细胞

重复,整个行(这似乎是你的问题),或者某些列在一排

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

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

嗨,我需要vba ..我正在运行宏..这就是为什么。 – user1204868 2012-03-10 09:33:08

+0

@ user1204868以及你没有在你的问题中指定该要求。我的插件是一个宏观解决方案,但菜单驱动,而不是你可以直接编码。 – brettdj 2012-03-10 09:45:51

+0

哦..对不起。我没有意识到这一点,因为我认为可能与VBA和VBA excel的标签,它应该是非常清楚..将注意到..顺便说一句,你对编码有什么想法吗? – user1204868 2012-03-10 09:49:17

0

我曾经再次尝试我的代码,它可以工作以及..钍anks!我将在这里分享它来回答将来的类似问题!

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 
0
为此在VBA(在2007或更高版本)

最简单的方法:

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

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

+0

如何制作'Array(1,2,3)'dynamic – shareef 2016-03-24 07:34:02

+0

@shareef您想让它变成动态的?元素的数量或哪些列?你显然可以根据你的需要改变'Array(1,2,3)'到任何其他数组... – 2016-03-25 13:47:08

+1

谢谢你的答复,实际上我解决了它,并发布我的答案在这里我的问题http://stackoverflow.com/问题/ 36195792/VBA决策-A-列数variabl阵列换removeduplicates/36195793#36195793 – shareef 2016-03-25 15:43:08

-3

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

相关问题