即使没有错误,"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 SubEnd 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