2017-06-13 120 views
1

全部!VBA,用于循环效率

我需要超过5万行数据要经过与无用信息删除行。 目前的代码工作,但不幸的是,所有的工作都很慢...我试着理解如何使它更高效,但不容易找到任何我可以理解的具体例子。

下面是当前的代码:

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 

你能帮助可能?具体的例子不胜感激。

+4

当你向前循环时,它如何正确删除,当你删除行时,你需要向后循环,它应该是'For i = vika To 2 Step -1' –

回答

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 
+0

谢谢,当你想到倒车时,关于它! –

1

反向顺序循环晒瑞士雷达表的答案是非常重要的。

为了加速您的代码,您需要将Excel数据转换为数组,而不是在每个循环迭代中引用单元格 - 它的运行速度更快。

下面是说明如何实现它: Arrays And Ranges In VBA

在你的情况,你将需要2个阵列,一个用于I和J列,第二对于B柱。

+0

谢谢你,会考虑一下。即使以上仍然给我一个滞后多... –

+0

你可以看看另一个样本 - 我准备了不同的代码循环优化,但是规则仍然是相同的 - 在这个答案[链接](https://stackoverflow.com /问题/ 44509524/VBA的多回路匹配条件/ 44514759#44514759) – smartobelix