excel - excel VBA全局变量退出作用域

  显示原文与译文双语对照的内容

全局变量退出作用域时出现问题。 我在"thisworkbook"中定义了一个 public 变量:


Public dict As Scripting.Dictionary



这会在"workbook_open ( ) 中得到 initalized"


Set dict = New Scripting.Dictionary



初始化后,我运行一个子( 代码位于"thisworkbook"仍然),它使用IDs和自定义类的实例填充本词典。

我在其他模块中处理这个dict变量时遇到了麻烦。 目标是构建一些 public 函数,工作表将能够调用这些函数。 这些函数在字典中的自定义类中使用 manipulate/retrieve/etc 数据。

例如,这里测试子对象( 。ModuleXYZ中的代码) 引发"对象变量",不设置块变量"


Private Sub TestSub() 


 Dim x As Integer


 x = ThisWorkbook.dict.Count


End Sub



当我首次启动这个编码项目时,这是一个同样的错误,当,失去"thisworkbook"模块时,我必须重做。"

我希望,通过将was设置为 public 变量,它将保持在整个工作簿打开时的范围内。

感谢- KC

时间: 原作者:

尝试在模块而不是工作簿中声明 public 变量。 同时检查你是否声明了两次。 约定是声明一个模块中的所有全局变量,通常称为 globals.bas.

原作者:

在这样的情况下,我有时喜欢使用 Singleton Pattern 来排序( 至少,这是我对单例 Pattern的理解) 。 创建一个公共可以用函数,如果它存在,则返回该对象,或者创建该对象,然后返回。 这样,你就不必太担心它掉出范围了。

下面是一个示例:


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



...