我遇到的问题是全局变量超出范围。我在“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
答案 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