2016-05-10 232 views
1

我遇到全局變量超出範圍的問題。我在 「的ThisWorkbook」 中定義的公共變量:VBA - 全局變量超出範圍

Public dict As Scripting.Dictionary 

它被作爲 「Workbook_Open()」 initalized

Set dict = New Scripting.Dictionary 

初始化後,我運行一個子(位於 「的ThisWorkbook」 仍然代碼)用自定義類的ID和實例填充此字典。

雖然在其他模塊中使用此dict變量時遇到問題。目標是構建工作表可以調用的大量公共函數。這些函數在字典中的自定義類中操作/檢索/ etc數據。

例如,這個測試子(在ModuleXYZ代碼)拋出「對象變量或帶塊變量未設置」

Private Sub TestSub() 
    Dim x As Integer 
    x = ThisWorkbook.dict.Count 
End Sub 

這是同樣的錯誤,當我第一次開始這個編碼項目,我會得到,當該字典在「ThisWorkbook」模塊中超出了範圍,我必須重做「Set dict = New Scripting.Dictionary」

我希望通過在「ThisWorkbook」中將dict設置爲公共變量, ,這個工作簿在整個開放時間內都會保持在範圍內。

謝謝 - KC

+0

應該保持,只要你做事不重置項目(同樣是所有的真公共變量)。 – Rory

回答

3

嘗試一個模塊,而不是工作簿中聲明公共變量。同時檢查你是否宣佈了兩次。約定是在一個通常被稱爲globals.bas的模塊中聲明所有全局變量。

1

在這樣的情況下,我有時喜歡使用Singleton排序模式(至少,這是我對單例模式的理解)。我創建了一個公共可用函數,如果該對象存在,則返回該對象,否則創建並返回該對象。這樣,您不必太擔心它掉到範圍之外。

下面是一個例子:

Public oDict As Object 

Public Function GetDictionary() As Object 
    If oDict Is Nothing Then 
     Set oDict = CreateObject("Scripting.Dictionary") 
     For Each cel In Range("A1:A10") 
      oDict.Add cel.Value, cel.Offset(, 1).Value 
     Next cel 
    End If 

    Set GetDictionary = oDict 
End Function 

要引用它,它是這樣的:

Sub GetDictCount() 
    MsgBox GetDictionary().Count 
End Sub 

Sub OtherDictTest() 
    MsgBox GetDictionary()(1) 
End Sub