我有以下代码,它完全符合我的需要但是,循环运行时间太长(3分钟+)。我是VBA的新手所以我不确定1)最好的选择是什么2)如何使用适当的语法替代该代码并使我的代码运行完美无缺。谢谢!
Dim i As Integer
For i = 2 To 13000
If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police"
And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"
Next i
答案 0 :(得分:1)
在循环中访问工作表非常慢。更好的方法是将数据复制到数组上的Variant
数组循环中,然后将结果复制回工作表
这样的事情:
Sub Demo()
Dim i As Long
Dim datCol3 As Variant
Dim datCol14 As Variant
With Sheets("Sheet1")
' Copy data into a Variant Array
datCol3 = .Range(.Cells(1, 3), .Cells(13000, 3)).Formula
datCol14 = .Range(.Cells(1, 14), .Cells(13000, 14)).Value
' Loop over the array
For i = 2 To 13000
If datCol3(i, 1) = "Police" And datCol14(i, 1) = "Bi-wkly Uniform Pay" Then
datCol3(i, 1) = "Police - Uniform"
End If
Next
'Return the results to the sheet
.Range(.Cells(1, 3), .Cells(13000, 3)).Formula = datCol3
End With
End Sub
答案 1 :(得分:0)
这可能不是最佳答案,但请尝试设置局部变量
Var sht1 = Sheets(“Sheet1”)可能会略微减少对象的选择。此外,没有必要使用(i,3)选择范围和单元格,因为它是单个单元格的范围,因此组合起来就像
If sht1.Range.Cells(i,3) = "Police" And sht1.Range.Cells(i,14) = "Bi-wkly Uniform Pay" Then sh1.Range.Cells(i,3) = "Police Uniform"
Next i
如果这不起作用并且您可以将它放在不同的列中(比如列O或15),那么您只需使用公式然后拖动/双击,或者您可以使用整个数组公式列相似,然后按ctrl + shift + enter使其计算为数组公式。
希望这有点帮助。
答案 2 :(得分:0)
建议1
替换:
If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police"
And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"
由:
With Sheets("Sheet1")
If .Range(Cells(i, 3), Cells(i, 3)) = "Police" _
And .Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
.Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"
End With
建议2
替换:
.Range(Cells(i, 3), Cells(i, 3))
通过
.Cells(i, 3)
建议3
添加:
Application.ScreenUpdating = False
如果没有此声明,屏幕将重新绘制每次更改。这比其他任何东西都要花费更多的时间。