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的人都这么想