2011-08-12 62 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 - 我即將寫同樣的東西! :-) –

相關問題