次のように読み込むVBAでのコンパイルエラーがあります:代入の左側にある関数呼び出しの正当なユースケースは何ですか?
Public Function Foo(ByVal x As Integer) As Integer
Foo = x
End Function
..Andその後、機能:
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で関数呼び出しを有効かつ正当(正当な)使用することはできません。
コンパイルエラーが原因で存在するため、はが有効なユースケースになる必要があります。それは何ですか?
[OK]を、1は、たとえば、(例えばエクセルVBAで) 'Range'を返す関数を持つことができ、その後、1は= "こんにちは"'とすることを 'のMyFunction(FOO)を行うことができますので、暗黙的に 'MyFunction(foo).Value =" hi there "'と同じになります。つまり、代入のLHS上の* legit *関数呼び出しは、返されたオブジェクトのデフォルトプロパティに割り当てられ、オブジェクトを破棄します参照ダングリング。正しい? –
@ Mat'sMug:そうですね、これは一例です。それは動作しましたか? – Bathsheba
うん、それは動作します。私はそれがいくつかの "廃棄されたオブジェクト参照" [Rubberduck](http://www.github.com/rubberduck-vba/Rubberduck)検査=)のために良い材料を作ると思う。 –