Excel VBA;当在一行中标注两个模块类时,我得到一个ByRef错误。但将它们分成两行是可行的

Excel VBA;当在一行中标注两个模块类时,我得到一个ByRef错误。但将它们分成两行是可行的,excel,vba,Excel,Vba,对于以下内容,编译器在ttt()第5行-->参数Data突出显示时给出ByRef错误 选项显式 副ttt() 尺寸s为字符串:s=“M1” Dim数据,数据2作为c_dict_项目 Set Data=GetMyData(ThisWorkbook.Sheets(“测试”),s) Set Data2=GetMyData(ThisWorkbook.Sheets(“测试”),s) 如果设置类(数据),则调试。打印“完成” 端接头 公共函数GetMyData(ByVal wsO作为工作表,newMod作为

对于以下内容,编译器在
ttt()
第5行-->参数
Data
突出显示时给出ByRef错误

选项显式
副ttt()
尺寸s为字符串:s=“M1”
Dim数据,数据2作为c_dict_项目
Set Data=GetMyData(ThisWorkbook.Sheets(“测试”),s)
Set Data2=GetMyData(ThisWorkbook.Sheets(“测试”),s)
如果设置类(数据),则调试。打印“完成”
端接头
公共函数GetMyData(ByVal wsO作为工作表,newMod作为字符串)作为c_dict_项目
作为c_dict_项目的Dim项目:设置项目=新c_dict_项目
Set project.Modules=New Scripting.Dictionary
project.Modules.Add newMod,“我的内容”
'project.Modules.Add“M2”,wsO.Cells(1,1).文本
设置GetMyData=project
端函数
作为布尔值的公共函数SetClass(ByRef数据作为c_dict_项目,模块作为字符串)
调试.打印数据.模块(模块)
SetClass=True
端函数
但是,如果我更改
ttt()
第2行,错误就会消失

发件人:

Dim数据,数据2作为c_dict_项目
致:

Dim数据作为c_dict_项目
作为c_dict_项目的Dim数据2
这是某种Excel VBA错误,还是我不能在一条语句中标注两个模块类的原因

Dim Data, Data2 As c_dict_Project
 If SetClass(Data, s) Then Debug.Print "Done"
数据
变量声明为变量

一行上有多个声明<代码>另一个变量的类型为变体,因为其类型被省略

Dim AnotherVar,选项为布尔值,生日为日期

这一行:

Dim Data, Data2 As c_dict_Project
 If SetClass(Data, s) Then Debug.Print "Done"
然后调用
SetClass
函数:

作为布尔值的公共函数SetClass(ByRef数据作为c_dict_项目,模块作为字符串)

数据
是通过引用传递的(您不需要声明这是默认值),如果通过引用传递和声明数据类型,则它们必须完全匹配。如果未在过程中声明数据类型,则默认值为Variant,并且必须传递Variant

默认情况下,ByRef(通过引用)传递的参数必须具有过程中预期的精确数据类型

虽然
Data
现在保存着一个
c\u dict\u项目
类型对象,但来自:

Public Function GetMyData(ByVal wsO As Worksheet, newMod As String) As c_dict_Project
它仍然被视为变体,因此不是一个精确的类型匹配

参考:


数据
被定义为一个
变体
,然后。。。Dim不像你想象的那样工作。。。你必须这样做:
Dim Data As c_dict_Project,Data2 As c_dict_Project
——你实际的意思是
Dim Data As Variant,Data2 As c_dict_Project
好的,我总是要求一行中列出的所有变量都使用与最后一个值相同的格式。然而,你是绝对正确的。我设置了一个断点,实际上可以在watch窗口中看到
Data
被声明为变量。谢谢你,你不是第一个这么想的人——每个刚接触vba的人都这么想