我正在创建一个用户表单,它将不同的信息集收集到不同的词典中进行处理。Dictionaries在userform模块级别声明,并在激活userform的另一个过程中初始化。为了简化我的代码,我有一个子程序,可以将项目插入到适当的字典中。我已将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
以上过程是从Textbox或ComboBox_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陷阱的受害者。
正如Rory在评论中所写,当你写时
Dim Ref_Dict, Client_Dict, Service_Dict As Scripting.Dictionary
您只声明Service_Dict
为Dictionary。另外两个变量被声明为Variant
。由于Variant
可以包含任何(任何数据类型(,您可以像在激活例程中那样为其分配字典对象。
然而,持有Dictionary的Variant
与Dictionary不是相同的,因此您得到";类型不匹配";错误
简单易纠正,提供所有变量的数据类型:
Dim Ref_Dict As Scripting.Dictionary, Client_Dict As Scripting.Dictionary, Service_Dict As Scripting.Dictionary