【发布时间】:2018-10-28 03:21:56
【问题描述】:
我正在运行一个脚本来查找和删除包含 2018 年之后数据的行。我正在搜索大约 650000 行。每次我在 5 秒后运行脚本时,我的光标都会变成旋转的圆圈,并且 excel 程序变得无响应。这是我正在使用的代码。
Option Explicit
Option Base 1 'row and column index will match array index
Sub removeWrongYear()
Dim i As Long, yearA As Long, rowsCnt As Long
Dim rowsToDelete As Range
Dim vData As Variant
With ActiveSheet
'1st to 635475 row, 20th column
vData = Range(.Cells(1, 20), .Cells(635475, 20))
For i = UBound(vData) To 2 Step -1
If Val(Right(vData(i,1),2)) > 17 Then
Debug.Print Val(Right(vData(i,1),2))
rowsCnt = rowsCnt + 1
If rowsCnt > 1 Then
Set rowsToDelete = Union(rowsToDelete, .Rows(i))
ElseIf rowsCnt = 1 Then
Set rowsToDelete = .Rows(i)
End If
End If
Next i
End With
If rowsCnt > 0 Then
Application.ScreenUpdating = False
rowsToDelete.EntireRow.Delete
Application.ScreenUpdating = True
End If
End Sub
【问题讨论】:
-
我认为无论你做什么都会很慢,除非你在数组中做所有事情。自动过滤器会比我认为的这种方法更快。
-
你也可以调用 application.screenupdating = false 在已经完成循环之后。最好先调用它。
-
如果您不必担心用户对 Excel 工作表的更改,您可以在
Next i行之前添加DoEvents。它会阻止 Excel 不响应;但是,它也会允许与您的工作簿/工作表进行一些(可能非常)延迟的交互。 -
@Mistella 除了你这样做,因为
Range分配中的Range调用不合格。 -
@MathieuGuindon 我明白了。此外,
With ActiveSheet在这种情况下也可能存在很大问题。