对于甚至引用同一对象的两行代码,编写额外的行以合并With和End With是否总是更快?
例如:
If Target.Column <> 1 Or Target.Row >= 100 Then Exit Sub
Run Code Online (Sandbox Code Playgroud)
与:
With Target
If .Column <> 1 Or .Row >= 100 Then Exit Sub
End With
Run Code Online (Sandbox Code Playgroud)
这是过度杀伤力吗?
两次引用对象而不是编写三行代码是否取决于代码本身?还是写三行总是更快?
关于速度的问题-就处理速度而言,编写此行的最佳方法是什么?即第二个测试更快地读为
> 99
Run Code Online (Sandbox Code Playgroud)
比
>= 100
Run Code Online (Sandbox Code Playgroud)
?
测试行号和列号的顺序有关系吗?
我已经测试了使用以下子对象在每个实例中使用Withvs.引用Range对象的速度:
Sub WithSpeed()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim av As Double
Dim Target As Range
Dim i As Long, j As Long
'Remember time when macro starts
StartTime = Timer
Set Target = Sheet1.Cells(1, 1)
For j = 1 To 5
For i = 1 To 1000000
With Target
If .Column <> 1 Or .Row >= 100 Then Exit For
End With
Next i
av = av + Round(Timer - StartTime, 2)
Next j
'Determine how many seconds code took to run
Debug.Print 1, av / 5
End Sub
Run Code Online (Sandbox Code Playgroud)
和
Sub NoWithSpeed()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim av As Double
Dim Target As Range
Dim i As Long, j As Long
'Remember time when macro starts
StartTime = Timer
Set Target = Sheet1.Cells(1, 1)
For j = 1 To 5
For i = 1 To 1000000
If Target.Column <> 1 Or Target.Row >= 100 Then Exit For
Next i
av = av + Round(Timer - StartTime, 2)
Next j
'Determine how many seconds code took to run
Debug.Print 2, av / 5
End Sub
Run Code Online (Sandbox Code Playgroud)
结果:
first sub:
> 1 2.966
> 1 3.04
> 1 2.726
> 1 2.634
> 1 2.616
second sub:
> 2 2.924
> 2 2.708
> 2 2.506
> 2 2.496
> 2 2.724
Run Code Online (Sandbox Code Playgroud)
每个子循环500万次。我对每个子程序运行了5次,每个子程序总共运行了2500万个循环。在500万次循环之后,子程序将打印出一百万次循环所花费的平均时间。
平均:
1:2.80秒
2:2.67秒
我坚信这种差异可以忽略不计,并且可以归因于PC处理速度的波动。
当您开始引用更多行时,这可能很重要,但是使用不太可能With对您的代码速度产生很大影响。
我仍然强烈建议使用它,以提高代码的可读性并防止键入错误。