【发布时间】:2013-08-02 11:37:06
【问题描述】:
我编写了一个 VBA 程序,它在Workbook_Open 上创建一个将错误写入错误日志的文件流。如果我遇到致命错误(因此需要停止执行宏),程序会执行End 语句,突然停止宏。我知道这个解决方案不是一个理想的解决方案,但是如果我有几个函数很深(即一个函数调用了另一个函数调用了另一个函数,并且第三个函数产生错误)。退出发生错误的函数只会影响该特定函数,导致可能出现无效数据、意外单元格值等。
但是这种方法给我带来了另一个问题——当End 执行时,它会破坏我的所有对象,包括错误流。因此,当用户执行新操作并遇到致命错误时,他们会收到 VBA 运行时错误(91: Object ... not set),因为代码写入现在设置为Nothing.的文件流
有没有更好的方法来结束宏(从而避免出现错误后的意外行为)而不丢失我的所有对象?官方的 VBA 文档没有帮助。提前致谢。
【问题讨论】:
-
其他选项可能包括让每个函数在函数返回或全局变量中设置错误条件,如果函数 A 调用函数 B 出错,则通过函数 A 将结果返回给调用代码。或者可能让每个函数中的错误处理程序调用一个通用的正常关闭例程;当然,这是否实用取决于您的代码在做什么。
-
级联函数应该使用返回值(或者如果需要某些变量通过ByRef)来通知更高级别的函数失败。在 VB6/VBA 中,您永远不需要 END!
-
除了其他人的建议之外:让您的日志记录全部通过一个过程可能更健壮,并让该过程负责根据需要打开/关闭流。保持流持续打开并不会节省太多时间。
标签: excel vba exception-handling error-handling garbage-collection