引数が配列の場合の、「参照渡し」と「値渡し」

progani


下のプロシージャ、Test を動かしてみてください。
TestA, TestB は、Testの中で呼び出します。

まず、配列 MyArray に 1 と 2 をセットしています。
TestA は、配列を参照渡しで受け取り、配列の中身を 3 と 4 に入れ替えています。
Test に戻ると配列の中身が  3 と 4 に入れ替わっています。
★配列の参照先を入れ替えている
★ByRef を省略しても参照設定になる
★MyArray() で受け取るなら 同じ型(ここではLong型)で、MyArray で受け取るなら Variant型(例を参照)

再度、配列 MyArray に 1 と 2 をセットしています。
TestB は、配列を値渡しで受け取り、配列の中身を 3 と 4 に入れ替えていますが、
Test に戻っても配列の中身は  1 と 2 のままです。
★配列の参照先は入れ替わらない
★配列引数を値渡しにするにはバリアント型にします(例を参照)


Sub Test()
    Dim MyArray(1) As Long
    
    '----------------------
    '  参照渡し
    '----------------------
    
    '配列 MyArrayに 1 と 2 をセット
    MyArray(0) = 1
    MyArray(1) = 2
    
    Call TestA(MyArray)
    
    '配列 MyArrayは 3 と 4 に入れ替わっている
    MsgBox MyArray(0) & " " & MyArray(1)
    
    '----------------------
    '  値渡し
    '----------------------
    
    '配列 MyArrayに 1 と 2 をセット
    MyArray(0) = 1
    MyArray(1) = 2
    
    Call TestB(MyArray)
    
    '配列 MyArrayは 1 と 2 のままで入れ替わらない
    MsgBox MyArray(0) & " " & MyArray(1)
    
End Sub


'配列引数を参照渡しする
Sub TestA(ByRef MyArray() As Long)
    'または (ByRef MyArray As Variant)

    '配列 MyArrayに 3 と 4 をセットし直す
    MyArray(0) = 3
    MyArray(1) = 4

End Sub


'配列引数を値渡しする
Sub TestB(ByVal MyArray As Variant)
    '★配列引数を値渡しにするにはバリアント型

    '配列 MyArrayに 3 と 4 をセットし直す
    MyArray(0) = 3
    MyArray(1) = 4

End Sub