2011-08-12 179 views
16

我有一个工作簿,声明一个全局变量,旨在容纳一个COM对象。什么是excel vba中全局变量的生命周期?

Global obj As Object 

我initalize它在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。

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

+1

你有多个函数调用你的COM对象,或只是一个?如果只有一个,那么你可以考虑在函数中将它作为一个静态变量:然后函数可以检查它是否已初始化,如果没有,则初始化它。 –

+1

不是全局变量邪恶吗?另外,我相信正确的关键字是“Public”,而不是“Global”。 –

回答

19

所有的这些都将重置全局变量:

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

工作簿这不一定是详尽的清单,但...

+0

哪里可以找到详尽的清单。我一直想知道什么阻止了我的全局变量的工作。特别是捕捉应用程序事件的变量。 – Jon49

+0

@Tim,我猜这是导致它的未被渲染的运行时错误 – chollida

+0

@Jon:这些都是我能想到的。 –

6

除了Tim's 4之外,我还会建议第5个点:逐步完成代码(调试)并在到达结束之前停止。可能这可能会取代第3点,因为编辑代码似乎不会导致全局变量丢失它们的值。

+0

+1 - 我即将写同样的东西! :-) –

相关问题