我正在使用嵌套在循环中的if语句,这会减慢我的代码速度。我该怎么做才能加快速度?

时间:2017-06-19 14:28:57

标签: vba excel-vba loops if-statement excel

我有一个嵌套在循环中的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 team\Inventory_Planning\2016_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

2 个答案:

答案 0 :(得分:1)

提高性能的最佳方法是尽可能消除循环。正如评论中所提到的,您可以在适当的值上过滤列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.根据需要进行调整。

答案 1 :(得分:0)

您不需要使用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