【发布时间】:2018-03-13 21:36:16
【问题描述】:
解决方案:只需在 CallByName 语句中的 Value 周围加上方括号以强制对其进行评估。
例如。 CallByName MobClass, TargetData, vbLet, (Value)
Rory 来自另一个帖子,我可能会删除它,因为它不再相关并且可能重复。
我花了很长时间试图弄清楚我使用 CallByName 的方式出了什么问题。我终于意识到,如果输入与其调用或硬编码的输入参数的类型不完全相同,它的第四个参数 (Args) 将引发类型不匹配。
(我什至不明白自从VarType(Variant/Integer) = VarType(Integer) 以来它是如何或为什么这样做的)
所以我要么需要一种方法让它接受变体输入,要么将变量从 Variant/Integer 转换为 Integer(或创建一个新变量),而不需要巨大的选择案例。
编辑:所以我的问题不清楚,所以我会更详细地解释它。我有一堆类,我想循环并调用Let 属性。我的简化设置是:
Dim AllClasses as Collection
Sub SetAll(TargetProperty as String, Value as Variant)
For each ClassX in AllClasses
CallByName ClassX, TargetProperty, vbLet, Value
Next ClassX
End Sub
问题是Value初始化为Variant。我唯一可以让它不引发类型不匹配异常的情况是,当我将 Value 初始化为属性所需的完全相同的类型时,但我不能这样做,因为类中的数据类型不同。
编辑 2:我要问另一个关于整个问题的问题,因为似乎没有人对 CallByName 了解很多
编辑 3:以下是我们目前所做的总结:
CallByName的第四个参数 (Args) 在尝试调用类的Let属性时会引发类型不匹配。仅当尝试分配的值存储在
Variant数据类型中时才会发生这种情况。如果将变量初始化为Let属性所期望的相同类型,或者将值硬编码到参数中,则它可以完美运行。Let属性可以单独工作。它接受Variant数据类型就好了。我的问题是:有没有办法阻止此异常?我正在创建another post,以了解针对我的整体问题的其他可能解决方案。
【问题讨论】:
-
你在没有开玩笑的情况下就跳到了重点。请问这个代码在哪里?
-
如果您的按名称调用方法需要
Integer,您可以键入将变量转换为整数,例如CallByName obj, "Test", VbMethod, CInt(v) -
Cint(x)也不起作用,它仍然会抛出异常。 -
您的编辑有帮助,但距离minimal reproducible example 还很远。
-
除了技术指导说 args() Optional: Variant (Array).