Excel VBA | 関数の戻り値と ByRef の使い分け — 設計フロー(チェックリスト+コード例)

VBA
スポンサーリンク

在庫管理システム全体の設計例

ByRef と 戻り値 の使い分けマッピング

在庫管理システムを例に、どこで ByRef を使うか/どこで戻り値を使うかを整理した設計例を示します。これにより「副作用を避ける場面」と「複数値返却や参照差し替えが必要な場面」が明確になります。


システム機能一覧と設計方針

機能主な処理内容戻り値の利用ByRefの利用理由
売上登録単価×数量で売上金額を計算売上金額を戻り値利益など副次情報をByRef主結果は戻り値、副次結果はByRef
在庫更新出庫処理で残数を減らす在庫ステータスを戻り値残数をByRefで更新呼び出し元の在庫数を直接更新する必要あり
入庫処理在庫数を増やす+更新日時を記録なし残数と更新日時をByRef複数値返却に便利
商品検索商品コードに一致するセルを探すなしRange参照をByRefで差し替え呼び出し元の参照を更新する必要あり
在庫照会在庫数を取得在庫数を戻り値なし副作用不要なので戻り値のみ
在庫調整在庫数を増減+ステータス返却ステータスを戻り値在庫数をByRef主結果と副次結果の分担

コード例(主要機能)

1. 売上登録(戻り値+ByRef)

Function RegisterSale(ByVal unitPrice As Double, ByVal qty As Long, ByRef profit As Double) As Double
    Dim revenue As Double
    revenue = unitPrice * qty
    profit = revenue * 0.3   ' 利益率30%と仮定
    RegisterSale = revenue   ' 主結果(売上金額)
End Function
VB

2. 在庫更新(残数をByRefで更新、ステータスを戻り値)

Function UpdateStock(ByRef stockQty As Long, ByVal orderQty As Long) As String
    stockQty = stockQty - orderQty
    If stockQty <= 0 Then
        UpdateStock = "在庫切れ"
    Else
        UpdateStock = "在庫あり"
    End If
End Function
VB

3. 入庫処理(複数値返却にByRef)

Sub AddStock(ByRef stockQty As Long, ByRef lastUpdate As Date, ByVal addQty As Long)
    stockQty = stockQty + addQty
    lastUpdate = Now
End Sub
VB

4. 商品検索(Range参照をByRefで差し替え)

Sub FindProduct(ByRef r As Range, ByVal productCode As String)
    Dim found As Range
    Set found = Sheet1.Range("A:A").Find(productCode)
    If Not found Is Nothing Then
        Set r = found   ' 呼び出し元の参照を更新
    End If
End Sub
VB

5. 在庫照会(戻り値のみ)

Function GetStock(ByVal productCode As String) As Long
    Dim found As Range
    Set found = Sheet1.Range("A:A").Find(productCode)
    If Not found Is Nothing Then
        GetStock = found.Offset(0, 1).Value   ' 在庫数を返す
    Else
        GetStock = -1   ' 見つからない場合
    End If
End Function
VB

6. 在庫調整(戻り値+ByRef)

Function AdjustStock(ByRef stockQty As Long, ByVal diff As Long) As String
    stockQty = stockQty + diff
    If stockQty < 0 Then
        AdjustStock = "在庫不足"
    Else
        AdjustStock = "在庫更新完了"
    End If
End Function
VB

設計マッピングまとめ

  • 戻り値で返すべきもの
    • 主結果(売上金額、ステータス、在庫数など)
    • 副作用不要な値
  • ByRefで返すべきもの
    • 複数値返却(残数+更新日時など)
    • 呼び出し元の変数を直接更新する必要があるもの(在庫残数、Range参照)
    • 参照差し替え(商品検索でセル参照を更新)

💡 このように「主結果は戻り値、副次結果や参照差し替えはByRef」というルールを徹底すると、在庫管理システム全体が 安全で分かりやすい設計 になります。

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