VBA-使用UDF处理所有过程中的错误

时间:2013-11-12 11:39:53

标签: excel vba excel-vba

我正在处理大量具有许多程序的工作簿。我在项目中越深入,我就越尝试编写函数或子函数来处理常见任务。 首先,由于最终用户将是普通的Excel用户,因此我决定保护并集中personal macro workbook中的所有代码。听起来对我来说是一个好主意,但也许你们中的一些人,Excel大师,不同意。 然后我写了一个 Public Sub ErrorHandler()来处理我所有的procédures中的错误。我完全了解Error Bubble Up。我的程序将是这样的:

' All déclarations are outside
Public Sub ErrorHandler ()
Lg1 = Err.Number ' Lg1 is Long
Select Case Lg1
        Case 1004
        MsgBox ("File is not fund. Please verify its path.")
        Exit Sub '!EDITED! <GoTo NextCode:> is much better indeed 
' ...more code with other errors...
End Select
NextCode: ' !EDITED!
' ...some cleaning and initialize variables to nothing or 0
Lg1 = 0
Err.Clear
End Sub

然后我想以这种方式在其他子中使用这个子:

On Error Go To MyError: ' <On Error call ErrorHandler> is not permited
'...more code....
MyError:
call ErrorHandler 

现在提出几个问题:

  • 这是一个好习惯吗?如果没有,你会推荐什么?
  • 例如,在1004的情况下,当我说退出子时, ErrorHandler sub 本身会结束并执行清理工作,还是会停止?< / LI>
  • 关于常见和有用的用户定义错误的任何好的提示(513-65535)?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

当您在ErrorHandler()中执行“Exit Sub”时,它当然会立即离开ErrorHandler()并返回给调用者,因此不会进行清理。您当然可以删除“Exit Sub”,因此您的清理工作将会运行,但对于所有情况它将始终相同。

我从这个方法中看到的问题是在从ErrorHandler()返回之后出现的。你完全不知道ErrorHandler()做了什么,你回到调用者。你怎么会从那里继续?捕获和显示错误只是解决方案的一半。你需要想出一个从那里继续的方法。如果它是你所处的“常见任务”,你需要以某种方式取消/中止/恢复它或至少返回一些错误代码,所以它知道要优雅地结束。

VBA本身在这种情况下有点不好。我们在项目中使用http://www.everythingaccess.com/vbwatchdog.htm来处理这个问题,因为它提供了一个强大的通用错误处理方法,就像你想要的那样。