引数の「参照渡し」と「値渡し」
「参照渡し」とはプロシージャに引数として変数を渡す方法の1つで、この場合、変数が格納されたアドレスを渡します。このため、呼び出されたプロシージャ内で渡された変数の値を変更すると、呼び出し元の変数の値も変更されてしまいます。
一方、「値渡し」もプロシージャに引数として変数を渡す方法の1つですが、こちらは、変数のコピーを渡します。したがって、呼び出されたプロシージャ内で渡された変数の値を変更しても呼び出し元の変数の値は変更されません。
【構文】
< 参照渡し >
Sub name ( ByRef varname As varname_type )
< 値渡し >
Sub name ( ByVal varname As varname_type )
【項目の説明】
- name ・・・ 定義するプロシージャ(Sub プロシージャ・Function プロシージャなど)の名前
- varname ・・・ プロシージャを呼び出したときに引き渡す引数を指定します。複数指定する場合はカンマ(,)で区切ります。
- varname_type ・・・ 引数 varname のデータ型を指定します。省略すると引数 varname は、バリアント型(Variant)となります。
「参照渡し」にしたい時は、ByRef キーワードを、「値渡し」にしたい時は、ByVal キーワードを引数 varname の前につけますが、これらのキーワードを省略した場合は、「参照渡し」となります。
「ByRef キーワード」「ByVal キーワード」の使用例
サンプルVBAソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Sub Sample() Dim val1, val2, val3 val1 = 125: val2 = 31: val3 = 1 '参照渡し Debug.Print Sample_byref(val1) '250 Debug.Print val1 '250(値が変更されます) '値渡し Debug.Print Sample_byval(val2) '310 Debug.Print val2 '31(値は変わりません) '省略(参照渡し) Debug.Print Sample_omission(val3) '10001 Debug.Print val3 '10001(値は変更されます) End Sub '--------------------------------------------------------------------------- ' 参照渡し(キーワード ByRef)を使用する例 '--------------------------------------------------------------------------- Function Sample_byref(ByRef myVal) myVal = myVal * 2 Sample_byref = myVal End Function '--------------------------------------------------------------------------- ' 値渡し(キーワード ByVal)を使用する例 '--------------------------------------------------------------------------- Function Sample_byval(ByVal myVal) myVal = myVal * 10 Sample_byval = myVal End Function '--------------------------------------------------------------------------- ' 参照渡し(キーワード省略 )を使用する例 '--------------------------------------------------------------------------- Function Sample_omission(myVal) myVal = myVal + 10000 Sample_omission = myVal End Function |