ワークシート関数(Dcount)をVBAの中で使うには?

Question 20.1 Previous Next
VBAの中でDcount関数を使用したいのですが、うまく動きません。
エクセル上で、「database」という名前で登録したデータを、「集計条件」という名前で登録した集計条件をもとに、集計したときのコーディング例です。

dim x1 as variant
x1 = application.dcount(database,"年",集計条件)

(スペルは少し間違っているかも知れません。) Excel97を使っています。教えて下さい。
Answer   Copyright (C) 1999.6.13 永井善王
DCOUNT関数とは、Excelのデータベースの計算に使用する12種類のワークシート関数の1つですね。
「データベース」と言われて、特殊な難しいものを想像する必要はありません。Excelのワークシートでリスト形式のものは、データベースとして扱えます。よって、このDCOUNT関数が理解できれば、ほかのデータベース関数の理解が進み、思いがけない用途が広がるかも知れませんね。
前置きが長くなりますが、データベース関数について、Excelのヘルプから要点をまとめましたので、再確認しておきましょう。
関 数 機 能
DAVERAGE 条件を満たすレコードの平均値を返す
DCOUNT 条件を満たすレコードのうち、数値が入力されているセルの個数を返す
DCOUNTA 条件を満たすレコードのうち、空白でないセルの個数を返す
DMAX 条件を満たすレコードの最大値を返す
DMIN 条件を満たすレコードの最小値を返す
DPRODUCT 条件を満たすレコードの積を返す
DSUM 条件を満たすレコードの合計を返す
SUBTOTAL リストまたはデータベースの集計値を返す
ほかに、DGET、DSTDEV、DSTDEVP、DVAR、DVARP、GETPIVOTDATA (97以上) があります
この中にある DSUMは時折見かけますね。より詳細が知りたければ、[ヘルプ]-[トピックスの検索]で、[キーワード]に「データベース関数一覧」と入力して表示させて、見てください。
回答に入りましょう。
DCOUNT関数は、データベースの指定されたフィールド列を検索し、条件を満たすレコードのうち、数値が入力されているセルの個数を返します。そして、その書式は、DCOUNT(Database, フィールド, Criteria) です。
      引数 Database には、データベースを構成する
セル範囲を指定
         フィールド には、関数の中で使用するフィールドを指定、
         Criteria には、データベースの検索条件が設定されている
セル範囲を指定します。
あなたが書いたコードを、これに照らしてみると、引数 Database は「database」、フィールド は「年」、Criteria は「集計条件」となりますね。

次に、VBAでワークシート関数を使う場合のコーディング方法を確認しましょう。
VBAからワークシート関数を呼び出す場合は、Applicationオブジェクトを使うか、Excel97以上ではWorksheetFunctionを使います。あなたのコードには、Applicationオブジェクトが正しく書かれているので、問題はありません。

ですが、
「引数にセル範囲の参照を必要とするワークシート関数を使う場合は、Range オブジェクトを指定しなければならない」というルールがあるので、 DCOUNT関数の引数 DatabaseCriteria には、Range オブジェクトを指定することになります。
これで、わかりましたね。あなたは、引数に
セル参照の名前 を書いてしまいました。
マクロを修正する前に、ワークシート上で動作確認してみよう

あなたのワークシートのレイアウトが不明のため、右図のシートを作ってみました。シート名は「リスト」です。

このシートの仕組みとしては、A1:C5セルがデータベース、A7:C8セルが集計条件です。
D10セルには、あなたが書いたDCOUNT関数を記入しておきました。
引数は、セル参照の名前のままです。

このDCOUNT関数の働きは、データベースの中から年が 3であるセルの個数を集計します。
この場合は丑年と午年がそうですから、答えは 2になり、D10セルのDCOUNT関数の引数に名前を使っても、正しく動作していることがわかります。
Dcountシート

マクロを修正してみよう

引数に記入したセル参照の名前を消して、Rangeオブジェクトを記入します。修正後のマクロを、下記にまとめておきました。
Sub リストデータをDCOUNT関数で集計する()
    Worksheets("リスト").Select
    該当数 = Application.DCount(Range("A1:C5"), "年", Range("A7:C8"))
    MsgBox 該当数
End Sub
4行目の MsgBoxのコーディングは、動作確認のために、あえて入れたものです。
修正したマクロを動作確認しよう

サンプルブックのダウンロードは ここをクリック  (YNxv957_dcount.xls.xls 20KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。

Excel VBA Macro