参照渡しで引数を渡す

プロシージャを呼び出すときに値渡しで引数を渡す場合、値を渡す事はできますが呼び出した方に値を返す事ができません。このような場合は参照渡しで引数を渡すことで呼び出した方に値を返すことができます。ここでは Excel VBA で参照渡しで引数を渡す方法について解説します。

(Last modified: )

参照渡しで引数を渡す

まず定義を見ておきます。プロシージャを呼び出す方は変更がありませんが、呼び出される方のプロシージャにて、引数の定義の仕方が異なります。

Sub プロシージャ名(ByRef 変数名 As データ型)

値渡しの場合は「ByVal」を変数定義の前に使っていましたが、参照渡しの場合は「ByRef」を変数定義の前に付けます。

今まで使っていた値渡しによる方法では、プロシージャを呼び出すときに変数を使って引数を指定した場合、変数にその時点で含まれている値だけがプロシージャに渡されていました。その為、呼び出し先のプロシージャで値を変更しても呼び出し元の方の変数には影響がありませんでした。

Sub テスト()
    Dim str As String

    str = "こんにちは"

    'この時点では変数strには"こんにちは"が
    '格納されています

    Call setCellValue(str)

    '呼び出しから帰った時点でも変数strには
    '"こんにちは"が格納されたままです
End Sub

Sub createString(ByRef str As String)
    str = "こんばんは"

    '呼び出されたプロシージャで変数strには
    '"こんばんは"が格納されます
End Sub

参照渡しを使うと、プロシージャを呼び出したときに変数を使って引数を指定した場合、変数に格納されている値ではなく変数そのものがプロシージャに渡されます。その為、呼び出された側のプロシージャにて変数の値を変更すると、呼び出し元のプロシージャの変数に格納されている値も変更されます。

Sub テスト()
    Dim str As String

    str = "こんにちは"

    'この時点では変数strには"こんにちは"が
    '格納されています

    Call setCellValue(str)

    '呼び出しから帰った時点では変数strには
    '"こんばんは"が格納されています
End Sub

Sub createString(ByRef str As String)
    str = "こんばんは"

    '呼び出されたプロシージャで変数strには
    '"こんばんは"が格納されます
End Sub

このように参照渡しを使うことで、呼び出されたプロシージャで変更された状態を呼び出し元でも利用することが出来るようになります。

サンプルプログラム

では簡単なサンプルで試してみます。

Sub テスト()
    Dim str As String

    str = "伊藤さん"

    Call createString(str)

    Range("A1").Value = str

End Sub

Sub createString(ByRef str As String)

    str = str & "、こんにちは"

End Sub

上記のマクロを実行すると次のようになります。

参照渡しによる引数の指定

-- --

Excel VBA で参照渡しで引数を渡す方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。