【问题标题】:How to remove duplicate row but save the latest one (VBA)?如何删除重复行但保存最新的行(VBA)?
【发布时间】:2019-10-11 07:48:13
【问题描述】:

我有一个 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太大了?我希望我能清楚地解释一切。

谢谢!

【问题讨论】:

    标签: excel duplicates add


    【解决方案1】:

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

    问题在于数据的排序顺序。

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


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

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

    最简单的方法是把Application.EnableScreenUpdating = False放在你sub的开头。这会阻止 Excel 在您运行时更新屏幕。这将产生巨大的影响。请记住再次将其设置回True

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

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

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

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

    【讨论】:

    • 非常感谢您的帮助!我会再试一次:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2020-12-19
    相关资源
    最近更新 更多