将Dictionary ByRef传递到excel VBA用户表单模块中的Private Sub会出现ByRef类型不匹



我正在创建一个用户表单,它将不同的信息集收集到不同的词典中进行处理。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

相关内容

  • 没有找到相关文章

最新更新