在庫管理システム全体の設計例
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
VB2. 在庫更新(残数を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
VB3. 入庫処理(複数値返却にByRef)
Sub AddStock(ByRef stockQty As Long, ByRef lastUpdate As Date, ByVal addQty As Long)
stockQty = stockQty + addQty
lastUpdate = Now
End Sub
VB4. 商品検索(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
VB5. 在庫照会(戻り値のみ)
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
VB6. 在庫調整(戻り値+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」というルールを徹底すると、在庫管理システム全体が 安全で分かりやすい設計 になります。

