日々変動する出庫表から、各店舗のチルド・冷凍個数を固定書式のシートへ反映させたい場合、関数だけではセル番地が固定されていないため対応が難しいことがあります。この記事では、VBAマクロを使って柔軟にデータを抽出する方法を解説します。
問題の整理
・シート1の店舗コードや数量、商品数は日々変動する。
・チルド個数、冷凍個数のセル位置は固定されていない。
・シート2は書式が固定され、数式では直接セル参照が困難。
このような状況では、セル位置に依存せず、条件(店舗コードと種別)で抽出できるマクロが有効です。
VBAマクロでのアプローチ
基本的な流れは以下の通りです。
- シート1の最終行・最終列を自動検出
- 各行の店舗コードを確認
- 種別(チルド・冷凍)を確認して合計する
- シート2の対応セルに転記する
この方法により、行数や列数が変動しても自動で集計可能です。
サンプルコード例
以下は簡易的なVBAコード例です。店舗コードをキーにしてチルド・冷凍の個数を集計し、シート2に出力します。
Sub 集計して転記()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim lastRow As Long, lastCol As Long
Dim r As Long, c As Long
Dim 店コード As String
Dim チルド合計 As Long, 冷凍合計 As Long
Set ws1 = Worksheets("シート1")
Set ws2 = Worksheets("シート2")
lastRow = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
lastCol = ws1.Cells(6, ws1.Columns.Count).End(xlToLeft).Column '店舗コード行
For r = 7 To lastRow '商品行開始
For c = 7 To lastCol
店コード = ws1.Cells(6, c).Value
If ws1.Cells(r, c).Value <> "" Then
If ws1.Cells(r, 1).Value = "チルド" Then
チルド合計 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1
ws2.Cells(チルド合計, c - 6).Value = ws1.Cells(r, c).Value
ElseIf ws1.Cells(r, 1).Value = "冷凍" Then
冷凍合計 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1
ws2.Cells(冷凍合計, c - 6).Value = ws1.Cells(r, c).Value
End If
End If
Next c
Next r
End Sub
ポイントと応用
・商品行が増えても自動で最終行を検出するため、毎日の変動に対応可能。
・店舗コードの位置が変動する場合は列を名前で検索するなど応用可能。
・種別(チルド・冷凍)の判定を文字列やコードで統一しておくと正確に集計できます。
まとめ
Excelでセル位置が固定されない場合、通常の関数では対応が難しいですが、VBAマクロを使えば可変行・可変列に対応してチルド・冷凍個数をシート2に自動転記できます。これにより手入力のミスを減らし、業務効率を大幅に向上させることが可能です。

コメント