将脚本字典保存在内存中,VBA

wiz*_*log 1 windows excel vba excel-2010

我在 VBA 中使用脚本字典来保存 Excel 2010 中的 1,840,000 个键和值对。我想声明并填充它们一次,然后在我的模块和函数中使用它们。

首先,我将字典声明为公开,使用Public dict As Scripting.Dictionary,然后将其填充到worksheet_activate()。我如何保存它并在其他模组中使用它?

谢谢

A.S*_*S.H 5

作为一个好的编程习惯,将这样的变量包装在一个 getter 函数中,并将全局变量隐藏为静态局部在其中。在第一次使用时填充它。

为此,请在标准模块中编写此函数:

Public Function getMyDictionary() as Scripting.Dictionary
    Static dict as Dictionary ' static: will keep state across different calls

    If dict Is Nothing Then
        Set dict = new Scripting.Dictionary
        ''''''''''''''''''''
        dict.Add "foo", "bar"
        ' etc...
        ' Code to populate dictionary
        '
        ''''''''''''''''''''
    End If
    Set getMyDictionary = dict
End Function
Run Code Online (Sandbox Code Playgroud)

现在,每当您需要引用字典时,只需键入如下内容:

If getMyDictionary.Exists("foo") Then doStuff
Run Code Online (Sandbox Code Playgroud)

这个习语有很多优点:

  • 字典在第一次使用时被填充。如果在 Excel 会话期间不需要它,则不会填充它。

  • 您不再需要担心“我什么时候填充我的字典”。无论何时何地需要,它都将可用并填充

  • 如果项目由于某些运行时错误而卸载,则所有全局变量都将重置。特别是,对象被重置为Nothing。包装函数正确处理这种情况并以透明的方式重新填充字典。

  • TLDR...全局字典是隐藏的,对它的访问(在某种程度上)是受控的。“在某种程度上”,因为其他代码仍然可以操作它(插入、删除...)。如果需要对其进行更多控制,例如允许其他代码仅读取它,则使其成为某个类模块的私有成员,该成员仅公开允许的功能......