【问题标题】:VBA - Global Variable dropping out of scopeVBA - 全局变量超出范围
【发布时间】:2016-09-05 23:36:46
【问题描述】:

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

Public dict As Scripting.Dictionary

这在“Workbook_Open()”中被初始化

Set dict = New Scripting.Dictionary

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

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

例如,这个测试子(ModuleXYZ 中的代码)抛出“Object variable or With block variable not set”

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

这是我第一次开始这个编码项目时遇到的相同错误,当字典超出“ThisWorkbook”模块的范围时,我必须重做“Set dict = New Scripting.Dictionary”

我希望通过将 dict 设置为“ThisWorkbook”中的公共变量,它会在此工作簿打开的整个过程中保持在范围内。

谢谢-KC

【问题讨论】:

  • 只要您不做任何事情来重置项目,它就应该保留(所有公共变量也是如此)。

标签: vba excel


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2012-04-29
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多