結論
VBAにおける ByVal と ByRef の違いは「コピーを渡すか」「元の変数の参照を渡すか」という点にあり、メモリやパフォーマンス面では データのサイズや型によって影響が変わる。小さな値なら差はほぼ無視できるが、大きなデータや文字列では違いが出やすいです。
メモリ面の違い
- ByVal(値渡し)
- 引数の値を「コピー」して渡す
- プロシージャ内で変更しても呼び出し元には影響なし
- コピーを作るため、メモリを余分に消費する
- 特に 文字列や配列など大きなデータ型ではコピーコストが増えるe
- ByRef(参照渡し)
- 変数の「メモリアドレス(参照)」を渡す
- プロシージャ内で変更すると呼び出し元の変数も変わる
- コピーを作らないので、メモリ効率が良い
- ただし「元の値が変わる」ため、意図しないバグの原因になりやすい
パフォーマンス面の違い
- ByVal
- コピーを作るため、大きなデータでは処理が遅くなる可能性あり
- 小さな数値や短い文字列ならほぼ差はない
- 安全性(元の値を守る)を優先する場面で有効
- ByRef
- コピーを作らないので、大きなデータを扱うときに高速
- ただし、呼び出し元の値が直接書き換わるため、予期せぬ副作用に注意
- デフォルトではVBAは ByRef になるため、明示的にByValを指定する習慣が推奨される Note
具体例
Sub TestByVal()
Dim s As String
s = "Hello"
Call ChangeByVal(s)
MsgBox s ' → "Hello" のまま
End Sub
Sub ChangeByVal(ByVal txt As String)
txt = txt & " World"
End Sub
VBSub TestByRef()
Dim s As String
s = "Hello"
Call ChangeByRef(s)
MsgBox s ' → "Hello World" に変わる
End Sub
Sub ChangeByRef(ByRef txt As String)
txt = txt & " World"
End Sub
VB- ByVal: コピーを渡すので元の
sは変わらない - ByRef: 参照を渡すので元の
sが書き換わる
まとめ
- 安全性重視 → ByVal
(元の値を守りたいとき、小さなデータならパフォーマンス差は無視できる) - 効率重視 → ByRef
(大きな文字列や配列を扱うとき、コピーを避けたい場合) - 注意点: VBAでは省略すると ByRefがデフォルトなので、意図しない値変更を防ぐために 明示的にByValを指定する習慣が大切です。

