vba - 将字符串变量传递给 Variant 参数时类型不匹配,并将 Array 函数的结果分配给参数
问题描述
我有以下两个程序:
Sub OuterSub()
Dim s As String
s = "Lorem ipsum dolor sit amet"
InnerSub s
End Sub
Sub InnerSub(prm As Variant)
prm = Array(prm)
End Sub
当我运行时,我在inOuterSub
收到以下错误:prm = Array(prm)
InnerSub
运行时错误“13”:类型不匹配
这只发生在我传入一个类型为String
. 以下任何替代方案都不会产生错误:
s
将in定义OuterSub
为常数:
Const s = "Lorem ipsum dolor sit amet"
- 传入字符串文字:
InnerSub "Lorem ipsum dolor sit amet"
- 定义为:
s
_OuterSub
Variant
Dim s As Variant
定义s
为固定长度的字符串没有帮助。
为什么会这样?我该如何解决它?
更新
在内部声明局部String
变量InnerSub
也无济于事:
Sub InnerSub(prm As Variant)
Dim s As String
s = prm
prm = Array(s)
End Sub
也不会将参数括在括号中:
Sub InnerSub(prm As Variant)
prm = Array((prm))
End Sub
解决方案
这里的参数定义:
Sub InnerSub(prm As Variant)
是隐含的ByRef
:
Sub InnerSub(ByRef prm As Variant)
这意味着任何分配 toprm
也将分配给s
in OuterSub
。虽然可以将数组分配给Variant
变量prm
,但不能将数组分配给 中的String
变量s
。OuterSub
您可以通过定义s As Variant
in OuterSub
(保存数组没有问题)并检查s
after的值来查看此操作InnerSub
已完成。
您可以显式强制传入一个变量ByVal
:
Sub InnerSub(ByVal prm As Variant)
传递一个常数:
Const s = "Lorem ipsum dolor sit amet"
或字符串文字:
InnerSub "Lorem ipsum dolor sit amet"
两者都有效,因为两者都不能传入ByRef
。
将参数括在括号中也会强制传入变量ByVal
,这就是以下工作的原因
Sub OuterSub()
Dim s As String
s = "Lorem ipsum dolor sit amet"
InnerSub (s) ' The brackets here do the trick
End Sub
OTOH,您的非工作替代方案都不起作用,因为无论您是创建本地字符串变量,还是将参数包装Array
在括号中,问题都是一样的——您试图通过将数组分配给字符串变量ByRef prm
范围。
请参阅我对CallByName的回答将不接受变体参数。引用该答案中引用的链接:
如何:强制按值传递参数 (Visual Basic)
过程声明决定了传递机制。如果参数声明为 ByRef,Visual Basic 期望通过引用传递相应的参数。这允许过程更改调用代码中参数基础的编程元素的值。如果您希望保护底层元素免受此类更改,您可以通过将参数名称括在括号中来覆盖过程调用中的 ByRef 传递机制。这些括号是对调用中参数列表的括号的补充。
调用代码不能覆盖 ByVal 机制。
强制参数按值传递 如果相应参数在过程中声明为 ByVal,则无需采取任何额外步骤。Visual Basic 已经期望按值传递参数。
如果相应的参数在过程中声明为 ByRef,则在过程调用中将参数括在括号中。
推荐阅读
- javascript - 从 Reactjs 中的另一个组件更新状态
- elasticsearch - 在 ElasticSearch 6.4.3 中的查询字符串中需要一些帮助
- excel - 在 Excel 中,根据单元格值增加渐变颜色
- postgresql - PostgreSQL select now()::timestamp 不同于默认 now()::timestamp
- java - 指标,气味:如何在我的遗留产品 Java 存储库中找到最长(以代码行计)的方法?
- amazon-web-services - Authorizer 中请求的 AWS API Gateway 标头
- mysql - 如何从其他电脑访问 mysql 数据库?
- erlang - 无法从 iq 接收隶属关系变更通知
- php - 如何在mysql数据库中找到特定的日期数据或下一个日期数据?
- batch-file - 编写从用户输入运行 robocopy 的批处理文件