VBAでプロシージャを作成していると、「引数の値が変わってしまった」「思った通りに値が渡らない」といった経験をしたことはないでしょうか。
特に、SubやFunctionを呼び出して値を渡す処理では、引数の渡し方(ByRef・ByVal)が重要になります。
VBAでは、引数の既定値は ByRef(参照渡し) になっています。
そのため、意図せず値が変更されるケースも少なくありません。
例えば次のような場面です。
・プロシージャの中で値を書き換えたら元の変数も変わった
・変数を渡しただけなのに値が変更された
・引数の扱い方がよく分からない
このような問題は、ByRefの仕組みを理解することで解決できます。
この記事では、VBAにおける ByRefの基本的な使用方法を解説しながら、
実務で役立つ使いどころや注意点も紹介します。
目次
✅ VBAのByRefとは何かを理解する
VBAでは、プロシージャに引数を渡す方法として ByRef(参照渡し) と ByVal(値渡し) の2つがあります。
ByRefは、変数そのものを参照して処理を行う方法です。
この仕組みを理解していないと、プロシージャの中で値を変更したときに、呼び出し元の変数まで変わってしまうことがあります。
実務では、これが原因でバグが発生するケースも多くあります。
また、VBAでは特に指定しない場合、引数は ByRefとして扱われる ため、意識していないと参照渡しが使われてしまう点にも注意が必要です。
この仕組みを理解しておくと、プロシージャの設計が格段に分かりやすくなります。
・ByRefの基本構文
ByRefは、次のように引数の前に指定します。
Sub Sample(ByRef value As Long)
End Sub
この構文では、valueという変数を参照渡しで受け取っています。
つまり、呼び出し元の変数を直接操作することになります。
✅ ByRefを使った基本的な処理例
ByRefの動作を理解するには、実際のコードを見るのが一番分かりやすいです。
ここでは簡単な例を紹介します。
Sub MainProcess()
Dim numberValue As Long
numberValue = 10
Call ChangeValue(numberValue)
MsgBox numberValue
End Sub
Sub ChangeValue(ByRef value As Long)
value = value + 5
End Sub
・処理の流れ
- numberValue に 10 を代入
- ChangeValue に numberValue を渡す
- value を +5 する
- 呼び出し元の変数も変更される
この場合、表示される結果は 15 になります。
なぜなら、ByRefは 変数そのものを参照しているためです。
・なぜByRefが必要なのか
ByRefを使うと、プロシージャの中で値を変更し、その結果を呼び出し元に反映できます。
例えば次のような処理です。
・計算結果を変数に反映
・複数の値を更新する処理
・データ加工処理
このような場面では、ByRefが非常に便利です。
✅ ByRefのメリット
ByRefを理解すると、VBAのプロシージャ設計が非常に柔軟になります。
・複数の値を更新できる
ByRefは、呼び出し元の変数を直接変更できます。
そのため、戻り値だけでは処理できないケースに対応できます。
例えば次のような処理です。
・売上金額の更新
・計算結果の更新
・データの修正処理
Functionでは戻り値は1つしか返せませんが、
ByRefを使えば複数の値を変更できます。
・メモリ効率が良い
ByRefは、変数のコピーを作らずに参照するため、メモリ効率が良くなります。
大量のデータを扱う場合には、
処理速度の面でもメリットがあります。
例えば
・大きな配列
・大量データの処理
といった場合です。
ByRefを理解しておくと、
プロシージャ間でデータを受け渡す処理が設計しやすくなります。
VBAでSubやFunctionをどのように使い分けるべきかについては、次の記事で詳しく解説しています。
→ 【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計
✅ ByRefを使うときの注意点
ByRefは便利ですが、使い方を間違えるとバグの原因になります。
特に次の点に注意が必要です。
・呼び出し元の変数が変更される
ByRefは参照渡しのため、
プロシージャ内の変更が呼び出し元に反映されます。
そのため、次のような問題が起きることがあります。
・値が意図せず変更される
・変数の状態が分かりにくくなる
・デバッグが難しくなる
このような問題を防ぐには、処理の目的を明確にすることが重要です。
・設計意図を明確にする
実務では、次のように使い分けるのがおすすめです。
ByRef
→ 値を変更する処理
ByVal
→ 値を参照するだけ
このルールを決めておくと、コードが読みやすくなります。
✅ ByRefが活躍する実務パターン
ByRefは、実務のVBAでよく使われる機能です。
例えば次のようなケースがあります。
・データ更新処理
Sub UpdateTotal(ByRef totalValue As Double)
totalValue = totalValue + 100
End Sub
売上などの数値を更新する処理です。
・配列データの加工
配列を渡して処理する場合も、ByRefが使われます。
配列をコピーせずに処理できるため、
大量データでも効率的です。
・オブジェクト操作
RangeやWorksheetなどのオブジェクトも、参照渡しで扱われます。
例えば
・セルの値変更
・書式設定
・シート操作
などです。
ここまで紹介したように、ByRefは実務でもよく使われる仕組みですが、
正しく使いこなすためには ByValとの違い を理解しておくことも重要です。
値渡しと参照渡しの違いについては、次の記事で詳しく解説しています。
→ 【VBA】ByVal と ByRef の違い|値渡し・参照渡しの理解を深める完全ガイド
✅ VBAの引数設計を理解するとコードが読みやすくなる
VBAでプロシージャを作るとき、引数の設計は非常に重要です。
ByRefとByValを適切に使い分けることで、コードの可読性が大きく向上します。
例えば
・データ変更を目的とする処理
→ ByRef
・値の参照のみ
→ ByVal
というルールを決めておくと、コードを読む人にも分かりやすくなります。
特にチーム開発や長期運用では、この設計が非常に重要になります。
✅ まとめ:VBAのByRefを理解してプロシージャ設計を改善しよう
VBAのByRefは、引数の参照渡しを行う重要な仕組みです。
この仕組みを理解することで、プロシージャの動作を正しく設計できるようになります。
今回のポイントを整理すると次の通りです。
- ByRefは参照渡しを行う仕組み
- 呼び出し元の変数を直接変更できる
- 戻り値以外の値も更新できる
- 配列やオブジェクト処理で便利
- 設計意図を明確にすることが重要
ByRefの使い方を理解すると、VBAのプロシージャ設計がより柔軟になります。
ぜひByValとの違いも合わせて理解しながら、
読みやすく保守しやすいVBAコードの作成に役立ててみてください。