我正在处理大量具有许多程序的工作簿。我在项目中越深入,我就越尝试编写函数或子函数来处理常见任务。 首先,由于最终用户将是普通的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
现在提出几个问题:
感谢您的帮助。
答案 0 :(得分:1)
当您在ErrorHandler()中执行“Exit Sub”时,它当然会立即离开ErrorHandler()并返回给调用者,因此不会进行清理。您当然可以删除“Exit Sub”,因此您的清理工作将会运行,但对于所有情况它将始终相同。
我从这个方法中看到的问题是在从ErrorHandler()返回之后出现的。你完全不知道ErrorHandler()做了什么,你回到调用者。你怎么会从那里继续?捕获和显示错误只是解决方案的一半。你需要想出一个从那里继续的方法。如果它是你所处的“常见任务”,你需要以某种方式取消/中止/恢复它或至少返回一些错误代码,所以它知道要优雅地结束。
VBA本身在这种情况下有点不好。我们在项目中使用http://www.everythingaccess.com/vbwatchdog.htm来处理这个问题,因为它提供了一个强大的通用错误处理方法,就像你想要的那样。