方法 : プロシージャ引数の値を変更する

更新 : 2007 年 11 月

プロシージャを呼び出すときに指定する各引数は、プロシージャに定義されたパラメータのいずれかに対応します。場合によっては、プロシージャのコードで、呼び出し元のコードにある引数の基の値が変更されることもあります。または、引数のローカル コピーだけがプロシージャで変更される場合もあります。

プロシージャを呼び出すと、Visual Basic は ByVal で渡されたすべての引数のローカル コピーを作成します。ByRef で渡された各引数に対しては、プロシージャ コードから呼び出し元のコードにある引数の基のプログラミング要素を直接参照できるように、Visual Basic が操作します。

呼び出し元のコードにある基の要素が可変であり、引数が ByRef で渡されていれば、プロシージャ コードから呼び出し元のコードにある要素の値を直接参照して変更できます。

基の値を変更する

呼び出し元のコードにある、プロシージャ引数の基の値を変更するには

  1. プロシージャ宣言で、引数に対応するパラメータに ByRef を指定します。

  2. 呼び出し元のコードで、可変のプログラミング要素を引数として渡します。

  3. 呼び出し元のコードで、引数を引数リストのかっこで囲まないでください。

  4. プロシージャ コードでパラメータ名を使用して、呼び出し元のコードにある基の要素に値を代入します。

詳しくは、後に示すコード例を参照してください。

ローカル コピーの変更

呼び出し元のコードにある基の要素が不変であるか、または引数が ByVal で渡されている場合、プロシージャから呼び出し元のコードにある基の値を変更できません。ただし、プロシージャからこの引数のローカル コピーを変更できます。

プロシージャ コードにある、プロシージャ引数のコピーを変更するには

  1. プロシージャ宣言で、引数に対応するパラメータに ByVal を指定します。

    または

    呼び出し元のコードで、引数を引数リストのかっこで囲みます。こうすると、Visual Basic は引数に対応するパラメータに ByRef が指定されている場合でも、引数を値渡しで渡します。

  2. プロシージャ コードでパラメータ名を使用して、引数のローカル コピーに値を代入します。呼び出し元のコードにある基の値は変更されません。

使用例

次の例には、配列変数を受け取ってその要素を操作する 2 つのプロシージャがあります。increase プロシージャは、各要素に単純に 1 を加算します。replace プロシージャは、パラメータ a() に新しい配列を代入してから各要素に 1 を加算します。

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByRef a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & _
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & _
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

最初に MsgBox を呼び出すと、"After increase(n): 11, 21, 31, 41" が表示されます。配列 n が参照型なので、引数渡しの方法が ByVal であっても replace からそのメンバを変更できます。

2 度目に MsgBox を呼び出すと、"After replace(n): 101, 201, 301" が表示されます。n が ByRef で渡されたため、 replace から呼び出し元のコードにある変数 n を変更でき、新しい配列を変数に代入できます。 n が参照型なので、 replace からそのメンバを変更することもできます。

プロシージャから呼び出し元のコードにある変数そのものを変更しないようにできます。「方法 : プロシージャ引数の値が変化しないようにする」を参照してください。

コードのコンパイル方法

参照渡しで変数を渡すときには、ByRef キーワードを使って明示的に指定する必要があります。

Visual Basic の既定の設定では、値渡しで引数が渡されます。しかし、パラメータを宣言するときには、ByVal または ByRef のいずれかのキーワードを常に指定することをお勧めします。これによって、コードが読みやすくなります。

セキュリティ

呼び出し元のコードにある引数の基の値をプロシージャから変更できるようにすると、必ず危険が伴います。変更すべき値が変更されていることを確認し、検証用のコードを作成して値を使用する前にチェックしてください。

参照

処理手順

方法 : プロシージャに引数を渡す

方法 : プロシージャ引数の値が変化しないようにする

方法 : 引数の値渡しを強制する

概念

Visual Basic におけるプロシージャ

プロシージャのパラメータと引数

引数の値渡しおよび参照渡し

変更できる引数と変更できない引数の違い

引数の値渡しと参照渡しの違い

位置と名前による引数渡し

値型と参照型