Excel VBA 参照渡し「ByRef」と値渡し「ByVal」

スポンサーリンク

前回のFunctionプロシージャの解説で、引数の説明の中で「参照渡し」と「値渡し」のサンプル使いましたけど「参照渡し」と「値渡し」ってわかりますか?

くるみこ
くるみこ

参照渡し「ByRef」と値渡し「ByVal」については今まできちんと解説せずにいましたが今回ここでちゃんと解説したいと思います(^^;

何だか難しそうだけど大丈夫かなぁ(^^; よろしくお願いします!

【この記事でわかること
・参照渡し「ByRef」と値渡し「ByVal」の違いや使い方がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、Functionプロシージャの使い方に関する解説記事でした。覗いてみてね(^^)/

スポンサーリンク

「参照渡し」と「値渡し」の違い

「参照渡し」「値渡し」という言葉だけで考えると、渡す側に違いがあるように感じてしまいます。しかし、実際には引数を渡す側を見ても判別できません。でも、引数を受け取る側のプロシージャの定義(引数宣言)を見れば判別できます。
では、以下の簡単なサンプルを使って説明します。

'参照渡しと値渡しの確認
Sub ByRefValSample()
    Dim a As String
    a = "くるみこ"  '変数に文字列"くるみこ"を入れる
    'プロシージャByRefSampleの引数に変数を渡して呼び出す
    Call ByRefSample(a)
    MsgBox a & " 参照渡し(ByRef)"   '変数の値を表示する
    'プロシージャByValSampleの引数に変数を渡して呼び出す
    Call ByValSample(a)
    MsgBox a & " 値渡し(ByVal)"     '変数の値を表示する
End Sub
'参照渡し
Sub ByRefSample(ByRef a As String)
    a = a & "ちゃんはかわいい!"   '変数に文字列を追加
End Sub
'値渡し
Sub ByValSample(ByVal a As String)
    a = "kurumicoだよ!"       '変数に文字列を追加
End Sub

参照渡しの結果は
・変数を渡したプロシージャで変数に文字列”ちゃんはかわいい!”を追加しています。
戻った変数が変更されているのが確認できました
値渡しの結果は、
値渡しでも、変数に “kurumicoだよ!” を代入しています。
・しかし、変数を表示してみると戻り値に反映されていないことが確認できました!

参照渡し(ByRef)とは

受け取る側のプロシージャの引数宣言が「ByRef」ならば変数そのものを受け取る「参照渡し」です。また、引数の定義に何も指定してない場合、「ByRef」が指定されたものとして扱われます

参照渡し(ByRef)は、変数に格納されている値ではなく変数そのものを渡しているので、無駄にメモリを消費することがありません。呼び出し先プロシージャ内で変数の値が変更されれば、呼び出し元に戻った際には変数の値は変更されています。これを理解した上で利用しましょう。

値渡し(ByVal)とは

受け取る側の引数宣言が「ByVal」なら変数の値だけを渡す「値渡し」です。

値渡し(ByVal)は、値を渡す際に値をコピーします。だからその分メモリを消費します。値をコピーして渡していますので、引き渡し先ののプローシージャ内で値が変更されても、元の値は変更されることはありません。無駄にメモリを消費しない参照渡しを利用することが多いですが、値の変更を行いたくない場合には、値渡しを利用することになります。

データ共有の方法について

参照渡し(ByRef)については、他のプロシージャから値を返してもらうひとつのデータ共有方法として使えると理解すればよいでしょう。
複数のプロシージャでデータを共有するには、次のような方法もあります。

・すべてのプロシージャで使用できる広域変数(グローバル変数)を使う方法
・ワークシート上のセルにデータを書き込んで、そこを参照する方法
・レジストリにデータを書き込むなどの方法

これらの方法を知っていれば、ケースに応じて適切な方法を使い分けることができます。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
「いつも汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーを念頭に記事を書いています。
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

「値渡し」と「参照渡し」については理解できましたか?

はい!よくわかりました。今まで知らずに使っていたので、みんなByRefだったこともわかりました(^^; 次からはちゃんと考えて使うようにします(^^)

くるみこ
くるみこ

データ共有方法の使い分けもよく考えてコーディングするようにしましょうね!
では次回は、ピボットテーブルについて勉強したいと思います(^^)/

【今回分かったことは】
・参照渡し「ByRef」と値渡し「ByVal」の違いがわかりました
・参照渡し「ByRef」と値渡し「ByVal」の使い方がわかりました
・データ共有方法は複数あるのでケースに応じて使い分けしましょう

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

スポンサーリンク

スポンサーリンク