2

我正在处理大量包含许多程序的工作簿。我在项目中走得越深,我就越会尝试编写函数或子程序来处理常见任务。首先,由于最终用户将是普通 Excel 用户,我决定将我的所有代码保护和集中在个人宏工作簿中。在我看来这是个好主意,但也许你们中的一些人,Excel 专家,不同意。然后我写了一个Public Sub ErrorHandler()来处理我所有过程中的错误。我完全了解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 的情况下,当我说Exit sub时,ErrorHandler sub本身会结束并进行清理工作,还是也会停止?
  • 关于常见和有用的用户定义错误 (513-65535) 有什么好的提示吗?

谢谢你的帮助。

4

1 回答 1

1

当您在 ErrorHandler() 中执行“Exit Sub”时,它当然会立即离开 ErrorHandler() 并返回给调用者,因此不会进行任何清理。您当然可以删除“退出子”,这样您的清理工作就会运行,但在所有情况下它总是相同的。

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

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

于 2013-11-12T12:34:41.920 回答