2017-07-04 12 views
3

次のように読み込むVBAでのコンパイルエラーがあります:代入の左側にある関数呼び出しの正当なユースケースは何ですか?

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

..Andその後、機能:

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 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は、オブジェクトは、デフォルトの「プロパティプット」、そして割り当てが、有効で、譲渡を持っている(Variant種類がVT_DISPATCHあるIE)Objectが含まれていることをした場合そのデフォルトプロパティに設定されています。

それ以外の場合はそうではありません。

+1

[OK]を、1は、たとえば、(例えばエクセルVBAで) 'Range'を返す関数を持つことができ、その後、1は= "こんにちは"'とすることを 'のMyFunction(FOO)を行うことができますので、暗黙的に 'MyFunction(foo).Value =" hi there "'と同じになります。つまり、代入のLHS上の* legit *関数呼び出しは、返されたオブジェクトのデフォルトプロパティに割り当てられ、オブジェクトを破棄します参照ダングリング。正しい? –

+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

リンクのためにプラス。私はあなたの第2段落の感情に同意します。 – Bathsheba

関連する問題