VBA - 全局变量超出范围

时间:2016-05-10 20:00:46

标签: excel vba excel-vba

我遇到的问题是全局变量超出范围。我在“ThisWorkbook”中定义了一个公共变量:

Public dict As Scripting.Dictionary

这在“Workbook_Open()”

中得到了实现
Set dict = New Scripting.Dictionary

初始化后,我运行一个Sub(代码位于“ThisWorkbook”中),用一个自定义类的ID和实例填充这个字典。

我在其他模块中使用这个dict变量时遇到了麻烦。目标是构建工作表能够调用的许多公共函数。这些函数在字典中的自定义类中操作/检索/ etc数据。

例如,此测试子(ModuleXYZ中的代码)抛出“对象变量或未设置块变量”

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

这是我第一次启动这个编码项目时遇到的错误,当dict在“ThisWorkbook”模块中超出范围时,我不得不重做“Set dict = New Scripting.Dictionary”

我希望通过在“ThisWorkbook”中将dict设置为Public变量,它将在本工作簿打开的整个时间内保持在范围内。

谢谢 - KC

2 个答案:

答案 0 :(得分:3)

尝试在模块中声明公共变量而不是工作簿。还要检查您是否已经两次声明它。惯例是在一个模块中声明所有全局变量,通常称为globals.bas。

答案 1 :(得分: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