将字典 ByRef 传递到 excel VBA 用户窗体模块中的 Private Sub 会给出 ByRef 类型不匹配错误

Passing Dictionary ByRef Into a Private Sub in excel VBA userform module gives ByRef type mismatch error

我正在创建一个用户表单,用于将不同的信息集收集到不同的词典中进行处理。 字典在用户窗体模块级别声明,并在另一个激活用户窗体的过程中初始化。 为了简化我的代码,我有一个将项目插入适当字典的子例程。 我已将 Microsoft Scripting Runtime 添加到 VBA 参考 这是代码示例

在用户窗体模块声明处

Option Explicit
Option Compare Text
Dim Ref_Dict, Client_Dict, Service_Dict As Scripting.Dictionary

字典是在同一模块的另一个过程中初始化的。该模块在激活表单时被调用。部分激活模块为

Set Ref_Dict = New Scripting.Dictionary
Set Client_Dict = New Scripting.Dictionary
Set Service_Dict = New Scripting.Dictionary

这是将项目插入适当字典的过程

Private Sub Update_Dict(ByRef Dict As Scripting.Dictionary, ByVal Item As Variant, ByVal Key As Variant)
Dict(Key) = Item
End Sub

上述过程是从文本框或组合框调用_AfterUpdate 过程(视情况而定)例如

Private Sub ComboBox_1_AfterUpdate()
Dim Item, Key As Variant
Item = Me.ComboBox_1.Value
Key = "Name"
Update_Dict Ref_Dict, Item, Key
End Sub

在 ComboBox_1 中输入值会引发错误“ByRef 参数类型不匹配。

但是,如果我在常规模块中复制相同的场景,它会完美运行。 请问我做错了什么?

您是典型 VBA 陷阱的受害者。

AS Rory 在评论中写道,当你写的时候

Dim Ref_Dict, Client_Dict, Service_Dict As Scripting.Dictionary

您仅将 Service_Dict 声明为词典。其他两个变量声明为 Variant。由于 Variant 可以包含 任何东西(任何数据类型),您可以像在激活例程中那样为其分配一个字典对象。

但是,持有字典的Variant与字典不同,因此您会收到“类型不匹配”错误。

更正简单,提供所有变量的数据类型:

Dim Ref_Dict As Scripting.Dictionary, Client_Dict As Scripting.Dictionary, Service_Dict As Scripting.Dictionary