2016-05-10 240 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