本記事ではVBA エキスパート『Excel VBA スタンダード』の試験範囲でもある『参照渡し』と『値渡し』の使い方について、分かりやすく解説します。
参照渡しと値渡しのポイント
- 参照渡しはByRef 、値渡しはByVal 〈Reference(参照)のRef、Value(値)のValと覚えましょう〉
- 参照渡し(ByRef):呼び出し元から呼び出し先に参照渡しで引数(変数)を渡した場合、呼び出し先で引数の値を変更すると、呼び出し元の変数の値も変更されます。
- 値渡し(ByVal):呼び出し元から呼び出し先に値渡しで引数(値)を渡した場合、呼び出し先で引数を変更しても、呼び出し元の変数は変更されません。
- 参照渡しは呼び出し先で引数が変更されると呼び出し元の変数も変更されるが、値渡しは呼び出し先で引数が変更されても呼び出し元の変数は変更されない。
- 呼び出し先が参照渡しで受け取るのか、値渡しで受け取るのか、引数の定義が重要です。
- 引数の定義にByRef、ByValを指定しなかった(定義を省略した)場合は、ByRef(参照渡し)が指定されます。
参照渡しと値渡渡しの動作 (呼び出し先でExcel⇒Wordに変更した場合の呼び出し元の変数の状況)
画像の通り、呼び出し先の引数を変更した場合、参照渡しでは呼び出し元の変数も変更されます。値渡しでは呼び出し元の引数は変更されません
実際のコードで参照渡し、値渡しの動作を見てみましょう。
参照渡しの動作を確認するVBAのサンプルコード
以下のコードではsampleRef1からsampleRef2を呼び出しています。
その際に変数bufを引数として渡しており、sampleRef2ではByRef(参照渡し)で受け取っています。
Sub sampleRef1() Dim buf As String buf = "Excel" Call sampleRef2(buf) MsgBox buf End Sub Sub sampleRef2(ByRef A As String) MsgBox A A = "Word" MsgBox A End Sub
結果は以下の通りです。
1回目のMsgBox:Excel ※参照渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Word ※参照渡しのため呼び出し元のbufも変更されている
値渡しの動作を確認するVBAのサンプルコード
以下のコードではsampleVal1からsampleVal2を呼び出しています。
その際に変数bufを引数として渡しており、sampleVal2ではByVal(値渡し)で受け取っています。
Sub sampleVal1() Dim buf As String buf = "Excel" Call sampleVal2(buf) MsgBox buf End Sub Sub sampleVal2(ByVal A As String) MsgBox A A = "Word" MsgBox A End Sub
結果は以下の通りです。
1回目のMsgBox:Excel ※値渡しで受け取った引数を表示
2回目のMsgBox:Word ※受け取った引数を変更して表示
3回目のMsgBox:Excel ※値渡しのため呼び出し元のbufは変更されない
以上、参照渡しと値渡しの解説でした。
お読みいただきありがとうございました。