【发布时间】:2017-10-17 17:00:42
【问题描述】:
我有以下内容,用于删除 DX 列中的名称不是指定名称的所有数据行。该代码将对所有行进行排序并删除不包含该特定名称的每一行。问题是,速度太慢了。 有什么想法吗?
Sub DeleteNonName()
Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow As Long
Dim CalcMode As Long
Dim ViewMode As Long
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With ActiveSheet
.Select
ViewMode = ActiveWindow.View
ActiveWindow.View = xlNormalView
.DisplayPageBreaks = False
Firstrow = 2
Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
For Lrow = Lastrow To Firstrow Step -1
With .Cells(Lrow, "DX")
If Not IsError(.Value) Then
If InStr(.Value, "Name") = 0 Then .EntireRow.Delete
End If
End With
Next Lrow
End With
ActiveWindow.View = ViewMode
With Application
.ScreenUpdating = True
.Calculation = CalcMode
End With
End Sub
【问题讨论】:
-
请参考this,代码中最耗时的部分是删除任务。所以也请阅读Excel VBA performance issues comparing row to column delete 和Improving a Loop to delete rows in excel faster。所以你应该在你的代码上只做一次删除任务,这是最快的方法。
-
这个问题更适合 CodeReview。在那里,您将获得有关需要优化的代码的帮助。
-
@ScottCraner 是的,除了它总是相同的答案 - 退出使用
Select,不要迭代Range,改用数组;找出您要删除的行,将它们合并到一个符号Range,然后在一次操作中删除该合并范围。总工作表读取:1。总工作表写入:1。 -
@Mat'sMug 这可能是并且不可避免地是正确的,但这仍然不能让这个网站成为一个合适的问题。事实上,它太宽泛了。
-
> Sub DeleteNotNAME() > With Range("X2", Cells(Rows.Count, "X").End(xlUp)) > If ActiveSheet.FilterMode Then .AutoFilter> .AutoFilter Field:=128, Criteria1:="NAME" > On Error Resume Next > .SpecialCells(xlVisible).EntireRow.Delete > On Error GoTo 0 > If ActiveSheet .FilterMode 然后 .AutoFilter > End With > End Sub`