即使没有错误,"Line3:" 的代码仍然在 On Error GoTo Line3 上得到 运行
Even without an Error, the code for "Line3:" still gets run on On Error GoTo Line3
示例代码:
On Error GoTo Line3
More code
Line3:
Some code
Some code
More code
即使没有 错误,第 3 行下面的“一些代码”仍然得到 运行,即使我不希望它 运行 .否则,当出现错误时,Line3 会适当地获取 运行(跳过它之前的代码)。
代码仍然 运行,它只是一个标签,您可以在需要时将执行指向。
试试这个来避免你的问题,但在不知道你的确切要求的情况下,你可能需要调整代码结构以满足你的需要。
我的建议是将 Line3 放在底部,而不是放在例程的中间。这样你只需要清理一下然后就可以出去了。从可读性的角度来看,它往往更有意义。当然,只有在错误发生后退出才有意义时才应该这样做。
On Error GoTo Line3
More code
Goto Line4
Line3:
Some code
Some code
Line4:
On Error GoTo 0
More code
GoTo 语句的技巧(如果您打算使用它们)是谨慎使用它们。
使用Gotos
来管理执行路径几乎总是 一个糟糕的设计选择。您可以考虑以下不太依赖 Goto
标签的方法。无需直观地解析任何 Goto
语句即可更轻松地查看预期的逻辑流程(和错误处理)。
Sub Example()
If Not TryMorecode1() Then
Somecode1
Somecode2
End If
Morecode2
End Sub
Private Function TryMorecode1() As Boolean
'catch errors locally within this function
'return False if an error is generated
End Function
Private Sub Morecode2()
End Sub
Private Sub Somecode1()
End Sub
Private Sub Somecode2()
End Sub
您的代码可以正常运行。处理错误的代码应该写在主程序之外,记住你的代码也应该尝试发现潜在的错误并在它们导致错误之前处理它们。
目前当你跳转到它时你的错误没有被清除,因为它在代码的主体中,当你的第一组 More Code
完成并到达 Line3
标签。
Sub Test1()
'Ignore the error.
'MsgBox won't appear, but code won't know an error occured.
'MsgBox says all's good anyway, even though the error is still present.
Dim Rng As Range
On Error GoTo SkipLineWithError
MsgBox Rng.Address
SkipLineWithError:
MsgBox "All good, error number is " & Err.Number
End Sub
更好的方法是在错误发生之前尝试捕获错误:
Sub Test2()
'Checks that Rng won't throw an error if referenced.
'Code has dealt with the error and says all's good.
Dim Rng As Range
If Not Rng Is Nothing Then
MsgBox Rng.Address
Else
MsgBox "Range not set"
End If
MsgBox "All good, error number is " & Err.Number
End Sub
有时候,确实会出现错误,需要妥善处理。为此,您跳出主程序,处理错误并再次跳回。
使用此代码,请注意 Exit Sub
- Exit Sub
和 End Sub
之间的代码是错误处理的位置。代码主体在到达Exit Sub
.
时结束
Resume
告诉您的代码跳回的位置 - 它自己跳回导致错误的行,Resume Next
是错误之后的行,Resume <label>
跳回标签您输入了 Resume Line3
Sub Test3()
Dim Rng As Range
On Error GoTo ErrorHandler
MsgBox Rng.Address
MsgBox "All good, error number is " & Err.Number
TidyExit:
'Close connections, general tidy up before ending procedure.
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 91 'Deal with the error if it happens.
'For this we'll give Rng a default address.
Set Rng = Sheet1.Range("A1")
Resume
Case Else
MsgBox "Error couldn't be handled... display an error message."
Resume TidyExit 'Jump to end of main body of code.
End Select
End Sub
编辑: 根据@VBasic2008 的评论更新了代码。我的第一个代码很懒,错过了一个关键点。
我在这里只是略作介绍,下面的链接应该有所帮助。
on-error-statement
vba-error-handling
示例代码:
On Error GoTo Line3
More code
Line3:
Some code
Some code
More code
即使没有 错误,第 3 行下面的“一些代码”仍然得到 运行,即使我不希望它 运行 .否则,当出现错误时,Line3 会适当地获取 运行(跳过它之前的代码)。
代码仍然 运行,它只是一个标签,您可以在需要时将执行指向。
试试这个来避免你的问题,但在不知道你的确切要求的情况下,你可能需要调整代码结构以满足你的需要。
我的建议是将 Line3 放在底部,而不是放在例程的中间。这样你只需要清理一下然后就可以出去了。从可读性的角度来看,它往往更有意义。当然,只有在错误发生后退出才有意义时才应该这样做。
On Error GoTo Line3
More code
Goto Line4
Line3:
Some code
Some code
Line4:
On Error GoTo 0
More code
GoTo 语句的技巧(如果您打算使用它们)是谨慎使用它们。
使用Gotos
来管理执行路径几乎总是 一个糟糕的设计选择。您可以考虑以下不太依赖 Goto
标签的方法。无需直观地解析任何 Goto
语句即可更轻松地查看预期的逻辑流程(和错误处理)。
Sub Example()
If Not TryMorecode1() Then
Somecode1
Somecode2
End If
Morecode2
End Sub
Private Function TryMorecode1() As Boolean
'catch errors locally within this function
'return False if an error is generated
End Function
Private Sub Morecode2()
End Sub
Private Sub Somecode1()
End Sub
Private Sub Somecode2()
End Sub
您的代码可以正常运行。处理错误的代码应该写在主程序之外,记住你的代码也应该尝试发现潜在的错误并在它们导致错误之前处理它们。
目前当你跳转到它时你的错误没有被清除,因为它在代码的主体中,当你的第一组 More Code
完成并到达 Line3
标签。
Sub Test1()
'Ignore the error.
'MsgBox won't appear, but code won't know an error occured.
'MsgBox says all's good anyway, even though the error is still present.
Dim Rng As Range
On Error GoTo SkipLineWithError
MsgBox Rng.Address
SkipLineWithError:
MsgBox "All good, error number is " & Err.Number
End Sub
更好的方法是在错误发生之前尝试捕获错误:
Sub Test2()
'Checks that Rng won't throw an error if referenced.
'Code has dealt with the error and says all's good.
Dim Rng As Range
If Not Rng Is Nothing Then
MsgBox Rng.Address
Else
MsgBox "Range not set"
End If
MsgBox "All good, error number is " & Err.Number
End Sub
有时候,确实会出现错误,需要妥善处理。为此,您跳出主程序,处理错误并再次跳回。
使用此代码,请注意 Exit Sub
- Exit Sub
和 End Sub
之间的代码是错误处理的位置。代码主体在到达Exit Sub
.
时结束
Resume
告诉您的代码跳回的位置 - 它自己跳回导致错误的行,Resume Next
是错误之后的行,Resume <label>
跳回标签您输入了 Resume Line3
Sub Test3()
Dim Rng As Range
On Error GoTo ErrorHandler
MsgBox Rng.Address
MsgBox "All good, error number is " & Err.Number
TidyExit:
'Close connections, general tidy up before ending procedure.
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 91 'Deal with the error if it happens.
'For this we'll give Rng a default address.
Set Rng = Sheet1.Range("A1")
Resume
Case Else
MsgBox "Error couldn't be handled... display an error message."
Resume TidyExit 'Jump to end of main body of code.
End Select
End Sub
编辑: 根据@VBasic2008 的评论更新了代码。我的第一个代码很懒,错过了一个关键点。
我在这里只是略作介绍,下面的链接应该有所帮助。
on-error-statement
vba-error-handling