Excel 是否可以在函数外部创建和设置VBA字典?

Excel 是否可以在函数外部创建和设置VBA字典?,excel,vba,excel-formula,excel-2016,Excel,Vba,Excel Formula,Excel 2016,我正在Excel VBA中创建几个需要使用3个字典的自定义函数 这些词典一经设置就不会更改 现在,每个字典都是在每个函数中创建的 我更愿意清理它,设置字典一次,然后在函数中引用它 不幸的是,我似乎找不到关于这个主题的任何文档。类似这样的内容: 'declare some global variables to hold your dictionaries Dim dict1 as object, dict2 as object, dict3 as object 'a sub to create

我正在Excel VBA中创建几个需要使用3个字典的自定义函数

这些词典一经设置就不会更改

现在,每个字典都是在每个函数中创建的

我更愿意清理它,设置字典一次,然后在函数中引用它

不幸的是,我似乎找不到关于这个主题的任何文档。

类似这样的内容:

'declare some global variables to hold your dictionaries
Dim dict1 as object, dict2 as object, dict3 as object

'a sub to create and populate the dictionaries
sub InitDicts()
    If dict1 is nothing then

        'create and populate dicts 1-3

    End if
end sub

'*** functions which use the dictionaries ***

Function ThisFunction()
    InitDicts
    'use dicts
end function

Function ThatFunction()
    InitDicts
    'use dicts
end function

您正在寻找全局变量,这些变量在程序的所有执行过程中都存在于内存中

实际上:

Dim myDictionary As Scripting.Dictionary '<-- on top of module, outside of any macro/function. This makes the variable LOCAL to the module (i.e. accessible all over the subs and functions of the module)
'Alternatively (one or the other)
Public myDictionary As Scripting.Dictionary '<-- the variable is GLOBAL to all the program.

Sub init() '<-- initialize your dictionary once
    Set myDictionary = New Scripting.Dictionary
    myDictionary.add "Apples", 50
    myDictionary.add "Bananas", 40
End Sub

Function a() As Integer
    ...
    a = myDictionary("Apples") '<-- use your dictionary when you want
    ...
End Function

Dim myDictionary As Scripting.Dictionary'您可以创建可从任何模块或对象访问的全局变量。或者您可以创建一个持久化对象类来保存字典(并可能提供更好的接口)。虽然这似乎是一个令人信服的想法,但您很可能不需要任何全局字典对象。全球状态为无法维护的代码铺平了道路。全局对象的引用可以在任何地方由任何代码设置。根据您需要它做什么(信息太少,无法告知),将状态封装在对象中,并将该对象作为参数传递给需要它的函数,这无疑是一个更好的主意。这些函数是完全独立的还是在同一个调用图中?请使用ADODB而不是字典。只需一次函数调用即可将它们保存到磁盘。请参阅这里的一个示例和@Lakes上的文档,它对OP需要一个全局字典做了一个非常大胆的假设。@Noddles我使用字典来利用.Exists方法。Except
Dim
始终是本地/私有的。全局变量应为
Public
@MathieuGuindon Dim适用于您声明它们的模块,全局变量适用于所有模块。我错了吗?我想你不应该教他使用全局变量,而是将参数传递给函数Matteo。@MathieuGuindon对于
Dim
和你在问题下写的注释都是真的。绝对同意(参见我自己在OP下对全局状态的评论)-除了这里的两个答案都是关于“全局变量”,没有一个真正包含任何全局变量,这。。。感觉很奇怪。@Damian,虽然我通常倾向于同意你的观点,并且我们应该尽可能避免使用全局变量,但这里似乎OP想要创建一种
常量。这是由其他语言提供的(例如,在Java中,您会说
静态
),但VBA不允许
字典类型的
常量
。我想说这是一个解决办法,我会尽量避免它,但有时我们真的做不了太多不同。
Dim
总是本地/私有的。全局变量应该是
Public
。当我在每个函数中初始化dict时,我得到了一个编译错误:Sub或函数未定义。你创建了Sub吗?它是调用
InitDict
,还是
InitDicts
?@MathieuGuindon-我想我应该说“模块级变量”,对不起,我是个学究式的烦人;-)