VBAで処理を書いていると、「とりあえず動くコード」は書けるようになっても、
処理が長くなり、どこで何をしているのか分かりにくくなることはありませんか。
特に、複数の処理を1つのプロシージャに詰め込んでしまうと、
修正・再利用・テストが難しくなり、実務では保守性が大きく下がります。
この記事では、VBAにおける「戻り値」を活用した設計の考え方を解説します。
単なるFunctionの使い方ではなく、「なぜ戻り値を使うべきか」「どう設計すると実務で強いか」に焦点を当てています。
目次
- ✅ VBA プロシージャの戻り値とは何かを理解する
- ・SubとFunctionの違い
- ・なぜ戻り値が重要なのか
- ✅ VBAで戻り値を使わない場合に起きる問題
- ・問題①:処理が肥大化する
- ・問題②:再利用できない
- ・問題③:テストができない
- ✅ VBAで戻り値を使う基本パターン
- ・例:合計値を返すFunction
- ・なぜこの設計にしているのか
- ・別の書き方との比較
- ✅ VBAで複数の戻り値を扱う設計
- ・方法①:配列で返す
- ・方法②:ByRefで受け取る
- ・どちらを使うべきか
- ✅ VBAで戻り値設計を活用した実務パターン
- ・例:エラーチェックを返す
- ・呼び出し側
- ・設計のポイント
- ✅ VBAで戻り値設計を使うときの注意点
- ・注意①:副作用を持たせない
- ・注意②:責務を明確にする
- ・注意③:型を明確にする
- ✅ VBAで戻り値を活用すると設計が変わる
- ・Before(処理中心)
- ・After(設計中心)
- ✅ まとめ:VBA 戻り値を使って設計力を高めよう
✅ VBA プロシージャの戻り値とは何かを理解する
VBAには大きく分けて2つのプロシージャがあります。
「Sub」と「Function」です。
ここを曖昧にしたまま開発を進めると、
処理の責務が混ざり、読みづらいコードになりやすいです。
特に実務では、「どこで値を作り、どこで使うのか」を明確にしないと、
後からの修正が非常に難しくなります。
まずは基本を整理します。
・SubとFunctionの違い
Sub(戻り値なし)
Sub SampleSub()
MsgBox "処理を実行"
End Sub
- 値を返さない
- 処理を実行することが目的
Function(戻り値あり)
Function GetMessage() As String
GetMessage = "処理を実行"
End Function
- 値を返す
- 結果を返すことが目的
・なぜ戻り値が重要なのか
戻り値を使うことで、以下が可能になります。
- 処理と結果を分離できる
- 再利用しやすくなる
- テストしやすくなる
👉 「処理を書く」から「設計する」へ変わるポイントです。
✅ VBAで戻り値を使わない場合に起きる問題
戻り値を使わないコードは、一見シンプルに見えます。
しかし実務では、問題が積み重なりやすいです。
ここを理解しないと、「なぜFunctionに分けるべきか」が腹落ちしません。
・問題①:処理が肥大化する
よくあるコード
Sub MainProcess()
Dim total As Long
total = 10 + 20
MsgBox total
End Sub
一見問題ありませんが、
処理が増えるとどんどん長くなります。
・問題②:再利用できない
同じ計算が別の場所でも必要になった場合、
コピー&ペーストになります。
👉 バグの温床になります。
・問題③:テストができない
値を返さないため、
途中結果を確認しにくいです。
👉 デバッグ効率が下がります。
✅ VBAで戻り値を使う基本パターン
ここからは実際の設計を見ていきます。
重要なのは、「処理を分離すること」です。
・例:合計値を返すFunction
Function CalculateTotal(ByVal value1 As Long, ByVal value2 As Long) As Long
CalculateTotal = value1 + value2
End Function
呼び出し側
Sub MainProcess()
Dim total As Long
total = CalculateTotal(10, 20)
MsgBox total
End Sub
・なぜこの設計にしているのか
- 計算処理を分離している
- 呼び出し側は「使うだけ」
- 再利用が可能
👉 責務が明確になります。
・別の書き方との比較
Subで書いた場合
Sub CalculateTotalSub(ByVal value1 As Long, ByVal value2 As Long)
Dim result As Long
result = value1 + value2
MsgBox result
End Sub
👉 問題点
- 結果を返せない
- 他の処理で使えない
Functionで戻り値を扱う場合、
「どのタイミングで処理を終了させるか」という設計も重要になります。
条件によって処理を途中で終了させる方法や、安全に戻り値を扱う考え方については、【VBA】Exit Functionの基本~実用的な使い方|処理制御と安全設計を完全解説の記事で詳しく解説しています。
✅ VBAで複数の戻り値を扱う設計
VBAでは戻り値は1つしか返せません。
ここが初心者がつまずきやすいポイントです。
・方法①:配列で返す
Function GetResults() As Variant
Dim results(1 To 2) As Long
results(1) = 100
results(2) = 200
GetResults = results
End Function
・方法②:ByRefで受け取る
Sub GetResults(ByRef value1 As Long, ByRef value2 As Long)
value1 = 100
value2 = 200
End Sub
・どちらを使うべきか
- 戻り値として扱いたい → Function
- 複数値を更新したい → ByRef
👉 設計意図で選びます。
複数の値を扱う場合、
単に取得するだけでなく「どの方法で返すか」によって設計の柔軟性が変わります。
Functionで複数の戻り値を返す具体的な方法と実務での活用例については、【VBA】Function で複数の戻り値を返す方法と活用例の記事で詳しく解説しています。
✅ VBAで戻り値設計を活用した実務パターン
実務では「値を返す」だけではなく、
「判断」や「状態」を返すことが重要です。
・例:エラーチェックを返す
Function IsValidData(ByVal value As Long) As Boolean
If value > 0 Then
IsValidData = True
Else
IsValidData = False
End If
End Function
・呼び出し側
Sub MainProcess()
If IsValidData(10) Then
MsgBox "正常"
Else
MsgBox "エラー"
End If
End Sub
・設計のポイント
- 判定ロジックを分離
- 条件分岐をシンプル化
👉 読みやすさが大幅に向上します。
✅ VBAで戻り値設計を使うときの注意点
戻り値は便利ですが、使い方を誤ると逆効果です。
・注意①:副作用を持たせない
Functionの中でセル操作などを行うと、
予期しない挙動になります。
👉 Functionは「値を返すだけ」にする
・注意②:責務を明確にする
1つのFunctionで複数の処理を行うと、
再利用性が下がります。
・注意③:型を明確にする
Function Sample() As Variant
👉 ではなく
Function Sample() As Long
👉 型を明示する
✅ VBAで戻り値を活用すると設計が変わる
戻り値を意識すると、コードの書き方が変わります。
・Before(処理中心)
- とりあえず動く
- 長いコード
- 再利用できない
・After(設計中心)
- 役割ごとに分割
- 読みやすい
- 再利用可能
👉 「コードを書く」から「仕組みを作る」へ変わります。
✅ まとめ:VBA 戻り値を使って設計力を高めよう
- Subは処理、Functionは結果を返す
- 戻り値を使うと責務が明確になる
- 再利用性・保守性が向上する
- 判定や計算はFunctionに分離
- 副作用を持たせない設計が重要
戻り値は単なる機能ではなく、
「設計を変えるための考え方」です。
この考え方を取り入れることで、
実務レベルのコードに一段引き上げることができます。
まずは、今書いているコードの中で
「戻り値にできる処理」を探してみてください。