我有一个嵌套在循环中的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 team\Inventory_Planning\2016_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
答案 0 :(得分:1)
提高性能的最佳方法是尽可能消除循环。正如评论中所提到的,您可以在适当的值上过滤列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.根据需要进行调整。
答案 1 :(得分:0)
您不需要使用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