0

私は次のサブを持っています:

Public Function Log(sdsMessage As CStandardPropertySet2)
' Only print the fields contained int he sdsMessage
End Function

そして私はそれを次のように使用します:

Log(anSdsMessage)

ただし、これによりArgument not optionalエラーが発生します。

しかし、私がこのような潜水艦を持っている場合:

Public Function Log(sdsMessage As CStandardPropertySet2) As CStandardPropertySet2
' Only print the fields contained int he sdsMessage
Set Log = sdsMessage
End Function

Set anSdsMessage = Log(anSdsMessage)

その後、エラーは消えます。メッセージをまったく変更する必要がなく、メッセージ内のフィールドのみを出力したいので、これは私には非常に厄介に見えます。

誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

2

これはばかげた紛らわしいVBA構文です。メソッドとしてjsutを呼び出しLogていて、戻り型がない場合は、括弧を省略します。

したがってLog anSdsMessage、戻り値が設定されていない場合

そして(あなたがすでに持っているように正しく)Set anSdsMessage = Log(anSdsMessage)戻り値が設定されたとき。

ダニエルのコメントに対処するため

このコードを書くことができます

Public Function Log(sdsMessage As Collection)
' Only print the fields contained int he sdsMessage
End Function

Sub tester()
    Dim o As Collection
    Set o = New Collection
    Log (o)
End Sub

そして、testerサブを実行しようとすると、「コンパイルエラー:引数はオプションではありません」というエラーメッセージが表示されます。

括弧を削除して実行するLog oと、実際にはコンパイルが可能になり、エラーが削除されます。

于 2012-10-29T14:51:52.497 に答える