Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在VBA中,使用With、End With是否总是更好?_Excel_Vba - Fatal编程技术网

Excel 在VBA中,使用With、End With是否总是更好?

Excel 在VBA中,使用With、End With是否总是更好?,excel,vba,Excel,Vba,即使是引用同一对象的两行代码,写额外的行合并并结束是否总是更快 例如: If Target.Column <> 1 Or Target.Row >= 100 Then Exit Sub ? 我测试行号和列号的顺序有关系吗?首先,当然行数越多速度就越快,很多。在这种情况下,你不会看到和感觉到任何不同,但至少你会养成一个习惯,总是这样开始 我不确定>99和=>100的情况,但我认为in=>100选项代码在两个条件下工作-花费的时间更多 在VBA中,在您的情况下,无论哪种情况是第

即使是引用同一对象的两行代码,写额外的行合并并结束是否总是更快

例如:

If Target.Column <> 1 Or Target.Row >= 100 Then Exit Sub

?


我测试行号和列号的顺序有关系吗?

首先,当然行数越多速度就越快,很多。在这种情况下,你不会看到和感觉到任何不同,但至少你会养成一个习惯,总是这样开始

我不确定>99和=>100的情况,但我认为in=>100选项代码在两个条件下工作-花费的时间更多

在VBA中,在您的情况下,无论哪种情况是第一位的。VBA正在检查这两个条件,即使第一个条件为真。这种差异会产生如下代码:

With Target
    If .Column <> 1 Then Exit Sub
    If .Row >= 100 then exit sub
End With
带目标的

如果是第1列,则退出Sub
如果.Row>=100,则退出sub
以

在这种情况下,顺序会产生影响,始终将更可能的情况放在第一位。

我已经测试了使用
的速度,与在每个实例中使用
范围
对象的速度相比,使用以下子项:

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
每个子循环500万次。我对每个sub运行了5次,总共每个sub运行了2500万次循环。在500万次循环之后,sub打印出了100万次循环的平均时间

平均值:
1:2.80秒
2:2.67秒

我坚信这种差异可以忽略不计,可以归因于电脑处理速度的不稳定。
当您开始引用更多行时,这可能很重要,但将
一起使用不太可能对代码的速度产生很大影响


不过我还是强烈建议使用它,以提高代码可读性并防止键入错误。

非常感谢。那么,如果我在两个或更多的场合引用一个对象,那么使用和结束它会更快吗?你的第二点也是有道理的——我不知道如果第一点已经满足,两个陈述都会被检查。是的,正确。我也很惊讶,但不幸的是,这是VBA的工作方式,在那里找到了:-非常好的演讲。不能要求比这更全面的测试。。。!非常感谢你的洞察力。非常感谢,蒂姆。很高兴我能帮忙!:)<代码>当您开始引用更多行时,这可能很重要,但使用With不太可能对代码的速度产生很大影响。
是的,这就是您将开始看到差异的地方:)
>= 100
With Target
    If .Column <> 1 Then Exit Sub
    If .Row >= 100 then exit sub
End With
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
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