HOME > 即効テクニック > Excel VBA > その他関連のテクニック > CALL省略時の引数参照渡し(ByValキーワードを利用する)

即効テクニック

その他関連のテクニック

CALL省略時の引数参照渡し(ByValキーワードを利用する)

(Excel 97/2000)
Callを省略したSubプロシージャ呼び出しの場合、実引数をかっこ()で囲むと、「値渡し」つまり、ByValキーワードを使ったことと同じとみなされます。
次のサンプルを見てください。
Sub Macro1()
    Dim a As String

    a = "Excel"

    Macro2 a
    MsgBox a

    Macro3 (a)
    MsgBox a
End Sub

Sub Macro2(ByVal s As String)
    s = "VBA"
End Sub

Sub Macro3(s As String)
    s = "VBA"
End Sub
上記の例では、「Macro3 (a)」と、実引数の「a」をかっこ()で囲んでいます。この場合、ByValキーワードを使わなくても変数は「値渡し」になります。したがって、Macro2、Macro3共に値渡しとなるため、メッセージボックスには「VBA」ではなく「Excel」と2回表示されることになります。

Office2000DeveloperのMSDNライブラリCD-ROMの「Excel Visual Basic リファレンス」にこの件に関するトピック「ByRef 引数の型が一致しません」が紹介されています。
今回の話題に関連する部分のみ以下に引用します。

---<引用 ここから>---
Dim MyVar
MyVar = 3.1415
Call SomeSub((MyVar))

Sub SomeSub (MyNum As Integer)
	MyNum = MyNum + MyNum
End Sub

引数をかっこで囲んで引き渡すと、式として評価されます。評価結果は一時的な場所に格納され、その一時的な格納場所への参照がプロシージャに渡されます。したがって、MyVarの元の値は変更されません。
---<引用 ここまで>---