解决方案:只需在 CallByName 语句中的 Value 两边加上括号即可强制对其求值。
Ex. CallByName MobClass, TargetData, vbLet, (Value)
感谢来自另一篇文章的 Rory,我可能会删除该文章,因为它不再相关并且可能重复。
我花了很长时间试图找出我使用 CallByName 的方式出了什么问题。我终于意识到,如果输入与其调用的输入参数或硬编码的输入参数的类型不完全相同,则其第四个参数(Args)将引发类型不匹配。
(我什至不明白它是如何或为什么这样做的,因为VarType(Variant/Integer) = VarType(Integer)
)
所以我要么需要一种方法让它接受变量输入或转换变量Variant/Integer
to 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
如果值被硬编码到参数中,则属性需要 OR。
The Let
属性本身运行良好。它接受Variant
数据类型就好了。
我的问题是:有没有办法阻止这个异常?我正在创造另一个帖子 https://stackoverflow.com/questions/49287139/vba-assign-a-value-to-multiple-classes-at-once-property-let关于我的整体问题的其他可能的解决方案。