概要
| この記事の結論 Accessでは、クロス集計クエリをレポートのレコードソースに設定すると、商品別・月別などの集計結果を帳票にできます。先に列名と列数を固定しておくと、売上のない月に列が消える問題を防げます。ただし、クエリに新しい列が増えてもレポートの部品は自動で増えません。この記事ではウィザードでの作成、合計と空欄の処理、期間指定、印刷確認まで説明します。 |
この記事でわかること
- レポート作成前にクロス集計の列を固定する
- レポートウィザードで帳票を作成する
- レコードソースと表示部品を確認する
- 空欄と月別合計 年間合計を整える
- 期間指定と列追加に対応する
この記事の主な内容
- レポート作成前にクロス集計の列を固定する
- レポートウィザードで帳票を作成する
- レコードソースと表示部品を確認する
- 空欄と月別合計 年間合計を整える
- 期間指定と列追加に対応する
- 印刷とエラーを確認して運用する
- よくある質問
想定読了時間:約12分~15分
レポート作成前にクロス集計の列を固定する
クロス集計からレポートを作るときは、先にクエリの列名と列数を固定します。レポートのテキストボックスは特定のフィールドを参照するため、データの有無で列が消える構成では表示が不安定になります。商品別・月別の売上帳票なら、商品を行、1~12月を固定列にする形から始めると整理しやすくなります。
本記事では、[T_売上]に商品コード、商品名、売上日、売上金額がある例を使います。商品コードと商品名は短いテキスト、売上日は日付/時刻、売上金額は通貨型を想定します。元明細を集計するクロス集計クエリと、見た目を整えるレポートの二段階に分け、数字が違うときも確認場所を絞れるようにします。

12か月の列を持つクエリを用意する
次のSQLで[Q_商品月別クロス]を作成します。対象は2026年1月1日以上、2027年1月1日未満です。PIVOTのIN句で1~12を指定しているため、売上がない月も列として用意できます。月番号だけでは年を区別できないので、WHEREによる期間の限定を省かないでください。
TRANSFORM Sum([売上金額]) AS [金額合計]
SELECT [商品コード], [商品名],
Sum([売上金額]) AS [年間合計]
FROM [T_売上]
WHERE [売上日] >= DateSerial(2026,1,1)
AND [売上日] < DateSerial(2027,1,1)
GROUP BY [商品コード], [商品名]
PIVOT Month([売上日]) IN (1,2,3,4,5,6,7,8,9,10,11,12);
デザインビューで設定する場合は、クエリ全体のプロパティ[列見出し]へ1~12を入力します。列名は「1」「2」などになりますが、レポートのラベルは「1月」「2月」と表示できます。内部の参照名と読者に見せる見出しを分けることで、翌年も同じ列名を使い、期間条件を変更する設計にできます。
このクエリの[年間合計]は、商品ごとに対象期間の全売上を合計した値です。今回のように全12か月を表示する場合は、月別列の合計と照合できます。特定の地域などを固定列にし、指定外の分類が存在する場合は、表示列の合計と行全体の合計が一致しないこともあります。合計の範囲を名前と説明で明確にします。

レポートウィザードで帳票を作成する
クエリを開いて数値が正しいことを確認したら、レポートウィザードを使います。ここで選ぶのは元の売上テーブルではなく、保存したクロス集計クエリです。クエリがエラーになる状態のままレポートを作ると、集計の問題と帳票の問題が重なります。まず集計単体で正常に開ける状態にしてください。
| 手順 | 操作 | 設定例 |
|---|---|---|
| 1 | [作成]→[レポートウィザード] | 集計元の選択画面へ進む |
| 2 | テーブル/クエリを選ぶ | Q_商品月別クロス |
| 3 | 表示するフィールドを選ぶ | 商品コード・商品名・1~12・年間合計 |
| 4 | グループ化と並べ替えを設定 | 商品コードの昇順 |
| 5 | レイアウトと向きを設定 | 表形式、横向きを起点に調整 |
| 6 | 名前を付けて保存 | R_商品別月次売上 |
商品ごとに一行の帳票でよいなら、不要なグループ階層を増やす必要はありません。ウィザードで選べるレイアウト名や画面構成はAccessのバージョンで異なる場合があります。完成後は印刷プレビューを開き、商品名、月別金額、年間合計が同じ行に並んでいるか、ページの右端へはみ出していないかを確認します。
12か月と商品名、年間合計を一枚へ詰め込むと、文字が小さくなることがあります。横向きにしただけで解決しない場合は、商品名の幅、金額の桁数、用紙サイズを順に見直します。文字を極端に縮める前に、上期・下期に分けた帳票にする、必要な月だけを別帳票で表示するなど、読む人の使い方から判断しましょう。

レコードソースと表示部品を確認する
レポート全体の[レコードソース]は、どのテーブルやクエリからデータを読むかを指定します。一方、各テキストボックスの[コントロールソース]は、どのフィールドや式を表示するかを指定します。「月の数字が出ない」ときは、二つの設定を分けて確認すると、誤った箇所を見つけやすくなります。
| 対象 | プロパティ | この例の値 |
|---|---|---|
| レポート全体 | レコードソース | Q_商品月別クロス |
| 1月のテキストボックス | 名前 | txtM01 |
| 1月のテキストボックス | コントロールソース | [1] |
| 1月のラベル | 標題 | 1月 |
| 年間合計のテキストボックス | コントロールソース | [年間合計] |
ラベルを変えても参照する値は変わらない
ラベルの「1月」を「4月」へ書き換えても、テキストボックスの参照先が[1]のままなら表示するのは1月の金額です。年度順へ並べ替える場合は、ラベルとコントロールソースを必ずセットで変更します。部品をコピーしたときも、見た目だけでなくプロパティを開いて参照先を確認してください。
部品名をtxtM01、txtM02などにそろえると、式の参照や保守が分かりやすくなります。フィールド名と同じ名前の計算用部品を増やすと、どちらを参照しているかが曖昧になることがあります。また、[1]のような数字だけのフィールド名は角括弧付きで扱い、数値定数の1と区別することが重要です。

レポート側で並べ替えを設定する
クエリで商品コード順に見えていても、レポートの行順はレポート側の[グループ化、並べ替え、集計]で明示します。設定が残っていると、クエリで期待した順番と異なることがあります。商品コードの昇順など、帳票として必要な順序を登録し、似た名前の商品やコードの桁数が違う例でも確認します。
クロス集計レポートと月次帳票の改善で迷ったときは
まずは記事の手順で対象と結果を確認しましょう。既存の処理との関係が分からない、変更の影響を判断できない場合は、現在のテーブル・クエリ構成と困っている点を整理して、Accessの教科書へご相談ください。
空欄と月別合計 年間合計を整える
月別帳票では、商品ごとの年間合計と、全商品の月別合計を区別します。前者は横方向に一行を合計する値、後者は縦方向に複数の商品を合計する値です。どこへ部品を置くかによって集計範囲も変わるため、詳細、グループフッター、レポートフッターの役割を先に整理しておきましょう。
| 表示したい内容 | 配置する場所の例 | コントロールソースの例 |
|---|---|---|
| 商品ごとの1月売上 | 詳細 | =Nz([1],0) |
| 商品ごとの年間合計 | 詳細 | =Nz([年間合計],0) |
| 全商品の1月合計 | レポートフッター | =Sum(Nz([1],0)) |
| 全商品の年間合計 | レポートフッター | =Sum(Nz([年間合計],0)) |
空欄を0へ変換する範囲を決める
NzはNullを指定した値へ置き換えます。取引がない月を0として表示するなら、=Nz([1],0)のように第二引数の0を明示します。ただし、金額の未入力を0に見せると入力不備が隠れます。帳票上の0表示を設定する前に、売上金額のNullを元明細で確認し、「取引なし」と「値が不明」を区別してください。
[1]+[2]のような横方向の加算では、一方がNullだと結果もNullになります。四半期合計などを部品で計算するなら、=Nz([1],0)+Nz([2],0)+Nz([3],0)のように各項目を変換します。12か月の年間合計は、前述のクエリで作った[年間合計]を使うと、レポート側の長い式を減らせます。
フッターの位置で集計範囲を確認する
レポート全体の合計はレポートフッターへ置きます。グループフッターに同じSum式を置くと、原則としてそのグループの集計になります。ページフッターへ置くだけで自動的にページごとの合計になると考えないでください。ページ合計は別の設計が必要になるため、今回の例では全体合計に範囲を絞っています。
テキストボックスの名前を合計式へ入れるより、レコードソースのフィールドを参照すると式の関係を追いやすくなります。桁区切り、小数点以下の桁、負数の表示も統一してください。表示上の丸めと元データの計算は別なので、丸めた数字を手で足した値と総額に差が出る場合は、帳票の丸め方を明記します。

期間指定と列追加に対応する
毎年同じ月別帳票を使うなら、列名を1~12のままにし、集計期間と帳票タイトルを変更する構成にすると保守しやすくなります。2026年の帳票を2027年へ切り替えるときは、クエリの開始・終了条件と、レポートに表示する対象年の両方を更新します。タイトルだけ変更して数字が前年のままにならないよう、年境界の明細で確認します。
入力した期間で出力する場合
期間を入力できるようにするなら、クロス集計の先頭でパラメーターを宣言します。次は変更箇所を示す抜粋です。PARAMETERSはTRANSFORMの前へ置き、元のWHEREを下の条件に置き換えます。[p終了翌日]は集計対象の最終日の翌日です。期間全体が一年になる場合だけ、[年間合計]という名称が内容に一致します。
PARAMETERS [p開始日] DateTime, [p終了翌日] DateTime;
WHERE [売上日] >= [p開始日]
AND [売上日] < [p終了翌日]
フォーム上の開始日・終了日を参照する運用では、そのフォームを開いたままレポートを実行し、参照名と日付型を宣言します。入力必須、開始と終了の前後関係、対象年の範囲を確認してから帳票を開く流れにします。フォーム参照式が認識されない場合は、名前の誤記とフォームが閉じていないかを確認してください。
クエリに列を足しても帳票部品は増えない
クエリへ新しい分類を追加しても、レポートにラベルやテキストボックスが自動追加されるわけではありません。例えば地域別の帳票へ「海外」列を増やしたら、その列を参照する部品を追加し、見出し・合計・印刷幅も確認します。元クエリの列とレポート部品の対応表を残すと、変更漏れを防ぎやすくなります。
列の種類が頻繁に増減する場合は、固定した横長レポートが本当に適切かを考えます。変動する商品を行側へ移す、カテゴリごとに帳票を分ける、Excelで分析するなどの方法もあります。動的な列に対応するレポートは追加の設計やコードが必要になり、ウィザードだけで毎回自動調整されるものではありません。

対象が0件のときの振る舞いも決める
対象期間にデータがない場合は、何も印刷しない、対象なしと表示する、全商品を0で出す、という異なる要件があります。0表示の式を入れるだけでは、存在しない商品行は作られません。全商品を出すなら商品マスターと集計結果の外部結合などを検討し、通常のデータあり月とは別に確認してください。

印刷とエラーを確認して運用する
最後は実際の出力条件で確認します。レポートビューで見えていても、印刷プレビューでは右側が次ページへ送られたり、長い商品名が切れたりすることがあります。用紙サイズ・向き・左右余白・レポート幅をそろえ、PDFへ出した結果も確認します。共有先のPCやプリンターが違う場合は、その環境でも一度確認しましょう。
| 症状 | 確認する場所 | 対処の例 |
|---|---|---|
| 月名の入力を求められる | クエリ列と部品の参照名 | 列固定と誤記を点検 |
| 合計が空欄 | Nullを含む加算式 | 各項目のNzまたは集計済みフィールド |
| 列が表示されない | 部品の有無・コントロールソース | 必要な部品を追加 |
| 右側に余分なページが出る | 幅・余白・右端の罫線 | 印刷可能幅に収める |
| 順番が違う | レポートの並べ替え | 明示的なソートを設定 |
| 0件なのに以前の数値に見える | 期間条件・タイトル・出力ファイル | 対象期間と保存名を確認 |
一つのセルから総額まで確認する
商品Aの1月が元明細の合計と一致するか、次に商品Aの年間合計、最後に全商品の年間合計を照合します。売上のない月、負数の返品、長い商品名、最大桁数の金額、対象0件のケースを含めてください。レポートで正しく表示されても、元の結合で明細が重複していると総額は誤るため、クエリ段階の確認も残します。
運用では、対象期間、出力日時、帳票名をレポートへ表示すると取り違えを減らせます。PDF名にも対象年や月を含め、再出力したときの保存先を決めておきます。列追加や条件変更を行ったら、クエリ名・部品名・合計式・用紙設定の変更内容を記録します。担当者が交代しても同じ結果を再現できることが完成の目安です。

まとめ
クロス集計レポートは、列を固定してからウィザードで作り、レコードソースと各部品の参照先を確認すると安定します。月別合計と年間合計、Nullと0、期間条件と帳票タイトルをそれぞれ対応させてください。列追加時は部品の追加も必要です。最後に元明細との数値照合、0件時の動作、実際の用紙幅を確認し、繰り返し使える帳票へ仕上げましょう。
よくある質問
レポートの部品は、クエリの列が増えても自動では増えません。レポートのデザインビューで、新しい列を参照するテキストボックスと見出しラベルを追加してください。既存部品をコピーした場合は、コントロールソースがコピー元のままになっていないか確認します。部品を足した後は、行合計や総額に新しい列が含まれるか、印刷幅からはみ出さないかも点検します。元クエリと部品の対応表を残すと変更漏れを防げます。
列を固定していないクロス集計では、対象データがない月の列が存在しないことがあります。レポートがその列を参照すると、入力要求などの問題につながります。まずクエリ単体で列名を確認し、列見出しまたはPIVOT IN句で必要な月を固定してください。ただし、入力要求はフィールド名の誤記や閉じたフォームへの参照でも起こります。表示された名前を手がかりに原因を分け、求められるまま金額を入力して済ませないようにします。
帳票の行順は、レポート側のグループ化と並べ替えで設定します。クエリを開いたときの表示順だけに依存せず、商品コードの昇順など必要な条件を明示してください。既存のグループ化や別の並べ替えが残っていないかも確認します。また、月の左右順は部品の配置と参照先の問題であり、商品の縦方向の並べ替えとは異なります。行順を直すのか列の配置を直すのかを分け、印刷プレビューで最終的な並びを確認しましょう。
横方向に[1]+[2]のように足している場合、一方がNullだと式の結果もNullになることがあります。取引がない月を0として扱ってよいなら、Nz([1],0)+Nz([2],0)のように各項目を変換します。全商品を合計する場合は、適切なフッターにSum式を置き、レコードソースのフィールドを参照してください。ただし、元の金額未入力まで0にして隠さないことが大切です。表示式の問題と入力データの不備を分けて確認します。
用紙の横向き、左右余白、商品名と金額欄の幅を順に確認してください。レポート幅だけでなく、右端へはみ出した罫線やラベルが余分なページの原因になることもあります。それでも読める文字サイズを保てない場合は、上期・下期に分ける、大きい用紙を使う、項目を行へ移すなどレイアウトを見直します。画面で見える状態と印刷可能な状態は別です。使用するプリンターやPDFで、全ページと最大桁数の金額を確認しましょう。
クエリとしては商品を列にできますが、定型レポートは列の増減に合わせて部品を自動配置する仕組みではありません。商品が頻繁に変わるなら、商品を行へ置き、月などの固定した分類を列にする方が管理しやすい場合があります。どうしても変動列が必要なら、表示できる列数や折り返し方法、動的な参照先を設計する必要があります。毎回手作業で直す負担も含めて、固定帳票・縦長帳票・Excel分析のどれが目的に合うかを選びます。
運用上、印刷しないのか、対象なしと表示するのか、全商品を0で出すのかを決めます。いずれも同じ動作ではありません。Nzは既存の値を0へ置き換える関数なので、0件で存在しない行まで作ることはできません。全商品を表示するなら商品マスターを基準にした結合などが必要です。帳票のNoDataイベントを利用して出力を中止する設計も考えられます。対象なしの期間を実際に指定し、表示と保存ファイルの扱いを確認してください。
関連記事
クロス集計レポートと月次帳票の改善で迷ったときは
まずは記事の手順で対象と結果を確認しましょう。既存の処理との関係が分からない、変更の影響を判断できない場合は、現在のテーブル・クエリ構成と困っている点を整理して、Accessの教科書へご相談ください。
参考情報
クロス集計をレポートで使う
https://www.microsoft.com/en-us/microsoft-365/blog/2012/05/23/using-crosstab-queries-in-reports
レポートの作成
https://support.microsoft.com/en-us/access/create-a-simple-report
Report.RecordSource
https://learn.microsoft.com/en-us/office/vba/api/access.report.recordsource
Nz関数
https://learn.microsoft.com/en-us/office/vba/api/access.application.nz