首页 > 解决方案 > 如何删除重复行但保存最新行(VBA)?

问题描述

我有一个 excel,我有 2 张工作表,我想将选定的列导入另一张工作表并删除可能的重复行。问题是,当我运行我的代码时,它会删除我最新的重复行,即使我想保存最新的行并删除另一个“旧”重复。我真的很感激任何帮助!谢谢:)这是我迄今为止尝试过的代码:

Private Sub CommandButton1_Click()

Cells.RemoveDuplicates Columns:=Array(1, 2, 3)

Dim lastrow As Long, erow As Long
lastrow = Worksheets("one").Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastrow
Worksheets("one").Cells(i, 1).Copy
erow = Worksheets("two").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("one").Paste Destination:=Worksheets("two").Cells(erow + 1, 1)

Worksheets("one").Cells(i, 3).Copy
Worksheets("one").Paste Destination:=Worksheets("two").Cells(erow + 1, 2)

Next i

End Sub

另一个问题是,我已经尝试过这段代码来测试excel,但是我想使用这个宏的地方有很多更大的数据。浏览所有数据需要很长时间..是我的代码中的问题还是实际的excel太大了?我希望我能清楚地解释一切。

谢谢!

标签: excelduplicatesadd

解决方案


“问题是,当我运行我的代码时,它会删除我最新的重复行......”

问题是数据的排序顺序。

Remove Duplicates从第一个索引移动到最后一个并保持第一次出现。因此,您要么需要对数据进行排序,以使您的“最旧”重复项是第一次出现在顶部,要么您必须使用不同的方法来删除重复项。


“是我的代码有问题还是实际的excel太大了?”

可能两者兼而有之,但可以肯定的是,您的代码绝对可以运行得更快。

低悬的果实是放在Application.EnableScreenUpdating = False你子的开头。这会阻止 Excel 在您运行时更新屏幕。这将产生巨大的影响。只需记住将其重新设置为True

您还一次循环遍历一个范围,但我看不出您需要这样做的任何特殊原因。您可以在单个语句中复制 while 范围而无需循环。您甚至不需要复制您不关心订购格式,您可以传输值只是使范围彼此相等。

如何在不剪切或循环的情况下传输值的示例

  Worksheets("two").Range("A2:A" & lastrow).Value = Worksheets("one").Range("E2:E" & lastrow).Value

如果您愿意,可以使用与复制和粘贴相同的方法。


推荐阅读