今回は、VBA(Visual Basic for Applications)における値渡し(ByVal)と参照渡し(ByRef)について解説します。
これらは、関数やメソッドに引数を渡す際の重要な概念です。
これらの違いを理解することで、より効率的でバグが少ないコードを書くことができます。
値渡し(ByVal)とは?
ByVal(値渡し)とは、関数やメソッドに引数を渡すときに、その変数の値を渡す方法です。
この方法では、呼び出し元の変数には影響がありません。
具体的には、以下のような特徴があります。
- 呼び出し先で引数の値を変更しても、呼び出し元の引数の値は変わりません。
- 呼び出し先で使われるのは、呼び出し元の変数のコピーです。
Sub TestByVal ()
Dim num As Integer: num = 10
Call ChangeValueByVal(num)
MsgBox num '結果は10
End Sub
Sub ChangeValueByVal (ByVal x As Integer)
x = x + 5
End Sub
この例では、ChangeValueByValサブルーチンにnumの値が渡されますが、num自体は変更されません。 したがって、メッセージボックスには10が表示されます。
参照渡し(ByRef)とは?
ByRef(参照渡し)とは、関数やメソッドに引数を渡すときに、その変数自体を渡す方法です。 この方法では、呼び出し元の変数に影響があります。
具体的には、以下のような特徴があります。
- 呼び出し先で引数の値を変更すると、呼び出し元の引数の値も変わります。
- 呼び出し先で使われるのは、呼び出し元の変数そのものです。
Sub TestByRef ()
Dim num As Integer: num = 10
Call ChangeValueByRef(num)
MsgBox num ' 結果は15
End Sub
Sub ChangeValueByRef (ByRef x As Integer)
x = x + 5
End Sub
この例では、ChangeValueByRefサブルーチンにnumの参照が渡されます。
したがって、xの値を変更するとnumも変更され、メッセージボックスには15が表示されます。
注意点
上記で説明した「ByVal」と「ByRef」は省略することもできます。
しかし、省略した場合は、参照渡し(ByRef)になりますので、意図せず呼び出し元の変数の値が変わってしまうことがあります。
そのため、引数の渡し方を明示的に指定することをお勧めします。
まとめ
VBAにおける値渡し(ByVal)と参照渡し(ByRef)の違いについて理解していただけましたでしょうか?
これらの概念を正しく使い分けることで、より効率的でバグの少ないコードを書くことができます。
ぜひ、実際のプロジェクトで試してみてください!