【问题标题】:Excel 2013 VBA - Global Dictionary Variable DeclarationExcel 2013 VBA - 全局字典变量声明
【发布时间】:2016-04-18 19:13:33
【问题描述】:

我正在尝试声明一个公共字典变量,只要工作簿打开,该变量就会继续存在。目前我在我的一个模块的顶部使用:

Public dict As Scripting.Dictionary

我可以从同一个模块中的多个 sub 访问它,但是一旦所有代码完成运行,它就会超出范围。我已经尝试在 Workbook_Open() 子中声明它,但这似乎也无法生存。

我这样做的原因:我正在加载大量外部 XML 信息,当工作表快速打开时我需要动态访问这些信息(所以我不想每次都重新加载 xml)。相反,我宁愿在开始时加载 XML,将相关信息分类到执行我需要的工作的自定义类的实例中。

有什么建议吗?

谢谢

编辑:

我已经按照下面的建议添加了代码,但是一旦代码完成运行,字典似乎仍然超出范围。当其他潜艇尝试访问它时,我收到“需要对象”错误

    Option Explicit
Public dict As Scripting.Dictionary

Private Sub Workbook_Open()
    Set dict = New Scripting.Dictionary
    dict.Add "ID", New cItemClass
End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    将公共 Dictionary 声明添加到 ThisWorkbook 模块。它也是放置 Workbook_Open() 事件处理程序来填充它的好地方。

    只要在您的工作簿打开时 XML 文件中的数据不发生变化,此方法就可以工作。如有必要,您可以对其他触发器进行编程以刷新数据。根据 XML 的格式,您还可以将 XML 数据存储在隐藏的工作表中以用作全局存储。

    编辑:添加代码示例

    Option Explicit
    
    Public xmlDict As Scripting.Dictionary
    
    Private Sub Workbook_Open()
        Set xmlDict = New Scripting.Dictionary
        '--- read your XML file here and initialize
        '    the dictionary
    End Sub
    

    作为替代方案(取决于您在字典中存储和访问数据的方式),您可以创建自己的 Class 来访问存储的数据,使用 Get 属性并将数据结构与调用函数。 (它仍然可以是字典,或任何其他数据存储/结构,并且始终保持相同的接口。)

    【讨论】:

    • 非常感谢。 XML 数据会定期更改,但驱动它的用户会知道(我正在构建一个单独的函数来加载新节点,这会将其加载到这个公共字典中)你介意添加一个代码示例,所以我可以看到语法?超级基本没问题。
    • 另一个问题 - 如果我将公共变量放入 ThisWorkbook 模块,我所有其他引用该变量的 Subs + Functions 是否也需要在该模块中?
    • 上面ThisWorkbook 示例中声明的xmlDict 对象可用于任何其他模块、用户窗体或类中的方法。所以你的代码会直接引用它xmlDict.Item(n)
    • 我刚刚尝试过 - 但是当 ThisWorkbook_Open() 启动并完成后我有另一个子引用字典时,我收到“需要对象”错误
    • this post中的优秀信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多