2017-07-04 24 views
3

有一个在VBA编译错误内容如下:函数调用位于赋值左侧的合法用例是什么?

Function call on left-hand side of assignment must return Variant or Object

Compile error:

Function call on left-hand side of assignment must return Variant or Object.

为了产生这种编译错误,你只需要一个功能:

Public Function Foo(ByVal x As Integer) As Integer 
    Foo = x 
End Function 

..和那么功能在转让的左侧拨打- 例如:

Public Sub Test() 
    Foo(42) = 12 
End Sub 

如果我从函数的签名中删除了​​返回类型,我得到一个函数返回一个隐含的Variant,并且编译器得到满足 - 但现在有一个运行时错误424 /“Object Required”。

所以我做的函数返回一个实际的对象:在运行时

Public Function Foo(ByVal x As Integer) As Object 
    Dim result As Collection 
    Set result = New Collection 
    result.Add x 
    Set Foo = result 
End Function 

Public Sub Test() 
    Foo(42) = 12 
End Sub 

现在的错误是438 /“对象不支持此属性或方法” - 显然,这Test方法不做任何感觉。

我不能为了我的生活而想到任何对于任务的LHS函数调用函数调用的任何有效的,合法的(和保证的)使用。

该编译错误存在的原因,所以必须是一个有效的用例。它是什么?

回答

4

如果函数是返回一个Variant,并Variant包含一个Object(即Variant类型是VT_DISPATCH),该对象是否具有默认的“物业放”,那么分配有效,而分配被设置为该默认属性。

在所有其他情况下,它不是。

+1

好了,人们可以有一个返回值,比如函数,'Range'(如在Excel VBA),然后一个可以做'MyFunction的(富)= “你好”'和会隐含地与'MyFunction(foo).Value =“hi there”一样 - 换句话说,任务的LHS上的任何*合法*函数调用将分配给返回对象的默认属性,并丢弃/离开对象参考摇摆不定。正确? –

+0

@ Mat'sMug:是的,那将是一个例子。它有用吗? – Bathsheba

+0

是的,它的工作原理。我认为这为一些“丢弃的对象引用”[Rubberduck](http://www.github.com/rubberduck-vba/Rubberduck)检查=) –

1

VB变量类似于C#中的动态变量,意味着类型在运行时动态解析。因此,您可以为变量类型(即返回变量类型的函数的返回值)赋值。

我想象的用例非常狭窄,99.9%的时间,如果你想这样做,你做错了什么。

https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/function-call-on-left-hand-side-of-assignment-must-return-variant-or-object

+0

加上一个链接的好材料。我同意你的第二段中的观点。 – Bathsheba

相关问题