加快search和删除macros

我有一个包含三列的列表。 第一列包含名称,另外两列包含数字。 该macros取第一个名字(A1),然后在A列中search另一个事件。

当它发现它,它删除整个行。然后去A2,并做同样的事情agan。 它可以正常工作约500条,但使用3000个条目大大减缓。 有没有办法加快这个代码?

Sub Button1_DeleteRow() Dim i As Integer Dim j As Integer Dim Value As Variant Dim toCompare As Variant For i = 1 To 3000 Value = Cells(i, 1) For j = (i + 1) To 3000 toCompare = Cells(j, 1) If (StrComp(Value, toCompare, vbTextCompare) = 0) Then Rows(j).EntireRow.Delete End If Next j Next i End Sub 

如果你正在运行xl07 / 10,那么你可以用一个Remove Duplicates行来做到这一点。 如果您正在运行03,那么使用AutoFilter的解决scheme将是最有效的(如果您使用的是旧版本,则可以提供此解决scheme)

删除重复

  1. 手动

    • selectA列
    • 数据….删除重复
    • 扩大select
    • 只select列A以查找重复项
  2. ActiveSheet.Range("$A$1:$A$3000").EntireRow.RemoveDuplicates Columns:=1, Header:=xlNo

之前只有A后

要补充@ brettdj的答案,如果您正在运行Excel 2003,可以使用AdvancedFilter执行此操作,如下所示:

 Range("A1:A11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True 

注意: AdvancedFilter假定你的范围的第一行(这个例子中的行A)包含列标题,并且不会在过滤中包含那一行。

手动执行此操作:数据>filter>高级filter…>仅限唯一logging

使用Bretts技术是一个很好的答案:但要回答你为什么需要这么长时间的问题:
– 你的macros从一个接一个超过400万个单元中获得价值。 这很慢。
– 我没有看到你的macros已closuresscreenupdating和自动计算:每次删除行将刷新屏幕,Excel将重新计算。 如果你还没有closures这些,它是非常缓慢的。
这个代码应该运行得更快

 Option Explicit Sub Button1_DeleteRow() Dim i As Long Dim j As Long Dim vArr As Variant Dim iComp As Long Dim Deletes(1 To 3000) As Boolean Application.ScreenUpdating = False iComp = Application.Calculation Application.Calculation = xlCalculationManual vArr = Range("a1:A3000") For i = 1 To 3000 For j = (i + 1) To 3000 If (StrComp(vArr(i, 1), vArr(j, 1), vbTextCompare) = 0) Then Deletes(j) = True End If Next j Next i For j = 3000 To 1 Step -1 If Deletes(j) Then Rows(j).EntireRow.Delete Next j Application.ScreenUpdating = True Application.Calculation = iComp End Sub 

对列A上的数据进行sorting将使得通过一次识别和删除重复数据变得微不足道


回应下面的评论,我会解释为什么sorting是一个有用的技术。

通过按顺序对列A进行sorting,重复删除仅仅是比较列A中的相邻条目的问题。然后,您可以删除重复的行,或者标记它们以供以后删除。

这个过程实际上应该不那么繁琐,因为你只需要对列表进行sorting(而sorting,内置的,往往是非常快的),然后通过列表删除/标记一个通过(而不是4498500)去(显然你需要一个后续的清理通行证,如果你去标记)。

在改变列表顺序的问题上,首先添加一个额外的列(例如D列),并让D2包含值2(即行号)。 稍后快速填充,每行都编号。 在sorting和删除/标记之后,恢复原始顺序只是在D列上重新sorting,然后可以删除。

当我必须对重复项执行一些操作或其他操作时,我使用这种方法。 换句话说,列A具有重复的值,但是列B和C中的值是有意义的(例如,我可能要将所有与列A的特定值相关的条目的值相加)。 然而,在很多情况下,使用SQL来获得相同的结果会更容易一些