前のページでプロシージャには引数を設定することが可能であることを説明しました。 このページではその引数として変数を渡す場合の参照渡し、値渡しについて説明します。
引数の参照渡し
プロシージャに引数として変数を渡すときに、その参照(アドレス)を渡す方法です。 値をコピーする必要がないため、無駄にメモリを消費することがありません。 しかし、呼び出し先プロシージャ内で引数の値を変更してしまうと、 呼び出し元の変数の値も変わってしまうことに注意が必要です。
参照渡しの構文
参照渡しにしたい場合は引数名の前に”ByRef“をつけます。このキーワードを省略した場合は”ByRef”とみなされます。
引数の値渡し
プロシージャに引数として変数を渡すときに、その値をコピーして渡す方法です。 値をコピーするため、その分メモリを消費しますが、呼び出し先プロシージャ内で引数の値を変更しても呼び出し元へ影響がでません。
値渡しの構文
値渡しにしたい場合は引数名の前に”ByVal“を付けます。
引数を参照渡しにするか、値渡しにするか。。。
処理パフォーマンスの観点から言うと、可能な限り引数は参照渡しにするべきです。ただ、先に述べたとおり、参照渡しにすると呼び出し先プロシージャ内で引数を変更すると呼び出し元へ影響がでてしまいます。したがって、呼び出し先プロシージャ内で引数を変更したいが、呼び出し先へ影響はだしたくない場合にだけ値渡しを使うとよいでしょう。
引数の参照渡し・値渡しサンプルマクロ
次のサンプルは参照渡しプロシージャと値渡しプロシージャをそれぞれ実行します。プロシージャ内で変数の値が変更される前と後の値をダイアログボックスで表示し、参照渡しと値渡しで値がどのように更新されるか確認できるようになっています。
Sub sample_eb017_02()
Dim a As Integer
a = 1
MsgBox "参照渡しプロシージャ呼び出し前:a = " & a
Call 参照渡しプロシージャ(a)
MsgBox "参照渡しプロシージャ呼び出し後:a = " & a
MsgBox "値渡しプロシージャ呼び出し前:a = " & a
Call 値渡しプロシージャ(a)
MsgBox "値渡しプロシージャ呼び出し後:a = " & a
End Sub
Private Sub 参照渡しプロシージャ(ByRef x As Integer)
MsgBox "参照渡しプロシージャ内1:x = " & x
x = 123
MsgBox "参照渡しプロシージャ内2:x = " & x
End Sub
Private Sub 値渡しプロシージャ(ByVal x As Integer)
MsgBox "値渡しプロシージャ内1:x = " & x
x = 321
MsgBox "値渡しプロシージャ内2:x = " & x
End Sub