【食品製造】在庫ロットの賞味期限が近いものを一覧にして色分けする

公開日:2026年10月5日 執筆:Takuya カテゴリ:業種別サンプル

食品工場や倉庫の在庫一覧から、賞味期限までの残り日数を計算し、期限切れ・7日以内・30日以内の3段階で色分けして別シートに一覧化するマクロです。

想定する場面

食品の製造・物流の現場では、ロットごとの賞味期限を管理し、期限が近い在庫を優先して出荷(先入れ先出し)する必要があります。在庫一覧は毎日更新されますが、期限の近いロットを目で探すのは時間がかかり、見落としが廃棄ロスや出荷事故につながります。

このマクロは、在庫一覧から残り日数を計算し、注意が必要なロットだけを期限の近い順に並べて「期限アラート」シートに出力します。

データの形(例)

「在庫」シートを次の列構成とします。実際の在庫システムから出力した CSV を貼り付ける運用を想定しています。

  • A列:品目コード
  • B列:品名
  • C列:ロット番号
  • D列:賞味期限
  • E列:在庫数量
  • F列:保管場所

コード

残り日数が30日以内(期限切れを含む)のロットだけを集め、残り日数の短い順に並べ替えてから出力します。並べ替えはシートに書き込んだあと Excel の Sort で行っています。

Sub ExpiryAlert()
    Const WARN_DAYS As Long = 30
    Dim ws As Worksheet, outWs As Worksheet, data As Variant, out() As Variant
    Dim i As Long, n As Long, remain As Long, lastRow As Long

    Set ws = ThisWorkbook.Worksheets("在庫")
    Set outWs = ThisWorkbook.Worksheets("期限アラート")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < 2 Then Exit Sub
    data = ws.Range("A2:F" & lastRow).Value
    ReDim out(1 To UBound(data, 1), 1 To 7)

    For i = 1 To UBound(data, 1)
        If IsDate(data(i, 4)) And Val(data(i, 5)) > 0 Then
            remain = CDate(data(i, 4)) - Date
            If remain <= WARN_DAYS Then
                n = n + 1
                out(n, 1) = remain
                out(n, 2) = data(i, 1): out(n, 3) = data(i, 2): out(n, 4) = data(i, 3)
                out(n, 5) = data(i, 4): out(n, 6) = data(i, 5): out(n, 7) = data(i, 6)
            End If
        End If
    Next i

    outWs.Cells.Clear
    outWs.Range("A1:G1").Value = Array("残り日数", "品目コード", "品名", "ロット", "賞味期限", "在庫数", "保管場所")
    If n = 0 Then MsgBox "30日以内に期限を迎える在庫はありません": Exit Sub
    outWs.Range("A2").Resize(n, 7).Value = out
    outWs.Range("A1").Resize(n + 1, 7).Sort Key1:=outWs.Range("A2"), Order1:=xlAscending, Header:=xlYes

    For i = 2 To n + 1                                  ' 3段階で色分け
        Select Case outWs.Cells(i, 1).Value
            Case Is < 0:  outWs.Rows(i).Interior.Color = RGB(255, 150, 150)   ' 期限切れ
            Case Is <= 7: outWs.Rows(i).Interior.Color = RGB(255, 220, 150)   ' 7日以内
            Case Else:    outWs.Rows(i).Interior.Color = RGB(255, 250, 200)   ' 30日以内
        End Select
    Next i
    outWs.Range("E:E").NumberFormatLocal = "yyyy/mm/dd"
    MsgBox n & " ロットが期限30日以内です"
End Sub

コードのポイント

日付どうしの引き算は日数になるので、「賞味期限 − 今日」で残り日数を求めています。在庫数が 0 のロットは対象外にして、すでに出荷済みのロットが一覧に混ざらないようにしています。

出力用の配列 out は、元データと同じ行数で用意し、条件に合った行だけを前から詰めて入れています。最後に n 行分だけをシートに書き込むので、空白行が出力されることはありません。

現場で使うときの工夫

しきい値(30日・7日)は、品目の賞味期限の長さや、取引先との「納品期限(いわゆる3分の1ルールなど)」によって変わります。品目ごとに許容日数が違う場合は、品目マスタに「出荷期限までの日数」の列を持たせて、品目ごとに判定すると実態に合います。

毎朝の朝礼前にこのマクロを実行して一覧を印刷し、出荷担当者と共有する運用にすると、期限の近い在庫の見落としを防ぎやすくなります。

※サンプルの列構成は説明用です。実際の在庫データの列に合わせて変更してください。賞味期限・出荷期限の判断は、社内ルールと取引先との取り決めに従ってください。

ほかの記事