【发布时间】:2014-09-23 23:29:27
【问题描述】:
我要做的是删除电子表格中两个单独列中值为 0 的行,因为这表明该行中没有有用的数据。虽然可以将For loop 与If/Then 条件一起使用,但我发现这非常慢,因为我的数据集有大约51,000 行,而且它实际上需要数小时甚至数天才能运行。
经过一番搜索,我发现了另一种方法,我认为它会更快并且目前正在使用:
Public Sub deleteRows()
' source: http://www.ozgrid.com/forum/showthread.php?t=64364
Dim lastRow As Long
Dim n As Long
Dim RT As Date
RT = Time
With ActiveSheet
lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
End With
For n = lastRow To 2 Step -1
If (Trim(ActiveSheet.Cells(n, 3).Value) = 0) And (Trim(ActiveSheet.Cells(n, 6).Value) = 0) Then
ActiveSheet.Cells(n, 1).EntireRow.Delete
End If
Next n
MsgBox Format(Time - RT, "hh:mm:ss")
End Sub
但是,我只使用 1000 个单元进行了测试,运行时间为 402 秒,这表明以相同的速率运行所有数据需要 5.584 小时。
有什么方法可以加快这个过程吗?我错过了什么明显的东西吗?
*编辑:此代码作为另一个代码的子部分运行,其中 ScreenUpdating = False 在代码的开头声明。
【问题讨论】:
-
如果您没有在代码的其他地方执行此操作,请在开始修改工作表之前关闭
ScreenUpdating。例如,将Application.ScreenUpdating = False放在For循环的前面。然后在MsgBox之前设置该值= True。 -
@andyholaday 我在代码的开头使用 Application.ScreenUpdating = False,我应该指定它。不过谢谢!
标签: excel performance vba loops