プロジェクトには、次のようなコードがいくつかあります。
Private Sub Method1()
Call InnerMethod
End Sub
Private Sub Method2()
InnerMethod
End Sub
Private Sub InnerMethod()
'' stuff
End Sub
Method2に対してMethod1を実行する利点は何ですか?
[〜#〜] msdn [〜#〜] から:
プロシージャを呼び出すときにCallキーワードを使用する必要はありません。ただし、Callキーワードを使用して引数を必要とするプロシージャを呼び出す場合は、argumentlistを括弧で囲む必要があります。 Callキーワードを省略する場合は、argumentlistを囲む括弧も省略する必要があります。 Call構文を使用して組み込み関数またはユーザー定義関数を呼び出す場合、関数の戻り値は破棄されます。
例えば:
Sub Proc1()
Debug.Print "Hello World"
End Sub
Sub Proc2(text As String)
Debug.Print "Hello " & text
End Sub
イミディエイトウィンドウで、
Proc1
その後、「Hello World」が印刷されます。入力した場合
Call Proc1
その後、「Hello World」が印刷されます。入力した場合
Proc2 "World"
その後、「Hello World」が印刷されます。入力した場合
Call Proc2 "World"
コンパイルエラーが発生します。入力する必要があります
Call Proc2("World")
Callはメソッドを呼び出す以外に特別なことは何もしません。すべての行がキーワードで始まる必要があったBasicの昔からのこだわりです。 "Let"はこれらのキーワードの別の1つであり、常に割り当ての前に置かれていましたが、必須ではなくなりました。
Method1とMethod2はまったく同じことを行います。
ByRef引数を持つ関数で 'call'キーワードの大きな違いを発見しました(これはMS-Access VBAエディターで見つかりました)。 'Call'キーワードなしで関数を呼び出している場合、呼び出し先にはByRef arumentsは設定されません。例:
Private Function Test(Optional ByRef refArg As String) As Boolean
refArg = "Test"
Test = True
End Function
Call
キーワードなしで関数を呼び出す場合
Dim a As String
Test(a)
a
は、呼び出しが戻った後、空の文字列になります
Call
キーワードを使用して関数を呼び出す場合
Dim a As String
Call Test(a)
a
には文字列Test
が含まれます
次のリンクで提供される詳細な説明: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx
違いはありません。