VBA,循环效率

时间:2017-06-13 07:50:19

标签: excel vba excel-vba

所有!

我需要浏览超过50k行的数据并删除无用信息的行。 当前的代码可以工作,但不幸的是,这一切都在缓慢......我试着理解如何提高它的效率,但是我不能轻易找到任何我能理解的具体例子。

以下是当前代码:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ThisWorkbook.Worksheets("FIC DATA WITH 3A").Activate
vika = Cells(Rows.Count, "B").End(xlUp).Row

r = 2
For i = 2 To vika                  
    If Not Cells(r, "J") > 42369 Then                       
        Rows(r).EntireRow.Delete
    ElseIf Cells(r, "I") = "OC" Or Cells(r, "B") = "Sales Doc." Or Cells(r, "B") = "" Then                     
        Rows(r).EntireRow.Delete
    Else
        r = r + 1
    End If
Next i
你能帮帮忙吗?具体的例子不仅仅是值得赞赏的。

2 个答案:

答案 0 :(得分:2)

要删除行,您需要向后循环For i = vika To 2 Step -1

此外,无需Activate“FIC DATA WITH 3A”表格,以便在其上运行代码。

删除行的正确语法是Rows(i).Delete,而不是Rows(r).EntireRow.Delete。如果你想使用EntireRow,那么语法是Range("A" & i).EntireRow.Delete(但对我来说没有任何意义,为什么在这种情况下使用它。)

<强> 代码

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

With ThisWorkbook.Worksheets("FIC DATA WITH 3A")
    vika = .Cells(.Rows.Count, "B").End(xlUp).Row

    For i = vika To 2 Step -1
        If Not Cells(i, "J") > 42369 Or Cells(i, "I") = "OC" Or Cells(i, "B") = "Sales Doc." Or Cells(i, "B") = "" Then
            Rows(i).Delete
        End If
    Next i
End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

答案 1 :(得分:1)

Shai Rado关于以相反顺序循环的答案非常重要。

要加速代码,您需要将Excel数据转换为数组,而不是在每次循环迭代中引用Cell - 它运行得更快。

以下是如何实现它的描述: Arrays And Ranges In VBA

在您的情况下,您需要2个数组,一个用于I和J列,第二个用于B列。