【EXCEL VBA】参照渡し(ByRef)と値渡し(ByVal)の違いを知りたい

参照渡し(ByRef)と値渡し(ByVal)の違いについて紹介します。どちらもプロシージャやファンクションの引数1つ1つに指定するものとなります。

サンプルプログラムでは「ByRef」、「ByValue」、「指定なし」でプロシージャを3つ定義して、それぞれを呼び出した結果を表示しています。呼び出し方も3パタンに分けて「Callあり」、「Callなし括弧あり」、「Callなし括弧なし」の3パタンに分けています。差異については、よーく確認してみてください。

ByRef、ByValのサンプルプログラム

Option Explicit

' ByRef指定
Sub test1(ByRef val As Integer)
    val = val + 1
End Sub

' ByVal指定
Sub test2(ByVal val As Integer)
    val = val + 1
End Sub

' 指定なし
Sub test3(val As Integer)
    val = val + 1
End Sub


Sub sample()
    Dim v As Integer
    
    v = 0
    Call test1(v)
    Debug.Print v   '1  参照渡し
    
    v = 0
    Call test2(v)
    Debug.Print v   '0  値渡し
    
    v = 0
    Call test3(v)
    Debug.Print v   '1  指定なしは、参照渡し
    
    v = 0
    test1 v         '   Callなし、括弧なし
    Debug.Print v   '1  参照渡し

    v = 0
    test2 v         '   Callなし、括弧なし
    Debug.Print v   '0  値渡し

    v = 0
    test3 v         '   Callなし、括弧なし
    Debug.Print v   '1  指定なしは、参照渡し

    v = 0
    test1 (v)       '   Callなし、括弧あり
    Debug.Print v   '0  括弧ありは強制的に値渡しを表す
    
    v = 0
    test2 (v)       '   Callなし、括弧あり
    Debug.Print v   '0  括弧ありは強制的に値渡しを表す
    
    v = 0
    test3 (v)       '   Callなし、括弧あり
    Debug.Print v   '0  括弧ありは強制的に値渡しを表す

End Sub