删除重复的行(仅当它是下一行!)

时间:2013-01-30 14:20:12

标签: excel vba duplicate-removal

是否可以使用Excel 2003中的函数删除整行,如果它与前一行相同?例如:

  1. 苹果
  2. 苹果
  3. 李子
  4. 苹果
  5. 香蕉
  6. 香蕉
  7. 香蕉
  8. 苹果
  9. 我想删除#2,7#和#8,但我不希望删除#5和#9。我想删除一个重复的条目,如果它是下一个。我希望我能够清楚地告诉你。 如果没有功能,我该如何在VBA中执行此操作?提前谢谢!

3 个答案:

答案 0 :(得分:3)

如果它是一次性的,你可以通过在下一栏中添加一个公式,在没有VBA的情况下做到这一点 - 让我们说你的专栏是A:

    B2中的
  • 表示如下:

    =IF(A1=A2,"DELETE","")
    
  • 拖动公式

  • 在两列上添加自动过滤器
  • 过滤B列中的“DELETE”
  • 删除所有可见行
  • 删除B列

答案 1 :(得分:1)

这可能是适合的,删除所有重复的行(物理上,不仅仅是单元格数据!),因此请记住,只有在使用单列工作表时才能使用它。否则你会丢失一些其他数据。

Sub Unduplicate()
 Dim prev As String
 Dim sel As Range
 Dim i As Integer

 Set sel = Range(Selection, Selection)
 prev = sel.Offset(0).Value     ' set prev as the first value - never will be deleted
 i = 1    ' start from 2nd row
 Do While sel.Offset(i).Value <> "" And sel.Offset(i).Value <> ""
    If sel.Offset(i).Value = prev Then    ' if duplicate - delete row
        sel.Offset(i).EntireRow.Delete
    Else      ' else set new prev, and go further
        prev = sel.Offset(i).Value
        i = i + 1
    End If
 Loop
End Sub

为你的例子运行这个宏之后,我得到了:

after-run view vba

您可以修改它,将值存储在数组中,然后用记忆数组填充列而不是删除行,但现在应该很容易。

答案 2 :(得分:1)

快速注释...如果要删除整行,请确保从范围的底部开始工作。如果您从范围顶部向下工作,可能会得到一些意想不到的结果。您可能还需要考虑清除单元格值然后排序,而不是删除。我会为你写一个例子,但我的时间很短。如果你遇到困难我可以在以后为你写。

修改

我的原始答案不一定正确,如下面的makciook解决方案所示。在过去,我错误地以这种方式处理问题(不要将其用作解决方案!!!):

  Sub duplicates()
  Dim c As Range, rng As Range

  Set rng = Selection ''Select the entire list before running

  For Each c In rng

      If c.Value = c.Offset(-1, 0).Value Then c.EntireRow.Delete

  Next

  End Sub

使用此脚本,一旦删除行并向上移动,单元格范围不会重置。所以运行它不会在列表中捕获第二个香蕉副本。作为替代方案,我通常会找到最后一行,然后按照第一行的方式工作,以便在发生删除时将行向上移动。如果可能的话,我会给自己一个-1。