レポートでSum関数の結果が「#エラー」等になる原因

 レポートのフッターにSum関数を置いて値を集計しようとしたら「#エラー」になったとか何も表示されないという場合の、よくある原因とその対応について見てみます。

f:id:accs2014:20180714184649p:plain:right:w550

 なお、レポートのレコードソースとしてこのようなテーブルを用いるものとします。



レコードソースに存在しないフィールドを集計した

f:id:accs2014:20180714184646p:plain:right:w650

 上記のテーブルをレコードソースとするフォームを作ります。
 日付によりグループ化し、グループフッターを設けます。そして詳細セクションには各フィールド(の連結コントロールであるテキストボックス)を貼り付けます。各レコードには単価と数量が記録されていますが、その積(つまりレコードごとの金額)は記録されていませんので、ここで新たなテキストボックスを作り、コントロールソースを「=[単価]*[数量]」、名前を「金額」とします。
 そして、日付ごとの合計を求めるべく、グループフッターにテキストボックスを置き、コントロールソースを「=Sum([金額])」とします。
 これで合計が表示されそうですが…


f:id:accs2014:20180714184643p:plain:right:w500

 印刷プレビューで開こうとするとパラメータの入力を求められます;-A-)


f:id:accs2014:20180714184740p:plain:right:w500

 何も入力せず進むとコントロールは空になります。
 ちなみに何か数値を入力してから進むと「入力した数値×レコード数」にあたる数値が表示されます。

 ※各コントロールのラベルをつけ忘れましたスミマセン:-o-)


f:id:accs2014:20180714184640p:plain:right:w500

 対策は、レポート上で作成したコントロールを集計の対象とせず、レコードソースつまりテーブルに存在するフィールドを集計の対象とすることです。
 Sum関数の式を「=Sum([単価]*[数量])」に直してみます。


f:id:accs2014:20180714184637p:plain:right:w500

 するとエラーにはならず、きちんと合計が表示されます。


 なお、どうしても「金額」列として集計したい場合には以下のような対策もあります。ご参考まで。

  • クエリを作って「金額」列を設け、そのクエリをレコードソースにする
     単純ですが、そのためだけにオブジェクトが1つ増えてしまうのが気になるところです。
  • レコードソースに手入力、またはレコードソースのクエリビルダを起動し、レコードソースに「金額」列を設ける
     一例としてレコードソースを「SELECT 物品購入記録テーブル.*, [単価]*[数量] AS 金額 FROM 物品購入記録テーブル; 」とします。新たにクエリを作るのと違ってオブジェクトが増えないためこちらの方がスマートです。


関数をページフッターに置いた

f:id:accs2014:20180714184736p:plain:right:w500

 さて、Sum関数を置くフッターには3つの種類があります。グループフッター、ページフッター、レポートフッターです。
 これらのすべてにSum関数を置いて、数値を集計してみます。


f:id:accs2014:20180714184733p:plain:right:w500

 印刷プレビューです。
 グループフッター、レポートフッターはきちんと値を返しますが、ページフッターだけが「#エラー」となります。このようにページフッターでは値の集計はできず、エラーとなります。


 これは仕様なので仕方ありません。ページフッターだと集計の範囲がわかりにくいのでこうなるのが適切かとは思いますが、どうしても表示させたい場合は通常VBAで対応することとなります。
 また、グループ計やページ計をページフッターに表示させたい場合については、次の記事に示すような方法もあります。ちょっとややこしい内容ですが参考まで。

www.accessdbstudy.net

www.accessdbstudy.net