excel - 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 个模块类的原因
解决方案
这一行:
Dim Data, Data2 As c_dict_Project
Data
将变量声明为 Variant。
单行上的多个声明。
AnotherVar
是Variant类型,因为它的类型被省略了。
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
它仍被视为变体,因此不是精确的类型匹配。
参考:
推荐阅读
- c# - neo4jclient 创建单个节点时性能不佳
- sql - 在 SQL Server 中探索表之间的链接的最佳方式是什么?
- oracle - 升级到 18c 后查询运行缓慢
- ios - AWS swift 中的丰富推送通知
- sql - 没有交叉连接的空间sql中的多边形点(带有sde的oracle)?
- amazon-web-services - 在 Redshift 中禁用查询缓存
- java - 将 Apache POI 与 GraalVM 原生映像一起使用 - XMLBeans 中的 ClassCastException
- android - 根据设备 api 级别更改依赖版本的 Gradle 功能
- json - 在 GraphQL 中检索对象数组而不定义数组类型
- python - 如何在 odoo 中显示自定义搜索结果?