首页 > 解决方案 > VBA; 在一行中标注 2 个模块类时,出现 ByRef 错误。但是将它们分成两行有效

问题描述

如下所示,编译器在ttt()第 5 行给出了 ByRef 错误 --> 参数Data被突出显示

Option Explicit

Sub ttt()
    Dim s As String: s = "M1"
    Dim Data, Data2 As c_dict_Project
    Set Data = GetMyData(ThisWorkbook.Sheets("test"), s)
    Set Data2 = GetMyData(ThisWorkbook.Sheets("test"), s)
    If SetClass(Data, s) Then Debug.Print "Done"
End Sub

Public Function GetMyData(ByVal wsO As Worksheet, newMod As String) As c_dict_Project
    Dim project As c_dict_Project: Set project = New c_dict_Project
    Set project.Modules = New Scripting.Dictionary
    project.Modules.Add newMod, "My Content"
    'project.Modules.Add "M2", wsO.Cells(1,1).Text
    Set GetMyData = project
End Function

Public Function SetClass(ByRef Data As c_dict_Project, module As String) As Boolean
    Debug.Print Data.Modules(module)
    SetClass = True
End Function

ttt()但是,如果我更改第 2 行,错误就会消失

从:

Dim Data, Data2 As c_dict_Project

至:

Dim Data As c_dict_Project
Dim Data2 As c_dict_Project

这是某种 Excel VBA 错误,还是我不能在一个语句中标注 2 个模块类的原因

标签: excelvba

解决方案


这一行:

Dim Data, Data2 As c_dict_Project

Data将变量声明为 Variant。

单行上的多个声明。AnotherVarVariant类型,因为它的类型被省略了。

Dim AnotherVar, Choice As Boolean, BirthDate As Date

这一行:

 If SetClass(Data, s) Then Debug.Print "Done"

然后调用SetClass函数:

公共函数 SetClass(ByRef Data As c_dict_Project, module As String) As Boolean

Data是通过引用传递的(您不需要说明它,因为它是默认值),如果您通过引用传递声明数据类型,那么它们必须是完全匹配的。如果您没有在过程中声明数据类型,则默认为Variant,并且您必须传递一个Variant

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

虽然Data现在拥有一个c_dict_Project类型对象,但来自:

Public Function GetMyData(ByVal wsO As Worksheet, newMod As String) As c_dict_Project

它仍被视为变体,因此不是精确的类型匹配。

参考:


推荐阅读