【VBA】棚卸表・在庫一覧をExcelで自動管理する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
  5. シート構成
    1. シート1: 入出庫データ(シート名: “入出庫”)
    2. シート2: 棚卸表(シート名: “棚卸表”)— マクロが自動生成
  6. 手順(コピペ → 実行まで約10分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  7. コード(最小版)– 入出庫データから在庫数を集計してメッセージ表示
    1. 書き換えポイント
  8. コード(実務版)– 商品マスタ連携+在庫アラート+月次棚卸レポート+差異ハイライト
    1. 書き換えポイント
    2. 商品マスタシートの構成(任意)
  9. よくある落とし穴5選
    1. 1. 区分の文字が全角/半角で統一されておらず集計がずれる
    2. 2. 数量列に文字列が入っていて集計がスキップされる
    3. 3. 商品コードの大文字/小文字が混在して別商品として集計される
    4. 4. 入出庫データに空白行があると最終行の取得がずれる
    5. 5. 棚卸表シートが保護されていてクリアできずエラーになる
    6. VBAで在庫数の集計が合わないときの対処法
    7. VBAで棚卸表の書き出しがエラーになるときの対処法
  10. FAQ
    1. Q1: 商品マスタシートがなくても動く?
    2. Q2: 期間を絞って集計したい(今月分だけなど)
    3. Q3: 在庫数がマイナスになった場合はどう表示される?
    4. Q4: 実棚数量を入力した後、差異のある行だけ色を変えたい
    5. Q5: 1000行以上の入出庫データでも問題なく動く?
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること

この記事でわかること

  • 入出庫データから商品ごとの在庫数をDictionaryで自動計算できる
  • 棚卸表シートに在庫一覧を自動生成できる
  • 商品マスタ連携・在庫アラート・月次棚卸レポート・差異ハイライトまで実務で使える形に仕上がる

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

  • 入出庫データから商品ごとの在庫数を自動計算して棚卸表を作りたいとき
  • 安全在庫を下回った商品を自動でアラート表示して発注漏れを防ぎたいとき
  • 実棚数量と帳簿在庫の差異を自動計算して棚卸の突合せを効率化したいとき
  • 月次の在庫レポートをワンクリックで生成して報告資料に使いたいとき

完成イメージ(Before / After)

Before(手作業):

  1. 入出庫伝票を1件ずつ確認して商品ごとの入庫数・出庫数を電卓で集計
  2. 集計結果をExcelの在庫一覧シートに手入力
  3. 棚卸時に実在庫との差異を目視で確認

After(VBAで自動化):

  1. ボタンを押す(またはAlt+F8で実行)
  2. 入出庫データから商品ごとの在庫数を自動計算
  3. 棚卸表シートに一覧生成+在庫アラート+差異ハイライトまで自動

所要時間: コピペ → 実行まで約10分

自分も以前、月末の棚卸のたびに入出庫伝票を1件ずつExcelで集計していた。商品が100種類を超えると集計だけで半日かかるし、転記ミスで帳簿在庫と実在庫が合わないことが毎月あった。正直しんどかった。VBAで入出庫データから在庫数を自動計算するようにしてからは、棚卸の集計作業が5分で終わるようになった。この記事で、同じ苦労をしている人がサクッと自動化できればうれしい。

入出庫データから商品別の在庫数を自動計算し、棚卸表を1クリックで生成する。

Dictionaryを使った集計の基本は Dictionaryで重複チェック・集計を高速化する方法 で解説している。集計ロジックに不安がある人は先にそちらを読むとスムーズに進められる。

実行前の準備

バックアップを取る

実務版コードは棚卸表シートにデータを書き込む(前回データは上書き)。必ずファイルのコピーを別フォルダに保存してから実行する。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

シート構成

シート1: 入出庫データ(シート名: “入出庫”)

A列(日付) B列(商品コード) C列(商品名) D列(区分) E列(数量)
2026/03/01 P-001 コピー用紙 A4 入庫 100
2026/03/03 P-002 ボールペン 黒 入庫 200
2026/03/05 P-001 コピー用紙 A4 出庫 30
2026/03/10 P-003 クリアファイル 入庫 50
2026/03/12 P-002 ボールペン 黒 出庫 80
2026/03/15 P-001 コピー用紙 A4 出庫 20
  • 1行目はヘッダー
  • D列「区分」は「入庫」または「出庫」
  • E列「数量」は正の整数

シート2: 棚卸表(シート名: “棚卸表”)— マクロが自動生成

A列(商品コード) B列(商品名) C列(入庫合計) D列(出庫合計) E列(帳簿在庫)
P-001 コピー用紙 A4 100 50 50
P-002 ボールペン 黒 200 80 120
P-003 クリアファイル 50 0 50

データの並び替えが必要な場合は データを複数条件で自動並び替えする方法 を参照。

手順(コピペ → 実行まで約10分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(最小版)– 入出庫データから在庫数を集計してメッセージ表示

まずは入出庫データから商品ごとの在庫数を集計し、MsgBoxで一覧表示するだけの最小版。シートへの書き込みはしないので安全に動作確認できる。


'============================================================
' ■ 入出庫データから在庫数を集計(最小版)
'   → 入出庫シートから商品別の入庫/出庫/在庫をDictionaryで集計
'   → 結果をMsgBoxで表示(シートへの書き込みなし)
'   ※ 区分列が「入庫」「出庫」以外だとスキップされる
'============================================================
Sub CalcStockSimple()

    Dim wsData As Worksheet
    Set wsData = Worksheets("入出庫")

    '--- 最終行を取得
    Dim lastRow As Long
    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "入出庫データがありません。", vbExclamation
        Exit Sub
    End If

    '--- Dictionaryで商品別に集計
    '   Key = 商品コード
    '   Item = 配列(0:商品名, 1:入庫合計, 2:出庫合計)
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim r As Long
    For r = 2 To lastRow

        Dim code As String
        code = CStr(wsData.Cells(r, 2).Value)    '商品コード(B列)

        If code = "" Then GoTo NextRow

        '--- 初回登録
        If Not dict.Exists(code) Then
            Dim arr(2) As Variant
            arr(0) = CStr(wsData.Cells(r, 3).Value) '商品名(C列)
            arr(1) = 0  '入庫合計
            arr(2) = 0  '出庫合計
            dict.Add code, arr
        End If

        '--- 入庫 or 出庫を加算
        Dim tmp As Variant
        tmp = dict(code)

        Dim kbn As String
        kbn = CStr(wsData.Cells(r, 4).Value)  '区分(D列)

        Dim qty As Long
        If IsNumeric(wsData.Cells(r, 5).Value) Then
            qty = CLng(wsData.Cells(r, 5).Value) '数量(E列)
        Else
            qty = 0
        End If

        If kbn = "入庫" Then
            tmp(1) = tmp(1) + qty
        ElseIf kbn = "出庫" Then
            tmp(2) = tmp(2) + qty
        End If

        dict(code) = tmp

NextRow:
    Next r

    '--- 結果表示
    If dict.Count = 0 Then
        MsgBox "集計対象のデータがありません。", vbInformation
        Exit Sub
    End If

    Dim msg As String
    Dim k As Variant
    For Each k In dict.Keys
        tmp = dict(k)
        msg = msg & k & " " & tmp(0) & _
              "  入庫:" & tmp(1) & " 出庫:" & tmp(2) & _
              " 在庫:" & (tmp(1) - tmp(2)) & vbCrLf
    Next k

    MsgBox "在庫集計結果(" & dict.Count & " 品目)" & vbCrLf & vbCrLf & msg, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
Worksheets("入出庫") 入出庫データのシート名 "入出庫"
Cells(r, 2) 商品コードの列番号 2(B列)
Cells(r, 3) 商品名の列番号 3(C列)
Cells(r, 4) 区分の列番号 4(D列)
Cells(r, 5) 数量の列番号 5(E列)

コード(実務版)– 商品マスタ連携+在庫アラート+月次棚卸レポート+差異ハイライト

この仕組みを導入してからは、月末の棚卸作業が丸1日→30分に短縮された。帳簿在庫と実在庫の差異もハイライトで一目でわかるので、原因調査のスピードも格段に上がった。

※ 棚卸表シートの前回データは上書きされます。実行前にバックアップを取ってください。


'============================================================
' ■ 棚卸表自動生成(実務版)
'   → 入出庫データから商品別在庫を集計し棚卸表シートに出力
'   → 商品マスタ連携(カテゴリ・保管場所を付加)
'   → 在庫アラート(安全在庫割れを赤色ハイライト)
'   → 実棚数量との差異ハイライト
'   → 月次棚卸レポート(集計日・件数・アラート数をヘッダーに出力)
'
' シート構成:
'   "入出庫"   : A=日付, B=商品コード, C=商品名, D=区分, E=数量
'   "商品マスタ": A=商品コード, B=商品名, C=カテゴリ, D=保管場所, E=安全在庫
'   "棚卸表"   : マクロが自動生成(なければ新規作成)
'============================================================
Sub CreateInventoryReport()

    On Error GoTo ErrHandler

    Application.ScreenUpdating = False

    '--- ★書き換えポイント ---
    Const DATA_SHEET As String = "入出庫"
    Const MASTER_SHEET As String = "商品マスタ"
    Const REPORT_SHEET As String = "棚卸表"

    '入出庫シートの列番号
    Const COL_DATE As Long = 1       'A列: 日付
    Const COL_CODE As Long = 2       'B列: 商品コード
    Const COL_NAME As Long = 3       'C列: 商品名
    Const COL_KBN As Long = 4        'D列: 区分
    Const COL_QTY As Long = 5        'E列: 数量

    '商品マスタの列番号
    Const M_COL_CODE As Long = 1     'A列: 商品コード
    Const M_COL_CATEGORY As Long = 3 'C列: カテゴリ
    Const M_COL_LOCATION As Long = 4 'D列: 保管場所
    Const M_COL_SAFETY As Long = 5   'E列: 安全在庫

    '棚卸表のヘッダー開始行
    Const HEADER_ROW As Long = 4
    '--- ★ここまで ---

    Dim wsData As Worksheet
    Set wsData = Worksheets(DATA_SHEET)

    '--- 入出庫データの最終行を取得
    Dim lastRow As Long
    lastRow = wsData.Cells(wsData.Rows.Count, COL_CODE).End(xlUp).Row

    If lastRow < 2 Then
        MsgBox "入出庫データがありません。", vbExclamation
        GoTo CleanUp
    End If

    '--- 商品マスタをDictionaryに読み込み
    Dim wsMaster As Worksheet
    Dim hasMaster As Boolean
    hasMaster = False

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = MASTER_SHEET Then
            hasMaster = True
            Exit For
        End If
    Next ws

    Dim dictMaster As Object
    Set dictMaster = CreateObject("Scripting.Dictionary")

    If hasMaster Then
        Set wsMaster = Worksheets(MASTER_SHEET)
        Dim mLastRow As Long
        mLastRow = wsMaster.Cells(wsMaster.Rows.Count, M_COL_CODE).End(xlUp).Row

        Dim mr As Long
        For mr = 2 To mLastRow
            Dim mCode As String
            mCode = CStr(wsMaster.Cells(mr, M_COL_CODE).Value)
            If mCode <> "" And Not dictMaster.Exists(mCode) Then
                Dim mArr(2) As Variant
                mArr(0) = CStr(wsMaster.Cells(mr, M_COL_CATEGORY).Value) 'カテゴリ
                mArr(1) = CStr(wsMaster.Cells(mr, M_COL_LOCATION).Value) '保管場所
                If IsNumeric(wsMaster.Cells(mr, M_COL_SAFETY).Value) Then
                    mArr(2) = CLng(wsMaster.Cells(mr, M_COL_SAFETY).Value) '安全在庫
                Else
                    mArr(2) = 0
                End If
                dictMaster.Add mCode, mArr
            End If
        Next mr
    End If

    '--- 入出庫データをDictionaryで集計
    Dim dictStock As Object
    Set dictStock = CreateObject("Scripting.Dictionary")

    Dim r As Long
    For r = 2 To lastRow

        Dim code As String
        code = CStr(wsData.Cells(r, COL_CODE).Value)

        If code = "" Then GoTo NextDataRow

        '初回登録: (0)商品名, (1)入庫合計, (2)出庫合計
        If Not dictStock.Exists(code) Then
            Dim sArr(2) As Variant
            sArr(0) = CStr(wsData.Cells(r, COL_NAME).Value)
            sArr(1) = 0
            sArr(2) = 0
            dictStock.Add code, sArr
        End If

        Dim tmp As Variant
        tmp = dictStock(code)

        Dim kbn As String
        kbn = CStr(wsData.Cells(r, COL_KBN).Value)

        Dim qty As Long
        If IsNumeric(wsData.Cells(r, COL_QTY).Value) Then
            qty = CLng(wsData.Cells(r, COL_QTY).Value)
        Else
            qty = 0
        End If

        If kbn = "入庫" Then
            tmp(1) = tmp(1) + qty
        ElseIf kbn = "出庫" Then
            tmp(2) = tmp(2) + qty
        End If

        dictStock(code) = tmp

NextDataRow:
    Next r

    If dictStock.Count = 0 Then
        MsgBox "集計対象のデータがありません。", vbInformation
        GoTo CleanUp
    End If

    '--- 棚卸表シートを準備(なければ新規作成)
    Dim wsReport As Worksheet
    Dim sheetExists As Boolean
    sheetExists = False

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = REPORT_SHEET Then
            sheetExists = True
            Exit For
        End If
    Next ws

    If sheetExists Then
        Set wsReport = Worksheets(REPORT_SHEET)
        wsReport.Cells.ClearContents
        wsReport.Cells.Interior.ColorIndex = xlNone  '色もクリア
    Else
        Set wsReport = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        wsReport.Name = REPORT_SHEET
    End If

    '--- レポートヘッダー(月次棚卸レポート情報)
    wsReport.Range("A1").Value = "棚卸表(自動生成)"
    wsReport.Range("A1").Font.Bold = True
    wsReport.Range("A1").Font.Size = 14

    wsReport.Range("A2").Value = "集計日: " & Format(Date, "yyyy/mm/dd")
    wsReport.Range("C2").Value = "品目数: " & dictStock.Count & " 件"

    '--- テーブルヘッダー
    Dim headers As Variant
    headers = Array("商品コード", "商品名", "カテゴリ", "保管場所", _
                    "入庫合計", "出庫合計", "帳簿在庫", "安全在庫", _
                    "実棚数量", "差異", "ステータス")

    Dim col As Long
    For col = 0 To UBound(headers)
        wsReport.Cells(HEADER_ROW, col + 1).Value = headers(col)
    Next col

    '--- ヘッダー行の書式
    With wsReport.Range(wsReport.Cells(HEADER_ROW, 1), _
                        wsReport.Cells(HEADER_ROW, UBound(headers) + 1))
        .Font.Bold = True
        .Interior.Color = RGB(68, 114, 196)
        .Font.Color = RGB(255, 255, 255)
    End With

    '--- データ書き込み
    Dim writeRow As Long
    writeRow = HEADER_ROW + 1

    Dim alertCnt As Long
    alertCnt = 0

    Dim k As Variant
    For Each k In dictStock.Keys

        tmp = dictStock(k)

        Dim stockQty As Long
        stockQty = tmp(1) - tmp(2)  '帳簿在庫 = 入庫合計 - 出庫合計

        wsReport.Cells(writeRow, 1).Value = k              '商品コード
        wsReport.Cells(writeRow, 2).Value = tmp(0)         '商品名
        wsReport.Cells(writeRow, 5).Value = tmp(1)         '入庫合計
        wsReport.Cells(writeRow, 6).Value = tmp(2)         '出庫合計
        wsReport.Cells(writeRow, 7).Value = stockQty       '帳簿在庫

        '--- 商品マスタ連携(カテゴリ・保管場所・安全在庫)
        Dim safetyStock As Long
        safetyStock = 0

        If dictMaster.Exists(CStr(k)) Then
            Dim mInfo As Variant
            mInfo = dictMaster(CStr(k))
            wsReport.Cells(writeRow, 3).Value = mInfo(0)   'カテゴリ
            wsReport.Cells(writeRow, 4).Value = mInfo(1)   '保管場所
            wsReport.Cells(writeRow, 8).Value = mInfo(2)   '安全在庫
            safetyStock = CLng(mInfo(2))
        End If

        '--- 実棚数量列(I列)は手入力用に空欄
        '--- 差異列(J列)に数式を設定
        wsReport.Cells(writeRow, 10).Formula = _
            "=IF(I" & writeRow & "="""","""",I" & writeRow & "-G" & writeRow & ")"

        '--- ステータス列(K列)
        wsReport.Cells(writeRow, 11).Formula = _
            "=IF(I" & writeRow & "="""",""未カウント""," & _
            "IF(J" & writeRow & "=0,""一致"",""差異あり""))"

        '--- 在庫アラート: 安全在庫を下回っていたら行を赤くする
        If safetyStock > 0 And stockQty < safetyStock Then
            wsReport.Range(wsReport.Cells(writeRow, 1), _
                           wsReport.Cells(writeRow, 11)).Interior.Color = RGB(255, 199, 206)
            alertCnt = alertCnt + 1
        End If

        writeRow = writeRow + 1

    Next k

    '--- 差異ハイライト用の条件付き書式(差異列が0以外なら黄色)
    Dim dataLastRow As Long
    dataLastRow = writeRow - 1

    If dataLastRow >= HEADER_ROW + 1 Then
        Dim rngDiff As Range
        Set rngDiff = wsReport.Range("J" & (HEADER_ROW + 1) & ":J" & dataLastRow)

        rngDiff.FormatConditions.Delete
        rngDiff.FormatConditions.Add Type:=xlCellValue, _
            Operator:=xlNotEqual, Formula1:="=0"
        rngDiff.FormatConditions(rngDiff.FormatConditions.Count).Interior.Color = RGB(255, 235, 156)
    End If

    '--- レポートヘッダーにアラート数を追加
    wsReport.Range("E2").Value = "在庫アラート: " & alertCnt & " 件"
    If alertCnt > 0 Then
        wsReport.Range("E2").Font.Color = RGB(192, 0, 0)
        wsReport.Range("E2").Font.Bold = True
    End If

    '--- 列幅を自動調整
    wsReport.Columns("A:K").AutoFit

    '--- 棚卸表シートをアクティブにする
    wsReport.Activate

    MsgBox "棚卸表を生成しました。" & vbCrLf & _
           "品目数: " & dictStock.Count & " 件" & vbCrLf & _
           "在庫アラート: " & alertCnt & " 件" & vbCrLf & vbCrLf & _
           "I列(実棚数量)に実際の数量を入力すると、" & vbCrLf & _
           "J列(差異)・K列(ステータス)が自動計算されます。", vbInformation

CleanUp:
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical
End Sub

書き換えポイント

定数 説明 初期値
DATA_SHEET 入出庫データのシート名 "入出庫"
MASTER_SHEET 商品マスタのシート名 "商品マスタ"
REPORT_SHEET 棚卸表の出力シート名 "棚卸表"
COL_CODECOL_QTY 入出庫シートの各列番号 1〜5
HEADER_ROW 棚卸表のヘッダー開始行 4

商品マスタシートの構成(任意)

商品マスタシートがなくても動作する。マスタがある場合はカテゴリ・保管場所・安全在庫が棚卸表に反映される。

A列(商品コード) B列(商品名) C列(カテゴリ) D列(保管場所) E列(安全在庫)
P-001 コピー用紙 A4 事務用品 倉庫A-1 30
P-002 ボールペン 黒 文具 倉庫A-2 50
P-003 クリアファイル 文具 倉庫B-1 15

エラー処理の詳細は エラー処理(On Error)で止まらないマクロを作る方法 を参照。オートフィルタで特定商品だけに絞り込む方法は オートフィルタでデータを絞り込み・解除する方法 でも解説している。

よくある落とし穴5選

1. 区分の文字が全角/半角で統一されておらず集計がずれる

自分もこれで1時間溶かした。入出庫データの「入庫」が一部「入庫」(全角スペース付き)になっていて、集計に含まれていなかった。Trim()で前後の空白を除去するか、入力時に 入力規則(ドロップダウンリスト)をVBAで一括設定する方法 でリスト制限しておくと防げる。

# 症状 原因 対策
1 入庫/出庫の集計が合わない 全角スペースや表記ゆれで条件に一致しない Trim()で空白除去。入力規則でリスト化

2. 数量列に文字列が入っていて集計がスキップされる

# 症状 原因 対策
2 特定行の数量が0になる CSV取り込みなどで数量が文字列型になっている IsNumeric()で事前チェック。CLng()で変換

3. 商品コードの大文字/小文字が混在して別商品として集計される

# 症状 原因 対策
3 同じ商品が2行に分かれる “P-001″と”p-001″がDictionaryの別キーになる UCase()で統一してからKeyに使う

4. 入出庫データに空白行があると最終行の取得がずれる

# 症状 原因 対策
4 途中のデータが集計されない Cells.End(xlUp)が空白行の手前で止まる データに空白行を入れない運用にするか、UsedRangeで全範囲を走査する

5. 棚卸表シートが保護されていてクリアできずエラーになる

# 症状 原因 対策
5 実行時エラー 1004 棚卸表シートにシート保護がかかっている 実行前にUnprotectで保護を解除する。保護の操作方法は 特定シートだけ保護・解除する方法 を参照

VBAで在庫数の集計が合わないときの対処法

「帳簿在庫が実際と合わない」場合、入出庫データの区分列に全角スペースや表記ゆれが混在している可能性が高い。「入庫」と「入庫 」(末尾スペース付き)は別文字列として扱われる。Trim()で前後の空白を除去するか、入力規則でドロップダウンリストにして入力を制限しよう。

VBAで棚卸表の書き出しがエラーになるときの対処法

「実行時エラー1004が出て棚卸表が作れない」場合、棚卸表シートにシート保護がかかっていてセルのクリアや書き込みができないことが原因だ。マクロの冒頭でwsResult.Unprotectを実行してから処理を開始し、完了後にwsResult.Protectで保護を戻す流れにしよう。

FAQ

Q1: 商品マスタシートがなくても動く?

動く。商品マスタがない場合は、カテゴリ・保管場所・安全在庫の列が空欄になるだけで集計自体は正常に実行される。まずはマスタなしで試して、必要になったらマスタシートを追加すればよい。

Q2: 期間を絞って集計したい(今月分だけなど)

入出庫データをオートフィルタで日付範囲に絞り込んでから実行する方法が一番手軽。VBA内で日付判定するなら、If wsData.Cells(r, COL_DATE).Value >= DateSerial(2026, 3, 1) Then のように条件を追加する。フィルタの詳細は オートフィルタでデータを絞り込み・解除する方法 を参照。

Q3: 在庫数がマイナスになった場合はどう表示される?

出庫合計が入庫合計を超えた場合、帳簿在庫はマイナスで表示される。データの入力ミスか、入庫データの登録漏れが考えられる。アラート表示で気づけるようになっている。

Q4: 実棚数量を入力した後、差異のある行だけ色を変えたい

実務版コードでは条件付き書式で差異列(J列)が0以外の場合に黄色ハイライトが自動設定される。実棚数量(I列)を入力すると自動で色が変わる。

Q5: 1000行以上の入出庫データでも問題なく動く?

Dictionaryの集計自体は高速なので1万行程度でも数秒で完了する。さらに速くしたい場合は、入出庫データを配列に一括読み込みしてからループ処理にすると効果的。詳しくは 配列を使ってVBAの処理速度を10倍にする方法 を参照。

まとめ

  • 入出庫データからDictionaryで商品別の在庫数を自動計算し、棚卸表を1クリックで生成できるようになった
  • 最小版で動作確認 → 実務版で商品マスタ連携・在庫アラート・差異ハイライトまで自動化、の2段階で進められる
  • 商品マスタシートは任意。なくても集計は動く
  • 実棚数量を入力すると差異・ステータスが自動計算されるので、棚卸時の突合せ作業が大幅に楽になる

関連記事

次にやりたくなること

コメント

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