0

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

  1. 苹果
  2. 苹果
  3. 李子
  4. 苹果
  5. 香蕉
  6. 香蕉
  7. 香蕉
  8. 苹果

我想删除#2、7# 和#8,但我不想删除#5 和#9。仅当它是下一个时,我才想删除重复的条目。我希望我设法让你清楚。如果没有函数,我怎么能在 VBA 中做到这一点?提前致谢!

4

3 回答 3

5

如果它是一次性的,你可以在没有 VBA 的情况下通过在下一列中添加一个公式来相当简单 - 假设你的列是 A:

  • 在 B2 中输入以下内容:

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

  • 在两列上添加自动过滤器
  • 在 B 列中过滤“DELETE”
  • 删除所有可见行
  • 删除 B 列
于 2013-01-30T14:23:39.900 回答
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

为您的示例运行此宏后,我得到:

运行后视图 vba

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

于 2013-01-30T15:02:30.870 回答
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。

于 2013-01-30T15:12:45.873 回答