Excel VBA | 在庫管理や売上処理でよくあるバグ

VBA
スポンサーリンク

了解です!ここでは 在庫管理や売上処理でよくあるバグ を例に挙げて、修正版コードと解説をまとめます。実務でありがちな「間違い探し」形式です。

よくあるバグと修正例

1. 在庫更新で商品コードが見つからない

バグ例

Sub 在庫更新_Bug()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("在庫表")
    
    Dim code As String
    code = "P001"
    
    ' Findで検索
    Dim rng As Range
    Set rng = ws.Range("A:A").Find(code)
    
    ' 見つからない場合の処理がない ← バグ
    ws.Cells(rng.Row, 2).Value = 50
End Sub
VB

修正版

Sub 在庫更新_Fixed()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("在庫表")
    
    Dim code As String
    code = "P001"
    
    Dim rng As Range
    Set rng = ws.Range("A:A").Find(What:=code, LookAt:=xlWhole)
    
    If Not rng Is Nothing Then
        ws.Cells(rng.Row, 2).Value = 50
    Else
        MsgBox "商品コード " & code & " は見つかりませんでした。"
    End If
End Sub
VB

👉 修正ポイント: 検索結果がNothingの場合を必ずチェック。


2. 売上処理で在庫がマイナスになる

バグ例

Sub 売上処理_Bug()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("在庫表")
    
    Dim code As String
    code = "P002"
    Dim qty As Long
    qty = 10
    
    Dim rng As Range
    Set rng = ws.Range("A:A").Find(What:=code, LookAt:=xlWhole)
    
    ws.Cells(rng.Row, 2).Value = ws.Cells(rng.Row, 2).Value - qty
    ' 在庫がマイナスになる可能性あり ← バグ
End Sub
VB

修正版

Sub 売上処理_Fixed()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("在庫表")
    
    Dim code As String
    code = "P002"
    Dim qty As Long
    qty = 10
    
    Dim rng As Range
    Set rng = ws.Range("A:A").Find(What:=code, LookAt:=xlWhole)
    
    If Not rng Is Nothing Then
        Dim currentStock As Long
        currentStock = ws.Cells(rng.Row, 2).Value
        
        If currentStock >= qty Then
            ws.Cells(rng.Row, 2).Value = currentStock - qty
        Else
            MsgBox "在庫不足: " & code & " の在庫は " & currentStock & " 個しかありません。"
        End If
    Else
        MsgBox "商品コード " & code & " は見つかりませんでした。"
    End If
End Sub
VB

👉 修正ポイント: 在庫数が足りない場合はエラーを出す。


3. 発注リスト反映で新商品が追加されない

バグ例

Sub 発注反映_Bug()
    Dim wsStock As Worksheet
    Dim wsOrder As Worksheet
    Set wsStock = Sheets("在庫表")
    Set wsOrder = Sheets("発注リスト")
    
    Dim i As Long
    For i = 2 To wsOrder.Cells(Rows.Count, 1).End(xlUp).Row
        Dim code As String
        code = wsOrder.Cells(i, 1).Value
        Dim qty As Long
        qty = wsOrder.Cells(i, 2).Value
        
        Dim rng As Range
        Set rng = wsStock.Range("A:A").Find(code)
        
        ' 見つからない場合の処理がない ← バグ
        wsStock.Cells(rng.Row, 2).Value = wsStock.Cells(rng.Row, 2).Value + qty
    Next i
End Sub
VB

修正版

Sub 発注反映_Fixed()
    Dim wsStock As Worksheet
    Dim wsOrder As Worksheet
    Set wsStock = Sheets("在庫表")
    Set wsOrder = Sheets("発注リスト")
    
    Dim i As Long
    For i = 2 To wsOrder.Cells(Rows.Count, 1).End(xlUp).Row
        Dim code As String
        code = wsOrder.Cells(i, 1).Value
        Dim qty As Long
        qty = wsOrder.Cells(i, 2).Value
        
        Dim rng As Range
        Set rng = wsStock.Range("A:A").Find(What:=code, LookAt:=xlWhole)
        
        If Not rng Is Nothing Then
            wsStock.Cells(rng.Row, 2).Value = wsStock.Cells(rng.Row, 2).Value + qty
        Else
            Dim newRow As Long
            newRow = wsStock.Cells(Rows.Count, 1).End(xlUp).Row + 1
            wsStock.Cells(newRow, 1).Value = code
            wsStock.Cells(newRow, 2).Value = qty
        End If
    Next i
End Sub
VB

👉 修正ポイント: 新商品は在庫表に追加する処理を入れる。


✅ 実務でよくあるバグまとめ

  • 検索結果がNothingのまま処理 → エラーやクラッシュの原因
  • 在庫数がマイナスになる → 売上処理でチェック必須
  • 新商品が追加されない → 発注反映で在庫表に追記が必要
  • ループの更新忘れ → 無限ループに注意

💡 こうしたバグ修正は「必ず条件分岐を入れる」「境界値をチェックする」が鉄則です。

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