VBA-CallByName不接受变量参数

VBA-CallByName不接受变量参数,vba,excel,function,Vba,Excel,Function,解决方案:只需在CallByName语句中的值周围加上括号,即可强制对其求值 例如:CallByName MobClass、TargetData、vbLet、Value 另一篇文章的功劳归于Rory,我可能会删除它,因为它不再相关,可能是重复的 我花了很长时间试图弄清楚我是如何使用CallByName的。我最终意识到,如果输入与其调用的输入参数或其硬编码的输入参数的类型不完全相同,则其第四个参数Args将抛出类型不匹配 我甚至不明白它是如何或为什么这样做的,因为VarTypeVariant/In

解决方案:只需在CallByName语句中的值周围加上括号,即可强制对其求值

例如:CallByName MobClass、TargetData、vbLet、Value

另一篇文章的功劳归于Rory,我可能会删除它,因为它不再相关,可能是重复的

我花了很长时间试图弄清楚我是如何使用CallByName的。我最终意识到,如果输入与其调用的输入参数或其硬编码的输入参数的类型不完全相同,则其第四个参数Args将抛出类型不匹配

我甚至不明白它是如何或为什么这样做的,因为VarTypeVariant/Integer=VarTypeInteger

因此,我需要一种方法,使其接受变量输入,或者将变量从variant/Integer转换为Integer,或者创建一个新变量,而不使用一个巨大的select case

编辑:所以我的问题不清楚,所以我会详细解释。我有一堆类,我想循环使用它们并调用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 
当初始化为变量时,问题是值。我唯一能让它不抛出类型不匹配异常的时间是当我将值初始化为属性所需的完全相同的类型时,但我不能这样做,因为类中的数据类型不同

编辑2:我要问另一个关于整个问题的问题,因为似乎没有人对CallByName了解很多

编辑3:以下是我们到目前为止的总结:

CallByName的第四个参数Args在尝试调用类的Let属性时引发类型不匹配

仅当尝试分配的值存储在变量数据类型中时,才会发生这种情况。如果将变量初始化为Let属性所期望的相同类型,或者将值硬编码到参数中,则该函数将非常有效

出租房产本身运行良好。它可以很好地接受各种数据类型

我的问题是:有没有办法阻止这种异常?我正在为我的整体问题创造其他可能的解决方案


问题是您通过引用而不是通过值传递属性参数,但是您不能传递对不同数据类型变量的引用->只要类型不匹配并且不能转换,因为这也会更改调用方中的数据类型。通过使用括号,您可以将其铸造为typeLong

可以通过在Property Letter中使用ByValin而不是ByRef来避免这种情况。如果未设置,则会隐式使用ByValin。您知道,通过引用变量,在属性中所做的更改也会更改调用者的值吗

例如:

类PassExample

'另存为类模块密码示例 公共财产出租权 NewVal=1 端属性 公共财产出租PropByRefByRef NewVal,只要 NewVal=1 端属性 带有测试子模块的模块:

'另存为标准模块 子测试 Dim v作为变体 v=0 Dim ExampleInstance作为新的PassExample CallByName示例Instance、PropByVal、VbLet、v'这很有效 CallByName ExampleInstance、PropByRef、VbLet、v'类型不匹配 CallByName示例Instance、PropByRef、VbLet、v'这在ByRef更改为byval时起作用 Debug.Print v'显示0,而不是引用时应显示的1 CallByName ExampleInstance、PropByRef、VbLet、CVarv'在传递无法引用的函数结果时也起作用 端接头
感谢Rory和chris neilsen提供的解决方案

你没有开玩笑就跳到了笑点。请看下面的代码。如果您的“按名称调用”方法需要一个整数,您可以键入“将变量强制转换为整数”,如CallByName obj、Test、VbMethod、CIntvCintx也不起作用,它仍然会引发异常。您的编辑帮助,但它还远远不是一个。除了技术指南说args可选:Variant Array。这是有道理的,很抱歉我在问这个问题之前没有想到这一点。我一直在C++编程,而且它的默认值是通过值,所以它从来没有真正地越过我的脑海。@ LeSoeSube不需要借口,这是一个好的问题,我想。在这方面我学到了很多。。只有一个愿望;通过类属性的示例来改进您的问题,以便为其他人澄清问题。当然,你会得到更多的选票,因为主题本身并不是通常的我不能为自己编写代码。显示名称属性类的反馈也很好,因为不清楚这是否对您有帮助。有关使用类的替代方法,请参阅