Excel VBA | 「関数の戻り値 vs ByRef の使い分けをどう決めるか」という 設計判断フロー を図解する

VBA
スポンサーリンク

では先ほどの「設計判断フロー」を 実際のコード例 に落とし込んでみましょう。ここでは「戻り値」と「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」という設計にすると、コードが安全で分かりやすくなります。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました