ACCESS DSumとSumの使い分け

DsumとSumの使い分け

ACCESSにはいくつかの関数がありますが、特によく利用するのは集計を行う関数でしょう。

集計を行う関数には、DSum関数とSum関数があります。

今回はこの2つの関数の使い分けについてご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSをもっと使いこなしたい方向けにACCESSの関数をご紹介していきます。

DSum関数とSum関数の違い

DSumとSumは同じく集計値を計算する関数ですが、いくつか違いがあります。
違いを以下にまとめてみました。

上記のように、DSumとSumはどちらも集計を行いますが、その集計対象や自由度が異なります。

基本的にDSumの方が自由度が高く、どんな集計にも対応できます。

一方、Sumは利用箇所がクエリやフォーム、レポートに限られます。
VBAでも使用ができません。
ただ、フォーム上の特定のフィールドの集計値を常に表示したい場合などには簡単に集計ができるので便利です。

利用例

実際にDSumとSumの利用例を見てみましょう。
以下のフォームを準備しました。

売上金額を一覧化したフォームです。
右上に金額の合計値を表示しています。

この右上の合計値欄をDSumとSumでそれぞれ作ってみます。

フォームをデザインビューで見てみましょう。

合計金額のコントロースソースに関数を記載しています。
こうすることで合計値をフォーム上で表示できます。

DSumを使った場合

最初にDSumを使った場合です。
DSumの場合は下記のように記述します。


 =DSum("金額","TRN_売上明細3")
 

ここでTRN_売上明細3は、このフォームのレコードソースになっているテーブルの名称です。
TRN_売上明細3テーブルの金額フィールドを合計する、という指示になっています。

Sumを使った場合

一方、Sumを使って記述すると以下のようになります。


 =Sum([金額])
 

こちらの方が単純ですね。
これは、フォーム上の「金額」テキストボックスの値を集計する、という指示です。

DSumと異なり、テーブルのフィールド名を指定しているわけではないことにご注意ください。
そのため、テーブルに金額フィールドがあっても、フォーム上にそのテキストボックスがなかったり、金額を表示するテキストボックスの名称が「テキスト1」などになっているとうまく集計ができません。

DSumが適しているシーン

それでは、DSum、Sumのそれぞれが適している利用シーンをご紹介します。
まずは、DSumからです。

VBAで集計を行う場合

まず、VBAのイベントプロシージャで集計を行う場合はDSumしか利用できません。
例えば、以下のようなケースです。


 Public Sub uriage_keisan(uriage_id As Long)

    [Forms]![売上伝票入力]![小計] = DSum("金額", "SLC_売上明細", "売上ID = " & uriage_id)
    [Forms]![売上伝票入力]![消費税] = [Forms]![売上伝票入力]![小計] * [Forms]![売上伝票入力]![消費税率] / 100
    [Forms]![売上伝票入力]![伝票合計] = [Forms]![売上伝票入力]![小計] + [Forms]![売上伝票入力]![消費税]

 End Sub
 

上記のプロシージャではDSum関数を使って「SLC_売上明細」テーブルの「金額」を集計しています。
こうした場合はDSumしか使えないのでご注意ください。

抽出条件を指定して集計する場合

もう一つ、Dsumしかできないのが、抽出条件を指定して集計する場合です。
こちらも例を示します。

 
 Public Sub seikyu_keisan()

    [Forms]![請求書発行]![請求書未発行売上サブフォーム].Requery
    [Forms]![請求書発行]![小計] = DSum("小計", "SLC_売上(請求書未発行)", "顧客ID = " & [Forms]![請求書発行]![顧客ID] & "and 請求 = true")
    [Forms]![請求書発行]![消費税] = DSum("消費税", "SLC_売上(請求書未発行)", "顧客ID = " & [Forms]![請求書発行]![顧客ID] & "and 請求 = true")
    [Forms]![請求書発行]![請求額] = DSum("伝票合計", "SLC_売上(請求書未発行)", "顧客ID = " & [Forms]![請求書発行]![顧客ID] & "and 請求 = true")

 End Sub
 

DSum関数で集計をしていますが、抽出条件として、


 "顧客ID = " & [Forms]![請求書発行]![顧客ID] & "and 請求 = true"
 

を指定しています。
このような、抽出条件指定もよくつかわれます。

このように、DSumの方が利用可能な場所や柔軟性が高いため、基本はDSumを使った方が便利でしょう。

Sumが適しているシーン

一方で、Sumが適しているシーンもあります。
それは、フォームやレポート上での集計です。

例えば、下記の検索フォームの右上には、表示されたレコードの数量と金額の合計を表示しています。

検索フォームですので、条件に応じて表示されるレコードが変化します。

この際も、合計数量、合計金額は自動的に変わるようになっています。

この機能は、Sum関数で集計を行っています。

これをDSumで作成すると、フォームで適用されているフィルター条件をDSumの抽出条件に都度設定するというかなり煩雑な処理を考えなくてはいけません。
一方Sum関数であれば常にフォームに表示されているレコードの合計値だけを表示してくれるので何もしなくても勝手に検索結果に連動して集計値が変わるのです。

このように、フォームのレコード数が可変し、それに応じて集計結果を変える場合にはSumが適しています。

以上、DsumとSumの使い分けをご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。