Home » エクセルマクロ・Excel VBAの使い方 » VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

[スポンサードリンク]

参照渡し・ByRefについて理解するには、VBAのVarPtr関数を使ってメモリのアドレスを確認することも、とても有効です。

参照渡しでは同じメモリアドレスを使っていることを確認する手順

まずウォッチ式を登録して下図のような状態にしておきます。

VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

ステップ実行の開始

Subプロシージャmainのステップ実行を開始すると下図のような状態になります。

VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

Subプロシージャmainのローカル変数
 code_1が43969836
 code_2が43969832
というアドレスに確保されたことを確認できます。

なお、実際に出力される数値は、環境によって異なります。

別のSubプロシージャを呼んだ直後

ステップ実行を進めてSubプロシージャsplitCodeが呼ばれると、下図のような状態になります。

VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

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)

ステップ実行を進めると下図のような状態になります。

VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

参照渡し・ByRefのときとは異なり、
 code_1とval1
 code_2とval2
は違うメモリアドレスを使っていることを確認できます。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » VarPtr関数でByRef・参照渡しのメモリアドレスを確認する

「エクセルマクロ・Excel VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.