如何在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块的东西
答案 0 :(得分:2)
此代码将处理内联错误。这是一个非常干净的结构模式,用于处理错误。流动从上到下非常干净;这里没有意大利面条代码。
VBA是一种古老的语言并且有局限性。使用错误处理的一种方法是使用Goto
和On 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。