参照渡し・ByRefをどう使うのかと、ByRefとByValの違いをウォッチウィンドウで確認する手順をご紹介しています。
参照渡し・ByRefについて理解するには、VBAのVarPtr関数を使ってメモリのアドレスを確認することも、とても有効です。
参照渡しでは同じメモリアドレスを使っていることを確認する手順
まずウォッチ式を登録して下図のような状態にしておきます。
ステップ実行の開始
Subプロシージャmainのステップ実行を開始すると下図のような状態になります。
Subプロシージャmainのローカル変数
code_1が43969836
code_2が43969832
というアドレスに確保されたことを確認できます。
なお、実際に出力される数値は、環境によって異なります。
別のSubプロシージャを呼んだ直後
ステップ実行を進めてSubプロシージャsplitCodeが呼ばれると、下図のような状態になります。
SubプロシージャsplitCodeの引数
val1が43969836
val2が43969832
というアドレスであることを確認できます。
ここで重要なのは、
code_1とval1
code_2とval2
のメモリアドレスが同じである点です。
Subプロシージャmainから、
Call splitCode(code_org, code_1, code_2)
とSubプロシージャsplitCodeを呼んでいて、splitCodeは、
Sub splitCode(ByVal code As String, ByRef val1 As String, ByRef val2 As String)
と定義されているからです。
ステップ実行はショートカットキーF8で
拙著『いちばんやさしいExcel VBAの教本』の、Lesson 26「Subプロシージャを実行するステップ実行を活用しましょう」では、 ショートカットキー[F8]をおすすめしています。
今回のように、実行する行が途中でジャンプするようなときに、ツールバーのボタンなどからステップ実行するよりも、一層[F8]キーを便利に感じるはずです。
値渡しでは別のメモリアドレスであることを確認しましょう
SubプロシージャsplitCodeの第2・第3引数を、ByValにした場合はどうなのかも、確認しておきましょう。
先のウォッチ式はそのままで、引数を値渡しに変更してから、
Sub splitCode(ByVal code As String, ByVal val1 As String, ByVal val2 As String)
ステップ実行を進めると下図のような状態になります。
参照渡し・ByRefのときとは異なり、
code_1とval1
code_2とval2
は違うメモリアドレスを使っていることを確認できます。
Home » エクセルマクロ・Excel VBAの使い方 » VarPtr関数でByRef・参照渡しのメモリアドレスを確認する