フォームでSum関数の結果が「#エラー」になる原因

 フォームフッターにSum関数を置いて数値を集計しようとしたら「#エラー」になった、という例があります。
 たいていの原因は「レコードソース(テーブル、クエリ)に存在しないフィールドを集計しようとした」というものですが、以下ではその様子と対策について見てみます。

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

 まず、フォームのレコードソースとしてこのようなテーブルを用いるものとします。


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

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


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

 フォームビューではエラー表示になってしまいます。

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


f:id:accs2014:20180714184832p:plain:right:w600

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


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

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


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

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