我正在使用嵌套在循环中的 if 语句,这会减慢我的代码速度.我能做些什么来加快速度



我有一个嵌套在循环中的 if 语句,用于清理导入的数据。if 语句计算活动单元格的值,然后删除活动单元格的行(如果它满足特定条件(。我想知道是否有另一种方法可以对此进行编码,这样它就不会在每次迭代时都引用电子表格,从而使其运行速度比当前更快。任何提示将不胜感激。我使用的代码如下:

Sub copy_RawAvgDem()
Dim wkb1 As Workbook
Dim sht1 As Worksheet
Dim wkb2 As Workbook
Dim sht2 As Worksheet
Set wkb1 = ThisWorkbook
Set wkb2 = Workbooks.Open("M:FAST teamInventory_Planning2016_05_FG_Inv_targets.xlsx")
Set sht1 = wkb1.Sheets("RawAvgDem")
Set sht2 = wkb2.Sheets("Model")
sht2.ShowAllData
sht2.Cells.Copy
sht1.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
wkb2.Close False
Worksheets("RawAvgDem").Activate
Range("AN2").Select
Do Until IsEmpty(ActiveCell.Value)
    If ActiveCell.Value = "MTO" Then
        Rows(ActiveCell.Row).EntireRow.Delete
    Else: ActiveCell.Offset(1, 0).Select
    End If
Loop
End Sub

提高性能的最佳方法是尽可能消除循环。如注释中所述,您可以根据适当的值过滤列AN,然后一次删除所有行,而不是循环访问。wkb2.Close后,您可以改为执行以下操作:

With Worksheets("RawAvgDem")
        .Range("$AN$2").AutoFilter Field:=Range("$AN$2").Column, Criteria1:="MTO"
        .Range(Range("$AN$3"), Range("$AN$3").End(xlDown)).EntireRow.Delete
        .Range("$AN$2").AutoFilter Field:=Range("$AN$2").Column
End With

这假定 A-AN 列中有数据。如果不是这种情况,则必须将Field更新为适当的数字(这是基于筛选的列数的相对数字(。作为参考,AN 是电子表格中的第 40 列(Range("$AN$2").Column返回 40,因此静态 40 也可以在那里工作(。例如,如果 A 列中缺少数据,则此数字必须为 39。根据需要进行调整。

你不需要

ActiveCell.Offset(1, 0).Select前进到下一行,把你最后的循环替换为下面的循环:

With Worksheets("RawAvgDem")
    Dim i As Long
    i = 2
    Do Until IsEmpty(.Range("AN" & i).Value)
        If .Range("AN" & i).Value = "MTO" Then
            .Rows(i).Delete
        Else
            i = i + 1
        End If
    Loop
End With

最新更新