【问题标题】:How to know whether VBA runtime environment is stopped or running?如何知道 VBA 运行时环境是停止还是运行?
【发布时间】:2012-10-08 11:23:36
【问题描述】:

在我的 VBA 代码中,我得到一个运行时异常(比如除以零),在错误框中按“结束”后,VBA 运行时停止。

在此停止期间,我的全局对象被清除。我希望这些对象保留它们的值。因为,当我重新开始时,由于这些对象是 Nothing,我遇到了问题。

VBA 中是否有任何事件会在我的运行时停止时触发?或者有什么方法可以知道 VBA 是在运行还是停止?

【问题讨论】:

  • 如果您的代码未运行,则 VBA 已停止。 :-)
  • :) 没错。我需要以编程方式了解它...想知道在执行停止时是否会触发任何事件..或者是否有任何标志可用于决定 vba 是否正在运行...

标签: events vba runtime


【解决方案1】:

在 VBA 中,未处理的异常会清除全局变量。因此,将错误处理程序添加到您的 VBA 过程中。

这是立即窗口中的会话记录,使用下面包含的 2 个过程。

MyGlobal = "foo"
Call DemoDivideByZero
? Chr(39) & MyGlobal & Chr(39)
''

MyGlobal = "foo"
Call DemoDivideByZero2
Error 11 (Division by zero) in procedure DemoDivideByZero2
? Chr(39) & MyGlobal & Chr(39)
'foo'

没有错误处理程序的过程...

Public Sub DemoDivideByZero()
    Debug.Print 2 / 0
End Sub

带有错误处理程序的版本 ...

Public Sub DemoDivideByZero2()

    Dim strMsg As String

On Error GoTo ErrorHandler

    Debug.Print 2 / 0

ExitHere:
    On Error GoTo 0
    Exit Sub

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.Description _
        & ") in procedure DemoDivideByZero2"
    Debug.Print strMsg
    GoTo ExitHere
End Sub

但是我不确定在您的过程中包含错误处理程序是否足以保留您的全局变量值。我避免使用全局变量。

【讨论】:

    【解决方案2】:

    你有哪些全局对象?在启动时你需要初始化它们。

    【讨论】:

    • 我的对象在启动期间从 C# 组件初始化。现在,当执行由于任何运行时错误而中断时,我需要再次提示 C# 组件以重置我的对象。这就是为什么我在我的 VBA 端寻找一些钩子来了解执行实际何时停止,以便在执行停止期间自动调用 c# 组件。
    • 您当然可以通过与 Nothing 的比较来测试全局对象的初始化吗? (使用“是”或“不是”运算符)。
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2019-10-10
    相关资源
    最近更新 更多