値渡しで引数を渡す

広告

前のページのサンプルでは単にプロシージャの中から別のプロシージャを呼び出していました。実はプロシージャを呼ぶときに値を渡す事ができます。

例えば10が2で割り切れるかどうかを表示するサブプロシージャを考えてみます。

Sub テスト()
    Call warikireCheck
End Sub

Sub warikireCheck()
    Dim num As Integer

    num = 10

    If num Mod 2 = 0 Then
        Range("A1").Value = "割り切れます"
    Else
        Range("A1").Value = "割り切れません"
    End If
End Sub

このプロシージャを呼び出せば確かに10が2で割り切れるかどうかを判別できますが、それ以外の使い道はありません。10という数値が固定に書かれているからです。

このプロシージャを、呼び出す時に指定した数値が2で割り切れるかどうかを判別するプロシージャに変更してみます。

Sub テスト()
    Call warikireCheck(10)
End Sub

Sub warikireCheck(ByVal num As Integer)
    If num Mod 2 = 0 Then
        Range("A1").Value = "割り切れます"
    Else
        Range("A1").Value = "割り切れません"
    End If
End Sub

今度のサンプルでは「warikireCheck」プロシージャを呼び出す時に、あわせて10と言う数値を指定しています。

Call warikireCheck(10)

このようにプロシージャ名呼び出す時に、括弧()で囲んだ中に値や変数などを記述すると、プロシージャに値を渡す事ができます。つまりこの場合は「warikireCheck」プロシージャを呼び出すと同時に「warikireCheck」プロシージャに10という値を渡しています。

※「Call」を使わずにプロシージャを呼び出す場合には括弧を使わずにプロシージャ名の後にスペースを1つ入れてその後ろに値や変数を記述します。

warikireCheck 10

呼び出された方の処理

次に値が渡されて来た方のプロシージャ側の処理です。呼び出し側から値が渡されて来ますのでそれを受け取らなくてはなりません。

値を受け取る側では、渡され来た値を格納するための変数を用意します。構文は次のようになります。

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

プロシージャ名の後の括弧()の中に渡されてきた値を受け取る変数を宣言します。また変数の先頭には「ByVal」を付けます。ここで「ByVal」とは値渡しという意味です。こちらは後で説明します。また値を受け取るための変数を引数とも言います。

先ほどのサンプルでは次のように記述していました。

Sub warikireCheck(ByVal num As Integer)

これはInteger型の変数「num」にプロシージャ呼び出しの際に一緒に渡されてきた値を格納する、と言う事です。つまり変数「num」には10という値が格納されます。この変数「num」はプロシージャ内で通常の変数と同じように使うことが出来ます。そこで、この渡されてきた値が2で割り切れるかどうかをその後のプログラムで行っています。

Sub warikireCheck(ByVal num As Integer)
    If num Mod 2 = 0 Then
        Range("A1").Value = "割り切れます"
    Else
        Range("A1").Value = "割り切れません"
    End If
End Sub

このように呼び出し元から呼び出し先へ値を渡すことで、色々な用途に使うことが出来るプロシージャを作成する事が出来ます。

呼び出す時に渡す事ができる値は数値だけではなく、文字列やオブジェクトなどどのようなデータ型の値も渡す事ができます。次のサンプルは文字列を別のプロシージャに引数として渡しています。

Sub テスト()
    Dim str As String

    str = "こんにちは"
    Call setCellValue(str)
End Sub

Sub setCellValue(ByVal str As String)
    str = str & "お元気ですか"
    Range("A1").Value = str
End Sub

注意点としては、呼び出し側で指定した値のデータ型と、受け取る側の引数のデータ型は同じでなければなりません。呼び出し側でInteger型の値を記述したのに、受け取る側でString型として受け取るようなことはできません。

またプロシージャを呼び出す時に引数として変数を指定していますが、変数に格納された値が実際にはプロシージャに渡されます。値だけが渡されますので、呼び出されたプロシージャ側で値を変更したりしても呼び出し元の変数「str」の値には呼び出す前と後で何の影響もありません。

つまり呼び出された「setCellValue」プロシージャ内の変数「str」は"こんにちはお元気ですか"という値にプロシージャ内で変更されていますが、呼び出し元の「テスト」プロシージャ内の変数「str」は相変わらず「こんにちは」が格納されていることになります。

このように引数に変数を指定した場合に、実際には変数に含まれている値だけが呼び出し側へ渡される場合を「値渡し」と言います。

サンプルプログラム

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

testsub2.bas

Sub テスト()
    Dim str As String

    str = "こんにちは"
    Call setCellValue(str)

    Range("A2").Value = str

End Sub

Sub setCellValue(ByVal str As String)

    str = str & "お元気ですか"
    Range("A1").Value = str

End Sub

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

値渡しによる引数の指定

Excel VBA入門の他の記事を見てみる

( Written by Tatsuo Ikura )