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

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

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

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

基の値を変更する

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

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

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

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

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

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

ローカル コピーの変更

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

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

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

    または

    呼び出し元のコードで、引数を引数リストのかっこで囲みます。 こうすると、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 からそのメンバーを変更することもできます。

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

コードのコンパイル

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

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

セキュリティ

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

参照

処理手順

方法: プロシージャに引数を渡す (Visual Basic)

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

方法: 引数の値渡しを強制する (Visual Basic)

概念

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

プロシージャのパラメーターと引数 (Visual Basic)

引数の値渡しと参照渡し (Visual Basic)

変更できる引数と変更できない引数の違い (Visual Basic)

引数の値渡しと参照渡しの違い (Visual Basic)

位置と名前による引数渡し (Visual Basic)

値型と参照型