参照渡しで引数を渡す

広告

今までの方法ですと、呼び出すときに値を渡す事はできますが、逆に呼び出した方に値を返す事ができません。呼び出し元に値を返す事が出来れば、複雑な計算を行うようなプロシージャを用意しておき、結果を返してくれるようなプロシージャを作成する事が出来ます。

値を呼び出し元に返す方法は二通りあり、参照私を使う方法と戻り値を使う方法です。ここでは参照渡しを見ていきます。

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

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

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

サンプルプログラム

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

testsub4.bas

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 )