8

我需要使用以下GoTo语句捕获一些 VBA 错误:

Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
MsgBox "ERROR"

End Sub

问题是当没有错误时该errorHandler部分被执行。
我找到了这个讨论,但答案并没有解决我的问题。
我尝试Exit Sub按照说明添加一条语句:

Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
    Exit Sub

'
' Some Code
'
errorHandler:
  MsgBox "ERROR"

End Sub

在这种情况下,它会在没有错误时退出该方法。我也试过:

 Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
  MsgBox "ERROR"
  Exit Sub
End Sub

但仍然是同样的问题:errorHandler即使没有发生错误,也会执行。

4

8 回答 8

14

只需将 Exit sub 放入即可。

Sub mySub
 On Error GoTo myHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
Exit sub

myHandler:
MsgBox "EROOR !"

err.clear
End Sub
于 2012-04-13T13:01:15.007 回答
5

这是我喜欢的模式:

Sub SomeSub()
    On Error GoTo ErrorLabel

    'Code goes here

ExitLabel:
   'Clean-up code, if any, goes here 
   Exit Sub

ErrorLabel:
    'Error-handling code goes here
    Resume ExitLabel
End Sub

请注意,Resume清除错误。我喜欢这种模式有几个原因:

  1. 习惯性地在错误处理块之前插入退出块可以减少我遇到 OP 意外掉入错误处理程序的问题的机会。
  2. GoTo ExitLabel用于从 SubFunction 中提前退出。这样,我不太可能意外跳过清理代码。例子:

    Sub SomeOtherSub()
        Dim x As ResourceThatNeedsToBeClosed
        Dim i As Long
        On Error GoTo ErrorLabel
        Set x = GetX
        For i = 1 To 100
            If x.SomeFunction(i) Then
                GoTo ExitLabel
            End If
        Next
    ExitLabel:
        x.Close
    ErrorLabel:
        'Error-handling code goes here
        Resume ExitLabel
    End Sub
    
于 2012-04-14T20:22:09.820 回答
2
Public Sub MySub
    On Error Goto Skip

    ' Some Codes

Skip:
    If err.Number > 0 Then

        ' Run whatever codes if error occurs

        err.Clear
    End If
    On Error Goto 0
End Su
于 2012-04-14T00:04:17.367 回答
0

在错误处理程序部分使用以下代码:

if err.number>0 the
    ' error handling goes here
else
    ' some code
end if
于 2015-04-10T06:57:38.053 回答
0

我遇到了和你一样的问题,上面的解决方案都不起作用。他们显然甚至没有看到您已经在原始帖子的 2 个不同位置写了 Exit Sub。似乎没有在线网站理解有时不会出现错误(如果总是会出现错误,你为什么要这样编码?),当没有错误时,你显然不会想退出子。您也不希望 myHandler 在没有错误时运行。呃!这是我想出的似乎可行的解决方案。

On Error GoTo ErrorHandler
'This is the thing I am trying to do...
Workbooks("SpreadSolver.xlsb").Activate
'If it works, great. 
'Don't touch the error stuff and move on. 
'I.e. go to the part that I know works (the rest of the macro)
GoTo ThisPartWorks

'If the thing I am trying to do doesn't work...
ErrorHandler:
MsgBox "Error: Please open Spread Solver and then run the macro."
'Only want to Exit Sub if there is an error.. duh.
Exit Sub

ThisPartWorks:
'the rest of your macro can go here...
'...
End Sub
于 2017-01-31T16:57:42.267 回答
0

我在 ErrorHandler 中使用 If 语句,如果没有错误,它将停止执行。这是通过使用 Err.Number (Err (object) number (eg Run-time error 9: Subscript out of range)) 来实现的

If Err.Number >= 1 Then
MsgBox ("Message")
End
Else: other code
End If
Exit Sub
于 2018-08-06T12:15:12.557 回答
0

这就是我所做的。奇迹般有效

Sub someProgram ()
    On Error goto Handler:
        x = 7/0

    'Some code you wanna execute  with or without error
Exit Sub

Handler:
     'Write your handler here

Resume next 'After handling error, this line will help you resume the next line

End sub
于 2018-08-22T08:30:37.703 回答
0
sub XYZ ()
on error goto label

"Write your macro"

Label:
      If Err.Description <> "" Then
       "your code if error occurs for eg:"
       msgbox "Error Occured!"
       Exit Sub
       Else
       "Your code when no error occurs for eg"
        msgbox " Done."
       End If
Exit Sub
于 2020-04-09T18:49:25.983 回答