如果它与前一个相同,是否可以使用 Excel 2003 中的函数删除整行?例如:
- 苹果
- 苹果
- 李子
- 醋
- 苹果
- 香蕉
- 香蕉
- 香蕉
- 苹果
我想删除#2、7# 和#8,但我不想删除#5 和#9。仅当它是下一个时,我才想删除重复的条目。我希望我设法让你清楚。如果没有函数,我怎么能在 VBA 中做到这一点?提前致谢!
如果它与前一个相同,是否可以使用 Excel 2003 中的函数删除整行?例如:
我想删除#2、7# 和#8,但我不想删除#5 和#9。仅当它是下一个时,我才想删除重复的条目。我希望我设法让你清楚。如果没有函数,我怎么能在 VBA 中做到这一点?提前致谢!
如果它是一次性的,你可以在没有 VBA 的情况下通过在下一列中添加一个公式来相当简单 - 假设你的列是 A:
在 B2 中输入以下内容:
=IF(A1=A2,"DELETE","")
向下拖动公式
这可能适合,删除所有重复的行(实际上,不仅是单元格数据!),所以请记住,它只能在您使用单列工作表时使用。否则,您将丢失一些其他数据。
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
为您的示例运行此宏后,我得到:
您可以修改它,将值存储在数组中,然后用记住的数组填充列而不是删除行,但这现在应该很容易了。
只是一个简短的说明...如果要删除整行,请确保从范围的底部开始工作。如果您从范围的顶部向下工作,您可能会得到一些意想不到的结果。您可能还需要考虑清除单元格值然后排序,而不是删除。我会为你写一个例子,但我时间不够。如果你卡住了,我可以稍后再写给你。
编辑:
我的原始答案不一定正确,如下面的 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。