我有一个嵌套在循环中的 if 语句,用于清理导入的数据。if 语句计算活动单元格的值,然后删除活动单元格的行(如果它满足特定条件(。我想知道是否有另一种方法可以对此进行编码,这样它就不会在每次迭代时都引用电子表格,从而使其运行速度比当前更快。任何提示将不胜感激。我使用的代码如下:
Sub copy_RawAvgDem()
Dim wkb1 As Workbook
Dim sht1 As Worksheet
Dim wkb2 As Workbook
Dim sht2 As Worksheet
Set wkb1 = ThisWorkbook
Set wkb2 = Workbooks.Open("M:FAST teamInventory_Planning2016_05_FG_Inv_targets.xlsx")
Set sht1 = wkb1.Sheets("RawAvgDem")
Set sht2 = wkb2.Sheets("Model")
sht2.ShowAllData
sht2.Cells.Copy
sht1.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
wkb2.Close False
Worksheets("RawAvgDem").Activate
Range("AN2").Select
Do Until IsEmpty(ActiveCell.Value)
If ActiveCell.Value = "MTO" Then
Rows(ActiveCell.Row).EntireRow.Delete
Else: ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub
提高性能的最佳方法是尽可能消除循环。如注释中所述,您可以根据适当的值过滤列AN
,然后一次删除所有行,而不是循环访问。wkb2.Close
后,您可以改为执行以下操作:
With Worksheets("RawAvgDem")
.Range("$AN$2").AutoFilter Field:=Range("$AN$2").Column, Criteria1:="MTO"
.Range(Range("$AN$3"), Range("$AN$3").End(xlDown)).EntireRow.Delete
.Range("$AN$2").AutoFilter Field:=Range("$AN$2").Column
End With
这假定 A-AN 列中有数据。如果不是这种情况,则必须将Field
更新为适当的数字(这是基于筛选的列数的相对数字(。作为参考,AN 是电子表格中的第 40 列(Range("$AN$2").Column
返回 40,因此静态 40 也可以在那里工作(。例如,如果 A 列中缺少数据,则此数字必须为 39。根据需要进行调整。
用ActiveCell.Offset(1, 0).Select
前进到下一行,把你最后的循环替换为下面的循环:
With Worksheets("RawAvgDem")
Dim i As Long
i = 2
Do Until IsEmpty(.Range("AN" & i).Value)
If .Range("AN" & i).Value = "MTO" Then
.Rows(i).Delete
Else
i = i + 1
End If
Loop
End With