では先ほどの「設計判断フロー」を 実際のコード例 に落とし込んでみましょう。ここでは「戻り値」と「ByRef」を両方使うケースを示します。
実例:売上データから平均・最大値を計算する関数
設計意図
- 主結果(平均値) → 関数の戻り値で返す
- 副次結果(最大値) → ByRef 引数で返す
- 入力データ(配列) → ByVal で渡す(副作用を避ける)
コード例
Function CalcSalesStats(ByVal sales() As Double, ByRef maxVal As Double) As Double
Dim i As Long
Dim sum As Double
' 初期化
sum = 0
maxVal = sales(LBound(sales))
' 配列を走査
For i = LBound(sales) To UBound(sales)
sum = sum + sales(i)
If sales(i) > maxVal Then
maxVal = sales(i)
End If
Next
' 平均値を戻り値で返す
CalcSalesStats = sum / (UBound(sales) - LBound(sales) + 1)
End Function
VB呼び出し側の例
Sub TestStats()
Dim data(1 To 5) As Double
Dim avg As Double
Dim maxVal As Double
' サンプルデータ
data(1) = 100
data(2) = 200
data(3) = 150
data(4) = 300
data(5) = 250
' 関数呼び出し
avg = CalcSalesStats(data, maxVal)
' 結果表示
Debug.Print "平均値: "; avg ' → 200
Debug.Print "最大値: "; maxVal ' → 300
End Sub
VB解説
- 平均値(主結果) → 関数の戻り値で返すので、副作用なし。
- 最大値(副次結果) → ByRef 引数で返すので、複数値返却が可能。
- 入力配列 → ByVal で渡すため、呼び出し元の配列は壊れない。
✅ 設計パターンのポイント
- 戻り値は「主結果」 → 読みやすく安全。
- ByRefは「副次結果」や「複数値返却」に限定 → 意図が明確になる。
- 入力は必ずByVal → 呼び出し元を壊さない。
👉 このように「主結果は戻り値、副次結果はByRef」という設計にすると、コードが安全で分かりやすくなります。
