如何像Try / Catch一样内联错误处理块

时间:2015-01-07 06:58:27

标签: excel vba

如何在VBA中执行内联错误处理例程?我不想把错误处理程序放在最后。

这是CPearson's Error Handling in VBA

Sub testErrHandling()
    On Error GoTo ErrHandler:

    Debug.print 9 / 0 'divide by zero error

    Worksheets("NewSheet").Activate 'missing worksheet error

    'more code here

    Exit Sub

ErrHandler:
    If Err.Number = 9 Then
        ' sheet does not exist, so create it
        Worksheets.Add.Name = "NewSheet"
        ' go back to the line of code that caused the problem
        Resume
    End If
End Sub

但我正在寻找更像VB.net中的Try / Catch块的东西

2 个答案:

答案 0 :(得分:2)

此代码将处理内联错误。这是一个非常干净的结构模式,用于处理错误。流动从上到下非常干净;这里没有意大利面条代码。

VBA是一种古老的语言并且有局限性。使用错误处理的一种方法是使用GotoOn Error Goto <Label>形式的Resume <Label>语句。这创造了一个机会。

传统上,错误处理程序位于底部。但随着VB.net的进步,利用各种想法改进代码似乎是合理的。 Try / Catch是一种非常结构化的错误处理方式,非常容易理解。这种模式试图以非常简洁的方式再现它。流量非常一致,不会从一个地方跳到另一个地方。

Sub InLineErrorHandling()

    'code without error handling

BeginTry1:

    'activate inline error handler
    On Error GoTo ErrHandler1

    'code block that may result in an error
    Dim a As String: a = "Abc"
    Dim c As Integer: c = a 'type mismatch

ErrHandler1:

    'handle the error
    If Err.Number <> 0 Then

        'the error handler is now active
        Debug.Print (Err.Description)

    End If

    'disable previous error handler (VERY IMPORTANT)
    On Error GoTo 0
    'exit the error handler
    Resume EndTry1

EndTry1:

    'more code with or without error handling

End Sub

来源:

妥善管理这项工作非常好。它是一种非常干净的流动图案,可在任何需要的地方重现。

答案 1 :(得分:2)

您可以尝试在变量中指定对象,然后使用 On Error Resume Next

Dim sh As Worksheet

'This is essentially the "Try" part
On Error Resume Next 'this ignores the error
Set sh = Worksheets("NewSheet")
On Error Goto 0 'this resets the active error handling routine

'Then this is the "Catch" part I guess
If sh Is Nothing Then 'check is something is assigned to sh
    'And I think this is "Finally" part
    Set sh = Worksheets.Add: sh.Name = "NewSheet" 'add otherwise
End If

我不熟悉Try / Catch,因为我没有做过一些VB.Net,但这是我能为你的例子考虑的最接近的内联纠错。 HTH。