参照渡し(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