Accessレポートで合計がエラーになる原因と直し方

概要

この記事の結論
Accessレポートの合計エラーは、集計欄の配置セクション、参照するフィールド名、元データの型、計算式の順に確認すると切り分けやすくなります。全体の合計はレポートフッター、分類ごとの小計はグループフッターが基本です。ページフッターへSumを置くだけではページ別合計になりません。この記事では名前の誤り、計算欄の参照、Null、結合による二重計上を分けて説明し、小さなデータで直ったことを確かめます。

この記事でわかること

  • 合計エラーは症状を分けて確認する
  • フィールド名とコントロール名を確認する
  • Nullとデータ型を整理する
  • ページ合計と累計の違いを理解する

この記事の主な内容

  1. 合計エラーは症状を分けて確認する
  2. 合計欄の配置場所を確認する
  3. フィールド名とコントロール名を確認する
  4. 明細の計算結果を集計する
  5. Nullとデータ型を整理する
  6. エラーが出ない二重計上を見つける
  7. ページ合計と累計の違いを理解する
  8. 小さなデータで検算してから本番へ反映する
  9. よくある質問

想定読了時間:約15分~20分


1. 合計エラーは症状を分けて確認する

Accessレポートの合計がうまく出ないときは、式を何度も書き換える前に症状を分けます。「#エラーなどが表示される」「パラメーターを求められる」「空欄になる」「数字は出るが金額が違う」では、確認する場所が異なります。まずレポートをコピーし、変更前の式と表示を記録してください。

基本の確認順序は、配置セクション、レコードソース、参照名、データ型、計算式です。エラーが消えても、対象外の行を集計していれば解決ではありません。元クエリの数行と期待する合計を用意し、式の結果を照合しながら原因を絞ります。

症状最初に確認すること避けたい対処
#エラーなどの表示集計欄の配置・式・参照先理由を確かめずNzで囲む
名前のエラーやパラメーター入力フィールド名・存在しない参照適当な値を入力して先へ進む
空欄になる対象データの有無・Null未入力をすべてゼロ扱いする
合計が多い・少ない抽出条件・結合・集計単位表示書式だけ変える
エラー表示、名前解決、空欄、金額不一致を区別する図

2. 合計欄の配置場所を確認する

全体の合計はレポートフッターへ置く

レポート全体の金額を求める基本は、レポートフッターへ非連結のテキストボックスを置き、コントロールソースに=Sum([金額])を指定する方法です。金額はレポートの元データに存在する数値または通貨のフィールド名とします。表題のラベルへ式を書いても計算欄にはなりません。

1. コピーしたレポートをデザインビューで開きます。

2. レポートヘッダー/フッターが非表示なら、デザイン画面のメニューなどから表示します。

3. レポートフッターにテキストボックスを配置し、値を表示する側を選択します。

4. F4でプロパティシートを開き、名前をtxt総合計、コントロールソースを=Sum([金額])にします。

5. 印刷プレビューで、明細の金額を手計算した値と比較します。

小計とページの領域を区別する

部署ごとの小計なら、部署でグループ化し、そのグループフッターに集計欄を置きます。同じ式でも配置場所で集計範囲が変わります。ページフッターはページ番号などを表示する領域であり、Sumを置くだけで印刷ページ内の金額を合計することはできません。

全体合計とグループ小計とページ領域を区別する図
必要な値基本の配置先対象範囲
全体の総合計レポートフッターレポートの対象レコード全体
部署別の小計部署のグループフッターその部署の対象レコード
ページ番号ページフッター現在の印刷ページ
ページ内の金額合計別途設計が必要用紙に載った明細だけ

3. フィールド名とコントロール名を確認する

元データの列と表示部品を分ける

フィールド名はテーブルやクエリの列の名前、コントロール名はレポート上の部品の名前です。たとえば元データが「金額」、明細を表示する部品が「txt金額」、全体の合計欄が「txt総合計」という構成にします。合計式は元の数値フィールドである金額を参照します。

対象名前の例設定する内容
元クエリの列金額数値または通貨の値
明細のテキストボックスtxt金額コントロールソース:金額
総合計のテキストボックスtxt総合計コントロールソース:=Sum([金額])

明細に表示された部品の名前を、そのままSumの引数へ入れればよいとは限りません。元クエリに存在しないtxt金額を集計しようとすると、名前を解決できない場合があります。レポートのレコードソースを開き、式の中の列名が実際にあるか確認してください。

名前の衝突や循環参照を避ける

計算欄の名前を金額にし、その欄の式でも[金額]を参照すると、意図する参照先が分かりにくくなります。計算欄にはtxt総合計など役割の分かる名前を付けます。名前を変更したときは、その部品を参照するほかの式やVBAも確認し、単独の欄だけで修正完了と判断しないでください。

元データの金額フィールドと明細表示欄と合計表示欄の関係図

4. 明細の計算結果を集計する

数量と単価の掛け算を合計する

明細欄に=[数量]*[単価]と書いて表示した金額を集計したい場合、計算テキストボックスの名前をSumへ渡す方法ではなく、元フィールドを使った式を集計します。数量と単価が元データの数値フィールドなら、次の式をレポートフッターで使う構成が考えられます。

=Sum([数量]*[単価])

ただし、この例は税・値引き・端数処理を含みません。明細欄だけに値引きや丸めを加え、合計欄で単純な掛け算を使うと、見えている明細と合計が一致しなくなります。実際に集計したい金額の定義を先に統一してください。

複雑な計算は元クエリへまとめる

クエリのデザインビューで、空いている列のフィールド行へ次の計算を追加し、Q_売上明細などとして保存します。元フィールドの名前は実際のテーブルに合わせて置き換えます。クエリを開き、各行の計算結果が正しいことを確認してからレポートに使います。

明細金額: [数量]*[単価]

レポートのレコードソースをそのクエリにし、明細のコントロールソースを明細金額、合計欄を=Sum([明細金額])にします。計算の定義をクエリへまとめると、明細・小計・総合計が同じ値を使う構成にしやすくなり、後から変更箇所を探す負担も減らせます。

元クエリで数量と単価から明細金額を作りレポートで集計する図

設定変更の影響範囲を判断できない場合は

共有データや既存の計算式まで影響する場合は、症状・対象画面・期待する結果を整理してAccessの教科書へご相談ください。データの持ち方と表示・集計の設定を分けて確認すると、必要な改修範囲を検討しやすくなります。


5. Nullとデータ型を整理する

未入力とゼロを同じ意味にしない

Nullは値が未入力などで存在しない状態です。数値の0や空の文字列とは異なります。SumはNullの値を集計から除きます。また、数量か単価がNullなら、その掛け算も通常はNullになります。未入力の価格を0円として確定してよいかは、式ではなく業務上の判断が必要です。

合計結果がNullの場合に表示を0へ変える目的なら、次の式を検討します。ただし、#エラーや名前の誤りを修復する式ではありません。元の式が正しく計算できることを先に確認し、0件のレポートやサブレポートは別に動作を確認してください。

=Nz(Sum([金額]),0)

数字に見える文字列を確認する

CSVなどから取り込んだ「1,200円」が短いテキスト型になっていると、数値として集計する設計に向きません。まずテーブルと元クエリで型を確認し、金額は通貨型など適切な型へ整えます。表示書式を通貨へ変えるだけでは、保存されている文字列の型は変わりません。

型を変更する前にバックアップを取り、変換できない文字、空欄、全角数字などを検査します。式に変換関数を追加して一時的に通すだけでは、異なる文字が入った行で再発することがあります。未入力を検出する一覧と金額集計を分けると、入力漏れを合計の中へ隠さずに済みます。

未入力、ゼロ、式の不具合を別々に扱う図

6. エラーが出ない二重計上を見つける

結合後に親の金額が繰り返されていないか

請求ヘッダーに総額1,000円があり、明細が2件あるとします。両者を結合したクエリでは、請求総額1,000円が2行へ繰り返されることがあります。その列をSumすると2,000円になります。式が正常に動いていても、集計する単位が違うため金額が増えてしまう例です。

請求ID明細結合後の請求総額
1001商品A1,000
1001商品B1,000
この列をそのまま合計誤った集計2,000

修正では、請求総額を請求ヘッダーだけで集計する、請求ID単位に集計したクエリを作る、明細金額を積み上げるなど、必要な値に応じた構成を選びます。重複非表示で同じ金額を見えなくしても、元クエリの行数は変わらないため二重計上は直りません。

同じ金額だから削除してよいとは限らない

異なる請求が同じ金額になることもあります。金額だけを重複排除すると、本来必要な請求まで消えるおそれがあります。請求IDや明細IDといった一意の識別子を使い、どの単位を1回ずつ合計するのかを確認してください。名称や金額の一致だけで重複と判断しないことが大切です。

1件の請求総額が複数明細へ繰り返される危険を示す図

7. ページ合計と累計の違いを理解する

総合計は対象全体、小計はグループ内、累計は現在の行まで足し上げた値です。AccessのテキストボックスにはRunningSum(集計実行)プロパティがあり、グループまたはレポート全体での累計に使います。印刷ページごとにゼロへ戻す指定と同じではありません。

種類求めたい値基本の考え方
総合計対象全体の合計レポートフッターでSum
小計部署などのまとまりの合計グループフッターでSum
累計現在の行までの積み上げRunningSumで範囲を指定
ページ合計そのページに印刷した明細の合計改ページと印刷処理を含めて設計

ページ合計は印刷条件まで検証する

1行の高さが伸びると、同じレコードでも載るページが変わります。ページ合計をVBAなどで実装する場合は、印刷時の再書式設定やプレビューの行き戻りによる重複加算を考慮する必要があります。固定行数で単純に分ける方法が、長文を含む帳票にも使えるとは限りません。

DSumに置き換える前に対象範囲を確認する

DSumは指定したテーブルやクエリと条件を基に集計します。レポートにかけたフィルターが自動で同じ条件として渡るわけではありません。表示中の明細を合計する目的なら、まずレポートのレコードソースとSumの構成を見直します。DSumを使う場合は、対象期間や部署などの条件を一致させて検算してください。

対象範囲と値の増え方の違いを比較する図

8. 小さなデータで検算してから本番へ反映する

修正後は、正しい結果を手計算できる少数データで確認します。たとえば部署Aの金額が200と300、部署Bが500なら、小計はAが500、Bが500、総合計は1,000です。まずこの3行で配置と式を確かめ、その後に空欄や結合を含む条件を追加します。

確認ケース期待する結果・確認点
200・300・500の3行総合計1,000
部署Aだけを対象にする小計・総合計とも500
金額Nullの行を追加合計対象と未入力の扱いが業務ルールどおり
同じ請求IDに明細を追加親の総額が重複加算されない
対象が0件になる0表示・該当なし・印刷中止の方針どおり
明細が複数ページになる小計・総合計の範囲が変わらない

0件の場合は、0を載せた用紙が必要なのか、該当データなしと案内して印刷を中止するのかを決めます。印刷中止にはレポートのNoDataイベントを使う方法がありますが、サブレポートには同じイベントが発生しません。サブレポートはHasDataなどを使う別の確認が必要です。

合計エラーは配置・参照・型・式の順に切り分け、数字が出た後は対象範囲と重複を検算します。検証で使った条件と期待値を残し、複製した本番データでも確認してから反映しましょう。エラーを消すことと、業務で使える正しい合計にすることを両方満たすのが完了条件です。

小件数、分類別、空欄、絞り込み、印刷結果の確認図

よくある質問

ページフッターは、ページ番号や出力日などを表示するための領域です。そこへSumを置くだけでは、そのページに載ったレコードの合計を求められません。全体の総合計ならレポートフッターへ、部署などの小計ならグループフッターへ移してください。ページごとの金額が必要な場合は、改ページと印刷処理を含めた別の設計が必要です。まず何を合計したいのかを明確にし、3行程度のデータで配置先と期待する結果を照合しましょう。

計算欄の名前をそのままSumへ指定する方法は基本にしないでください。Sumでは元データのフィールドや、それらを使った式を集計します。明細が数量×単価なら=Sum([数量]*[単価])とするか、元クエリで明細金額を作り=Sum([明細金額])とします。値引きや端数処理がある場合は、明細と合計で計算の定義をそろえることが大切です。画面に表示する部品の名前と、元クエリの列名を区別して確認してください。

直りません。NzはNullを指定した値へ置き換える関数で、存在しないフィールド名や誤った集計場所、計算式の不具合を修正するものではありません。=Nz(Sum([金額]),0)は、合計結果がNullの場合に0を表示する目的で使います。先にSum単体が正しく計算できることを確認してください。また、単価が未入力なのに0として集計すると入力漏れを隠すおそれがあります。未入力と0円が同じ意味かも業務上で決めましょう。

結合したクエリで同じ金額が複数行へ繰り返されている可能性があります。たとえば請求ヘッダーの総額が明細2件へ繰り返され、その列をSumすると2回分が加算されます。元クエリを開き、請求IDや明細IDごとの行数を確認してください。重複非表示は見た目を隠すだけなので、集計対象の重複を解消しません。請求単位で集計するクエリと明細表示を分けるなど、1回ずつ足したい単位に合わせてレコードソースを整えます。

レポートのグループ化と並べ替えで部署などの項目をグループにし、そのグループフッターを表示します。そこへテキストボックスを置き、=Sum([金額])を設定すると、そのグループの対象レコードを集計できます。全体の総合計は別の欄をレポートフッターに置きます。同じ式でも配置先で範囲が変わるため、部署が2つ以上ある少数データで確認してください。名称が同じ別部署をまとめないよう、必要なら部署IDをグループの基準にします。

まず、合計結果がNullなのか、レポート自体に対象レコードがないのかを分けて確認します。Nullを0にする式として=Nz(Sum([金額]),0)がありますが、0件のレポートやサブレポートすべての表示を保証するものではありません。0件でも用紙が必要か、該当なしを案内して印刷を中止するかを決めます。メインレポートではNoDataイベント、サブレポートではHasDataなどの確認を使い、実際の印刷プレビューで検証してください。

DSumは指定したテーブルやクエリと抽出条件を基に計算するため、レポートで見えている明細と対象範囲が異なる場合があります。レポートのフィルターがDSumへ自動的に引き継がれると考えないでください。表示中のレコードの合計が目的なら、レポートの元データをSumで集計する構成を先に確認します。DSumを使う必要がある場合は、期間、部署、状態などの条件をそろえます。対象IDと件数も比較すると、範囲の違いを発見しやすくなります。

設定変更の影響範囲を判断できない場合は

共有データや既存の計算式まで影響する場合は、症状・対象画面・期待する結果を整理してAccessの教科書へご相談ください。データの持ち方と表示・集計の設定を分けて確認すると、必要な改修範囲を検討しやすくなります。


関連記事

Accessのレポートとは

Accessのプロパティシートの使い方

Accessのコントロールソースとは

Accessのクエリとは

参考情報

Microsoft レポート内の集計
https://support.microsoft.com/en-us/access/summing-in-reports

Microsoft 基本レポートの作成とセクション
https://support.microsoft.com/en-us/access/create-a-simple-report

Microsoft RunningSumプロパティ
https://learn.microsoft.com/en-us/office/vba/api/access.textbox.runningsum

Microsoft Sum関数
https://support.microsoft.com/en-us/access/functions/sum-function

Microsoft Nzメソッド
https://learn.microsoft.com/en-us/office/vba/api/access.application.nz

Microsoft DSumメソッド
https://learn.microsoft.com/en-us/office/vba/api/access.application.dsum

Microsoft NoDataイベント
https://learn.microsoft.com/en-us/office/vba/api/access.report.nodata

Microsoft HasDataプロパティ
https://learn.microsoft.com/en-us/office/vba/api/access.report.hasdata

TOP