Gau*_*lur 3 excel optimization vba
我有一个相当简单的代码,我用来遍历excel数据表.基本上,我有超过150,000行数据,我想删除除了其中包含"仪器故障"的那一行以外的每一行,在这种情况下,我想要那行和它上面和下面的那一行(可能包含与失败).这是我的代码:
Sub UnsignedFailure()
Application.ScreenUpdating = False
'Start point
Set r = Range("E1")
'Loop, total rows is a function, executes quickly
For t = 3 To TotalRows
'Check for a failure
k = InStr(1, r.Cells(t, 1).Value, "Instrument Failure")
'Verify that it corresponds to a GC
b = InStr(1, r.Cells(t, 1).Offset(0, -3).Value, "GC")
If k <> 0 And b <> 0 Then
'Skip two rows if it is true
t = t + 2
Else
'Delete the previous row since this row is not a failure
r.Cells(t - 1, 1).EntireRow.Delete
'Go back a row to account for the deleted row
t = t - 1
End If
Next t
Application.ScreenUpdating = True
End Sub
Run Code Online (Sandbox Code Playgroud)
我已经通过单步检查了它,它的工作原理.然而,即使每次"IF"为真时代码都会中断,中断之间的时间似乎也很长(检查20,000个单元格可能需要5分钟).如果我让代码运行而不会破坏,我还没有完成它(计算机冻结).我在代码中遗漏了什么或效率低下了吗?任何帮助将不胜感激!
Pet*_*ano 12
我对excel宏的经验告诉我,将符合条件的数据复制到新工作表,而不是删除不匹配的行,效率要高得多.
每次删除一行时,都需要几毫秒来重新计算工作表(即使没有公式,它仍会检查每个单元格以查看是否需要更新)并将显示更新为用户.您已经禁用了屏幕更新,这肯定会减少部分时间.另一种方法是关闭Excel Calculation,将Application.Calculation = xlCalculationManualsub 放在sub的顶部以禁用重新计算,Application.Calculation = xlCalculationAutomatic在底部再次启用它. 这个站点有一些很好的指针,可以优化excel的VBA代码.
正如我所说的,我认为最有效的方法是在符合条件时将数据移动到新工作表.