この記事でわかること
- 入出庫データから商品ごとの在庫数をDictionaryで自動計算できる
- 棚卸表シートに在庫一覧を自動生成できる
- 商品マスタ連携・在庫アラート・月次棚卸レポート・差異ハイライトまで実務で使える形に仕上がる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 入出庫データから商品ごとの在庫数を自動計算して棚卸表を作りたいとき
- 安全在庫を下回った商品を自動でアラート表示して発注漏れを防ぎたいとき
- 実棚数量と帳簿在庫の差異を自動計算して棚卸の突合せを効率化したいとき
- 月次の在庫レポートをワンクリックで生成して報告資料に使いたいとき
完成イメージ(Before / After)
Before(手作業):
- 入出庫伝票を1件ずつ確認して商品ごとの入庫数・出庫数を電卓で集計
- 集計結果をExcelの在庫一覧シートに手入力
- 棚卸時に実在庫との差異を目視で確認
After(VBAで自動化):
- ボタンを押す(またはAlt+F8で実行)
- 入出庫データから商品ごとの在庫数を自動計算
- 棚卸表シートに一覧生成+在庫アラート+差異ハイライトまで自動
所要時間: コピペ → 実行まで約10分
—
自分も以前、月末の棚卸のたびに入出庫伝票を1件ずつExcelで集計していた。商品が100種類を超えると集計だけで半日かかるし、転記ミスで帳簿在庫と実在庫が合わないことが毎月あった。正直しんどかった。VBAで入出庫データから在庫数を自動計算するようにしてからは、棚卸の集計作業が5分で終わるようになった。この記事で、同じ苦労をしている人がサクッと自動化できればうれしい。
入出庫データから商品別の在庫数を自動計算し、棚卸表を1クリックで生成する。
Dictionaryを使った集計の基本は Dictionaryで重複チェック・集計を高速化する方法 で解説している。集計ロジックに不安がある人は先にそちらを読むとスムーズに進められる。
—
実行前の準備
バックアップを取る
実務版コードは棚卸表シートにデータを書き込む(前回データは上書き)。必ずファイルのコピーを別フォルダに保存してから実行する。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
シート構成
シート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(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
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_CODE 〜 COL_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段階で進められる
- 商品マスタシートは任意。なくても集計は動く
- 実棚数量を入力すると差異・ステータスが自動計算されるので、棚卸時の突合せ作業が大幅に楽になる
関連記事
- Dictionaryで重複チェック・集計を高速化する方法 — Dictionary集計の基本を押さえたい場合に
- Excelで発注書・在庫管理を自動化する方法 — 棚卸結果から発注書の自動作成まで連携したい場合に
- オートフィルタでデータを絞り込み・解除する方法 — 期間や商品で絞り込んでから集計したい場合に
- データを複数条件で自動並び替えする方法 — 棚卸表をカテゴリ順・商品コード順に並べたい場合に
- 配列を使ってVBAの処理速度を10倍にする方法 — 大量データの集計をさらに高速化したい場合に
—
次にやりたくなること
- Excelで発注書・在庫管理を自動化する方法: 棚卸結果から安全在庫を下回った商品の発注書を自動で作りたい場合に
- 複数条件でデータを抽出してまとめる方法: 棚卸表から差異ありの商品だけを抽出して別シートにまとめたい場合に
- Dictionaryで重複チェック・集計を高速化する方法: Dictionary集計の基本をしっかり理解して応用力を付けたい場合に
- 配列を使ってVBAの処理速度を10倍にする方法: 入出庫データが数万行ある場合に集計を高速化したい場合に
- データを複数条件で自動並び替えする方法: 棚卸表をカテゴリ順・商品コード順に並べて見やすくしたい場合に
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VBAで入出庫データから在庫数を自動計算するには?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Dictionaryオブジェクトを使い、商品コードをキーにして入庫数と出庫数を集計します。帳簿在庫は「入庫合計 - 出庫合計」で算出します。"
}
},
{
"@type": "Question",
"name": "VBAで棚卸表の実在庫との差異を自動でハイライトできる?",
"acceptedAnswer": {
"@type": "Answer",
"text": "条件付き書式をVBAで設定し、差異列が0以外の場合に自動で色を変えることができます。FormatConditions.Addメソッドを使います。"
}
},
{
"@type": "Question",
"name": "VBAの在庫集計で商品マスタがなくても動く?",
"acceptedAnswer": {
"@type": "Answer",
"text": "商品マスタシートがなくても入出庫データだけで在庫集計は動作します。マスタがある場合はカテゴリ・保管場所・安全在庫の情報が棚卸表に追加されます。"
}
},
{
"@type": "Question",
"name": "VBAで在庫アラート(安全在庫割れ)を自動表示するには?",
"acceptedAnswer": {
"@type": "Answer",
"text": "商品マスタに安全在庫数を設定し、帳簿在庫が安全在庫を下回った行をInterior.Colorで赤くハイライトします。集計時にIf文で比較するだけで実装できます。"
}
},
{
"@type": "Question",
"name": "VBAの在庫集計で1万行以上のデータでも速い?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Dictionaryによる集計は高速で、1万行程度なら数秒で完了します。さらに速くしたい場合はデータを配列に一括読み込みしてからループ処理にすると効果的です。"
}
}
]
}


コメント