VBA:引数の「ByVal」(値渡し)、「ByRef」(参照渡し)について
プロシージャの引数で使う、「ByVal」(値渡し)、「ByRef」(参照渡し)についての説明していきます。
簡単に言うと以下のような感じです。
◆「ByVal」(値渡し)のサンプル
「ByVal」(値渡し)のサンプルコードです。
動かしてみるとプロシージャの「chkByVal」で変数を変化((3)部分)させても、元の変数に影響がないこと((4)部分)が分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub ByValチェック() Dim testByVal As Long '(1)変数に100を代入します。' testByVal = 100 '引数にします' Call chkByVal(testByVal) '(4)100が表示されます。' MsgBox testByVal '引数をByValにしているので、元の変数に影響はありません。' End Sub Private Sub chkByVal(ByVal testByVal As Long) '(2)引数は100なので、100で表示されます。' MsgBox testByVal '(3)引数に500を代入します。' testByVal = 500 End Sub |
◆「ByRef」(参照渡し)のサンプル
「ByRef」(参照渡し)のサンプルコードです。
動かしてみるとプロシージャの「chkByRef」で変数を変化させる((3)部分)と、元の変数も変更になっている((4)部分)ことが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub ByRefチェック() Dim testByRef As Long '(1)変数に1を代入します。' testByRef = 1 '引数にします' Call chkByRef(testByRef) '(4)1ではなく、5が表示されます。' MsgBox testByRef '引数をByRefにしているので、元の変数に影響があります。' End Sub Private Sub chkByRef(ByRef testByRef As Long) '(2)引数は1なので、1で表示されます。' MsgBox testByRef '(3)引数に5を代入します。' testByRef = 5 End Sub |
◆引数に「ByVal」や「ByRef」を付けない場合
以下のように「ByVal」や「ByRef」を付けない状態にすると、「ByRef」として処理されます。
もし変数をプロシージャ内で変更を加える場合は予期しない動きになるかもしれないので注意です。
1 2 |
'Private Sub chkByVal(ByVal testByVal As Long)' Private Sub chkByVal(testByVal As Long) |