【问题标题】:What is the lifetime of a global variable in excel vba?excel vba中全局变量的生命周期是多少?
【发布时间】:2011-10-25 20:23:32
【问题描述】:

我有一个工作簿,它声明了一个用于保存 COM 对象的全局变量。

Global obj As Object

我在 Workbook_Open 事件中初始化它,如下所示:

Set obj = CreateObject("ComObject.ComObject");

我可以看到它已创建,那时我可以对其进行一些 COM 调用。

在我的工作表上,我有一堆看起来像这样的单元格:

=Module.CallToComObject(....)

在模块内部我有一个函数

Function CallToComObject(...)
   If obj Is Nothing Then
        CallToComObject= 0
    Else
        Dim result As Double
        result = obj.GetCalculatedValue(...)
        CallToComObject= result
    End If
End Function

我可以看到这些工作,但在刷新几张表后,obj 对象不再初始化,即它被设置为 Nothing。

有人可以解释一下我应该寻找什么会导致这种情况吗?

【问题讨论】:

  • 你有多个函数调用你的 COM 对象,还是只有一个?如果只有一个,那么您可以考虑将其设置为函数中的静态变量:然后该函数可以检查它是否已初始化,如果没有,则对其进行初始化。
  • 全局变量不是邪恶的吗?另外,我认为正确的关键字是Public,而不是Global

标签: vba excel global-variables


【解决方案1】:

其中任何一个都会重置全局变量:

  1. 使用“结束”
  2. 未处理的运行时错误
  3. 编辑代码
  4. 关闭包含 VB 项目的工作簿

虽然这不一定是详尽的清单...

【讨论】:

  • 在哪里可以找到一份详尽的清单。我一直想知道是什么阻止了我的全局变量工作。尤其是捕捉应用事件的变量。
  • @Tim,我猜这是导致它的未经处理的运行时错误
  • @Jon:我能想到的就这些了。
  • 使用“结束”是什么意思?你能结束一个全局变量吗?我熟悉 End With、End Sub、End If 等 - 感谢您提供的信息,非常有价值。我知道 2 和 4,但不知道 1 和 3。
  • @Jon:自行结束 - “立即终止执行。它自己从来不需要,但可以放置在过程中的任何位置以结束代码执行、关闭使用 Open 语句打开的文件并清除变量。”
【解决方案2】:

除了上面 Tim 的第 4 点之外,我还建议第 5 点:单步执行代码(调试)并在到达终点之前停止。这可能会取代第 3 点,因为编辑代码似乎不会导致全局变量丢失其值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2013-01-28
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多