删除重复的行(只有当它是下一个!)

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

  1. 苹果
  2. 苹果
  3. 李子
  4. 尖酸刻薄
  5. 苹果
  6. 香蕉
  7. 香蕉
  8. 香蕉
  9. 苹果

我想删除#2,7#和#8,但是我不想让#5和#9被删除。 我只想删除一个重复的条目,如果它是下一个。 我希望我能保持清楚。 如果没有function,我怎样才能在VBA中做到这一点? 提前致谢!

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

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 

运行这个macros为你的例子,我得到:

运行后视图vba

您可以对其进行修改,将值存储在数组中,而不是使用记住的数组填充列,而不是删除行,但现在应该很容易。

如果是一次性的,可以在没有VBA的情况下通过在下一列添加一个公式来实现 – 比方说你的列是A:

  • 在B2中放置如下:

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

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

只是简单的说明…如果您要删除整行,请确保从范围的底部开始工作。 如果你从范围的顶部向下工作,你可能会得到一些意想不到的结果。 您可能还需要考虑清除单元格值然后进行sorting,而不是删除。 我会为你写一个例子,但是时间很短。 如果你被卡住了,我可以在晚些时候给你写信。

编辑:

我的原始答案不一定是正确的,如下面的makciook解决scheme所示。 在过去,我错误地用这种方式来解决这个问题(不要把它当作解决scheme!!!):

  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 

使用这个脚本,一旦一行被删除并向上移动,单元格范围不会重置。 所以运行这个不会在你的列表中find第二个重复的香蕉。 作为替代scheme,我通常会find最后一行,并按照第一行的方式来处理删除发生时向上移动的行。 如果可能,我会给自己一个-1。