【问题标题】:Run Sub before macro Ends like Finally block在宏结束之前运行 Sub,如 finally 块
【发布时间】:2014-05-28 13:52:41
【问题描述】:

是否有一些 VBA 最佳实践来使用诸如“结束前”子例程之类的东西?

当我的宏启动时,我正在更改 Excel 的默认配置,并且在我的宏到达其“结束子”行之前,我正在将配置重置为其标准。 但是如果出现一些错误怎么办?我是否应该在所有潜艇中定义“错误时”处理以将配置重置为标准属性?

例如,我正在更改配置,例如:

ScreenUpdating
DisplayStatusBar
Calculation
DisplayAlerts

【问题讨论】:

标签: vba error-handling


【解决方案1】:

我很确定在退出函数或子例程之前,没有这种机制被无条件地调用。您可能有错误处理程序(但它们是有条件地执行;请参阅ckuhn203 的评论作为示例)。

但是,对于类模块的实例(即对象)有这样的机制。当一个对象被销毁时(当不再被任何变量/存储引用时,就会发生这种情况),它的Class_Terminate 子例程被称为 no-matter-what。如果您可以将任务包装在创建后立即丢弃的对象中,则可以覆盖覆盖此子例程以进行清理。

【讨论】:

  • +1 我喜欢这个解决方案。至于立即丢弃,可以使用With语句,例如With new UtilityClass.DoStuff()End With
  • 6 年后敲门,您能否在这篇文章中添加代码/分享对实现此代码的代码的引用?
【解决方案2】:

如果我正确理解您的问题,是的,最好的方法是在需要它的每个方法中定义一个 On Error Goto 行,如下所示:

Public Sub DoSomething()

    On Error GoTo Finally ' Try
    Application.ScreenUpdating = False

    ' Do your stuff here

Finally:
    Application.ScreenUpdating = True


End Sub

这将确保即使出现错误,ScreenUpdating 之类的事情也会完成。您还可以添加一个 catch 块,如下所示:

Public Sub DoSomething()

    On Error GoTo Catch ' Try
    Application.ScreenUpdating = False

    ' Do normal stuff here

    GoTo Finally
Catch:

' Do only error stuff here

Finally:
    Application.ScreenUpdating = True
End Sub

一般来说,GoTo 是一种令人讨厌的做法,但对于错误捕获,VBA 有点强迫你。

【讨论】:

  • 我接受你的回答,结合@ckuhn203 评论和我找到的这个链接 [link] 所以我要做的是使用 ckuhn 的错误处理程序,但在那之后恢复默认的 On Error 处理。 [链接]:stackoverflow.com/questions/1038006/…
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2019-03-31
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多