【问题标题】:Excel VBA For Loop Optimization - Exit when j = 2Excel VBA 循环优化 - 当 j = 2 时退出
【发布时间】:2018-09-26 15:09:30
【问题描述】:

我正在尝试优化将删除符合特定条件的行的代码。我有工作代码,但以下代码创建了 7 秒的等待时间来执行:

Dim j As Long
For j = 2 To Rows.Count
If (Range("J" & j).Value <> "") Then
Range("A" & j & ":R" & j).Select
Selection.Delete Shift:=xlUp
End If
Next j

以下代码立即运行;但是,一旦 j = 2,我就无法让它工作。在删除第 1 行中的列标题之前,需要添加什么代码来停止循环?

' Delete rows where column J is not blank
For j = Range("J" & Rows.Count).End(xlUp).Row To 1 Step -1
If (Range("J" & j).Value <> "") Then
Range("A" & j & ":R" & j).Select
Selection.Delete Shift:=xlUp
End If
Next j

【问题讨论】:

  • 如果要删除行,则需要向后循环。
  • 你为什么不写For j = ... To 2 Step -1
  • 至 2 Step -1 就是答案。当您只是窃取一些代码而您实际上并不知道这一切意味着什么时,就会发生这种情况!对缺少缩进表示歉意...我的原始代码格式从 stackoverflow 得到一个错误,说所有代码都需要缩进 4 个空格。我太从字面上理解了。菜鸟失误。谢谢大家的帮助!
  • Markdown 语法需要 4 个空格来识别这样的代码块 - 您仍然可以保留原始和正确的缩进:只需粘贴您的代码,然后将其全部选中并按 Ctrl+K (或使用编辑工具栏中的{} 按钮)
  • 我还要补充一点,第一个代码块是遍历所有行,而第二个代码块从包含数据的最后一行开始 - 这必须节省几秒钟。

标签: excel vba for-loop exit


【解决方案1】:

如 cmets 中所述,您应该向后查找是否有删除。如果您从row#2 删除到最后一行,可能有一些行应该被删除但仍保留在那里。以此为例,假设我们要删除row#3row#4。如果我们继续这样做,row#4 在删除旧的row#3 后变为新的row#3。下一行要检查的是row#4,也就是原来的row#5。所以row#4中的数据现在实际上在row#3中,永远不会被删除。

但是,当您的数据非常庞大时,删除会占用大量资源,从而拖慢速度。最好找到所有要删除的范围,最后一次删除。我们可以通过Union 方法来实现。而且这样也可以防止前面提到的问题,所以我们可以像其他循环一样向前做。

最后,您可以避免选择范围,因为它效率不高。 Range().Delete 可以简单地删除范围而不选择它。

代码应该是这样的。

'pseudo code
Sub deletion()
    For i = 2 To lastrow
        If shouldBeDeleted Then
             If deletingRng Is Nothing Then
                 Set deletingRng = Cells(i, X)
             Else
                 Set deletingRng = Union(deletingRng, Cells(i, X)
             End If
        End If
     Next i

     deletingRng.Delete Shift:=xlUp
End Sub

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多