通过vba字典

bsr*_*bsr 13 excel vba

vba的新手.如何将字典对象传递给另一个函数.

Sub aaa(dict As Object)
Set dict = CreateObject("Scripting.Dictionary")
...
process dict 
End Sub

Sub process(dict As Scripting.Dictionary)
    MsgBox dict.Count
End Sub
Run Code Online (Sandbox Code Playgroud)

给出编译错误:未定义用户定义的类型


也,

Set dict = CreateObject("Scripting.Dictionary")
Run Code Online (Sandbox Code Playgroud)

有效,但是

Dim dict As New Scripting.Dictionary 
Run Code Online (Sandbox Code Playgroud)

给出,"用户定义的类型未定义"

我使用excel 2010

mwo*_*e02 13

使用时,CreateObject您在运行时绑定对象(即后期绑定).当你使用As Scripting.Dictionary对象时,在编译时绑定(即早期绑定).

如果要进行早期绑定,则需要设置对正确库的引用.为此,请转到"工具" - >"引用"...并选择"Microsoft Scripting Runtime"


ber*_*nie 6

要避免该错误,请添加Microsoft Scripting Runtime(在工具 - >引用中).
简化示例:

Sub test_dict()
    Dim dict As New Scripting.Dictionary
    Call process(dict)
End Sub

Sub process_dict(dict As Scripting.Dictionary)
    MsgBox dict.Count
End Sub
Run Code Online (Sandbox Code Playgroud)


mrb*_*son 5

我将修改此答案以仅使用后期绑定,并使用对象参数:

Sub aaa(dict As Object)
Set dict = CreateObject("Scripting.Dictionary")
...
process dict 
End Sub

Sub process(dict As Object)
    MsgBox dict.Count
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用 Stackoverflow。目前尚不清楚这个新答案带来了什么。你说你只会使用后期绑定,但不要说为什么。 (2认同)
  • 在没有不适当引用的情况下,代码可以在新情况下更可重用,从而避免可移植性。某些库的版本不同,有时在其他系统上也找不到,后期绑定只会使选项保持打开状态,并且在版本之间可能会出现较小的问题(如果您不需要智能感知)。 (2认同)
  • 如果该库不在另一个系统上,则无论如何后期绑定都将中断。脚本库很普遍,并且在很长一段时间内都没有改变版本。声明为“对象”将强制对对象进行后期绑定调用,这将变慢。您将不会获得Intellisense,也不会获得编译时错误检查。有时有后期绑定库的有效用法,但是`Scripting.Runtime`绝对不是其中之一。 (2认同)