Excel VBA | ByVal/ByRef のメモリやパフォーマンス面での違い

Excel VBA VBA
スポンサーリンク

結論

VBAにおける ByValByRef の違いは「コピーを渡すか」「元の変数の参照を渡すか」という点にあり、メモリやパフォーマンス面では データのサイズや型によって影響が変わる。小さな値なら差はほぼ無視できるが、大きなデータや文字列では違いが出やすいです。


メモリ面の違い

  • 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
VB
Sub 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を指定する習慣が大切です。

タイトルとURLをコピーしました