VBAにおける関数やサブルーチンの引数は、デフォルトでByRef(参照渡し)となっています。
つまり、引数に渡された変数のメモリアドレスを直接参照するため、サブルーチン内で引数の値を変更すると、元の変数の値も変更されます。
一方で、ByValキーワードを使用することで、引数を値渡しすることができます。
つまり、引数に渡された変数のコピーが作成され、サブルーチン内で引数の値を変更しても、元の変数の値は変更されません。
ByValキーワードの使い方
ByValキーワードを使用するには、関数やサブルーチンの引数の前に「ByVal」を指定します。例えば、以下のサブルーチンでは、引数をByValで渡しています。
1 2 3 |
Sub ShowMessage(ByVal message As String) MsgBox message End Sub |
このサブルーチンでは、引数に渡されたメッセージをメッセージボックスに表示するだけであり、引数の値を変更することはありません。
そのため、引数をByValで渡すことが適切です。
ByValキーワードの注意点
ByValキーワードを使用する場合でも、参照型の引数を渡す場合は注意が必要です。
参照型の引数をByValで渡すと、引数に渡された変数のコピーが作成されるため、元の変数の値は変更されません。
しかし、コピーされた変数自体は、引数に渡された変数と同じメモリアドレスを参照しているため、サブルーチン内でコピーされた変数の値を変更すると、元の変数の値も変更される可能性があります。
また、ByValキーワードを使用すると、引数の値を変更することができなくなるため、サブルーチン内で引数の値を変更する必要がある場合は、ByRefキーワードを使用する必要があります。
まとめ
VBAのByValキーワードは、関数やサブルーチンで引数を値渡しするために使用されます。ByValを使用すること
で、引数に渡された変数の値を変更することができなくなるため、引数の値を変更したくない場合や、引数が参照型であっても値渡ししたい場合に適しています。
ただし、参照型の引数を渡す場合は、注意が必要です。
ByRefとByValの使い分けは、引数の値を変更する必要がある場合はByRefを、変更しない場合はByValを使用するということが基本です。
ただし、参照型の引数を渡す場合は、引数の値を変更しない場合でもByRefを使用する必要がある場合があります。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub TestByVal() Dim num1 As Integer Dim num2 As Integer num1 = 10 num2 = 20 ' num1をByValで渡す AddNumbersByVal num1, num2 ' メッセージボックスでnum1とnum2の値を表示 MsgBox "num1 = " & num1 & vbCrLf & "num2 = " & num2 End Sub Sub AddNumbersByVal(ByVal num1 As Integer, ByRef num2 As Integer) ' num1を変更することはできない num1 = num1 + num2 ' num2は変更可能 num2 = num2 * 2 End Sub |
このサンプルコードでは、まずnum1に10、num2に20を代入します。
次に、AddNumbersByValサブルーチンを呼び出し、num1とnum2をByValで渡します。
AddNumbersByValサブルーチンでは、num1にnum2を加算するだけであり、num2を2倍するという処理も行います。
num1はByValで渡されているため、サブルーチン内でnum1を変更しても、元の変数の値は変わりません。
一方、num2はByValで渡されていないため、サブルーチン内でnum2を変更すると、元の変数の値も変更されます。
最後に、TestByValサブルーチン内でnum1とnum2の値を表示します。
この結果、num1は10のままであり、num2は40になっていることが確認できます。
コメント
引数が、二つとも「ByVal」で渡しているようですが?
ご指摘ありがとうございます。
修正いたしました。