AccessのDLookup関数の使い方をお探しですね。
広告
AccessのDLookup関数・DCount関数の使い方!別テーブルから値を参照・集計する方法
Accessでフォームやクエリを作っていると、「別のテーブルにある顧客名を表示したい」「条件に合う売上が何件あるか数えたい」といった場面によく出会います。
そんなときに便利なのが、**DLookup関数**と**DCount関数**です。
どちらもAccessの「定義域集計関数」というグループに入る関数で、テーブルやクエリを対象にして、値を取り出したり件数を数えたりできます。
この記事では、基本的な使い方から、クエリ・フォーム・VBAでの実例、エラーを防ぐためのポイントまで、わかりやすく解説していきます。
DLookup関数とDCount関数って何が違うの?
DLookup関数:別テーブルから値を取り出す
**DLookup関数**は、指定したテーブルやクエリの中から、条件に合うレコードを探して、そのフィールドの値を1つだけ返してくれる関数です。
例えば、売上テーブルには「顧客ID」しか入っていないけど、画面には顧客マスタの「顧客名」を表示したい…そんなときに使えます。
ExcelでいうVLOOKUP関数に似ていますが、Accessではテーブル名や条件を文字列で指定する点が違います。
DCount関数:条件に合うレコードの件数を数える
一方、**DCount関数**は、指定したテーブルやクエリの中から、条件に合うレコードが何件あるかを数える関数です。
– 「売上金額が10万円以上の件数は?」
– 「特定の顧客名を含む売上は何件?」
– 「入力された社員コードが既に登録されてるかチェックしたい」
こんな場面で活躍します。
**DLookupは「値を1つ取得」、DCountは「件数を数える」**という違いですね。
基本の書き方
基本の構文はこんな感じです。
“`access
DLookup(“取得するフィールド名”, “テーブル名またはクエリ名”, “抽出条件”)
DCount(“数えるフィールド名”, “テーブル名またはクエリ名”, “抽出条件”)
“`
例1:社員マスタから社員名を取得
社員マスタ「M_社員」から、社員IDが3の人の名前を取得する場合:
“`access
DLookup(“社員名”, “M_社員”, “社員ID = 3”)
“`
例2:売上テーブルから件数を数える
売上テーブル「T_売上」から、小計が10万円以上のレコードが何件あるか数える場合:
“`access
DCount(“売上ID”, “T_売上”, “小計 >= 100000”)
“`
DCountで全件数を数えるときの注意点
全レコード数を数えたいときは、主キーなど必ず値が入っているフィールドを指定するか、「**\***」を使います。
“`access
DCount(“*”, “T_売上”)
“`
これでT_売上テーブルの全レコード数が取得できます。
ただし、特定のフィールド名を指定すると、そのフィールドが空(Null)のレコードはカウントされません。
正確に総件数を数えたいなら、主キーか「\*」を使うのが安全です。
DLookup関数の使い方|別テーブルから値を取り出す実例
DLookup関数をよく使うのは、フォームやクエリで別テーブルの名前や情報を表示したいときです。
例:担当社員名を表示する
顧客テーブル「T_顧客」に「担当社員ID」があって、社員マスタ「M_社員」に「社員ID」と「社員名」が保存されているとします。
顧客ごとの担当社員名を表示したい場合、T_顧客には社員名が直接入っていなくても、担当社員IDを使ってM_社員から社員名を取得できます。
クエリで使う場合
クエリの演算フィールドに、こう書きます。
“`access
担当社員名: DLookup(“社員名”, “M_社員”, “社員ID = ” & [担当社員ID])
“`
この式では、今のクエリにある「担当社員ID」の値を使って、M_社員テーブルの「社員ID」と一致するレコードを探し、その「社員名」を返しています。
**ポイント**は、条件式全体を文字列として組み立てることです。
– 「社員ID = 」の部分は文字列なのでダブルクォーテーションで囲む
– 実際の値「[担当社員ID]」は外に出して「&」でつなぐ
もし「”社員ID = [担当社員ID]”」のようにすべてを文字列にしてしまうと、Accessは[担当社員ID]をフィールドの値ではなく、ただの文字として扱ってしまいます。
フォームで使う場合
フォームでは、入力された値に応じて別テーブルから値を表示できます。
例えば、顧客IDを入力したら顧客名を自動表示するフォームなら、顧客IDテキストボックスの「更新後処理」にこんなVBAを書きます。
“`vba
Private Sub 顧客ID_AfterUpdate()
Me!顧客名 = DLookup(“顧客名”, “M_顧客”, “顧客ID = ” & Me!顧客ID)
End Sub
“`
この例では、フォームの「顧客ID」に入力された値を条件にして、M_顧客テーブルから顧客名を取得し、フォームの「顧客名」テキストボックスに表示しています。
「**Me**」は今開いているフォーム自身を指すので、フォーム内のコントロールを参照するときに便利です。
複数該当する場合の注意
DLookup関数は、条件に合うレコードが複数あっても、基本的には1件の値しか返しません。
どのレコードが返ってくるかを確実にしたい場合は、主キーや一意のコードなど、必ず1件に絞れる条件を指定することが大切です。
文字列型の条件を指定する場合
文字列型の条件では、値を**シングルクォーテーション**で囲みます。
例えば、社員コードが文字列型で「A001」の社員名を取得するなら:
“`access
DLookup(“社員名”, “M_社員”, “社員コード = ‘A001′”)
“`
フォームの入力値を使う場合は、こんな感じで連結します。
“`access
=DLookup(“社員名”, “M_社員”, “社員コード = ‘” & [txt社員コード] & “‘”)
“`
日付型の条件を指定する場合
日付型の条件では、日付を「**#**」で囲みます。
例えば、受注日が2025年1月1日の担当者を取得する場合:
“`access
“受注日 = #2025/1/1#”
“`
Accessではデータ型によって条件式の書き方が変わるので、数値型・文字列型・日付型の違いを意識しておくと、エラーや意図しない結果を防げます。
DCount関数の使い方|条件に合うレコード数を集計する
DCount関数は、テーブルやクエリの中から、条件に合う件数を取得したいときに使います。
例:売上件数を確認する
売上テーブル「T_売上」に「売上ID」「顧客ID」「売上日」「小計」がある場合を考えてみましょう。
総件数を取得
一番シンプルな総件数の取得なら:
“`access
DCount(“*”, “T_売上”)
“`
条件付きで件数を数える
小計が10万円以上の売上件数を数える場合:
“`access
DCount(“*”, “T_売上”, “小計 >= 100000”)
“`
文字列を条件にする場合
顧客名など文字列を条件にするときは、シングルクォーテーションとLike演算子を組み合わせることもできます。
例えば、売上クエリ「Q_売上」に顧客名フィールドがあって、「ブルー」を含む顧客の売上件数を数えるなら:
“`access
DCount(“*”, “Q_売上”, “顧客名 Like ‘*ブルー*'”)
“`
フォームの入力値を使って動的に件数を表示
フォームの入力欄を条件にして、件数を動的に変えることもよくあります。
例えば、フォームに「txt検索語」というテキストボックスがあって、そこに入力された文字を含む顧客名の件数を表示する場合、結果表示用テキストボックスのコントロールソースにこう設定できます。
“`access
=DCount(“*”, “Q_売上”, “顧客名 Like ‘*” & [txt検索語] & “*'”)
“`
この式では、ユーザーが入力した検索語を条件式の中に組み込んで、部分一致で件数を集計しています。
検索フォームや一覧画面で「今の条件に該当する件数」を表示したいときに便利です。
処理速度に注意
ただし、DCount関数は条件に合う件数を調べるたびに、指定したテーブルやクエリを参照します。
大量データを対象にしたフォームで何度も実行すると、動作が重くなることがあるので注意してください。
重複チェックや入力チェックにも使える
DCount関数は、重複チェックや入力チェックにも使いやすい関数です。
例えば、新規登録フォームで入力された社員コードが既に登録済みか確認する場合:
“`vba
Private Sub txt社員コード_BeforeUpdate(Cancel As Integer)
If DCount(“*”, “M_社員”, “社員コード = ‘” & Me!txt社員コード & “‘”) > 0 Then
MsgBox “この社員コードは既に登録されています。
“, vbExclamation
Cancel = True
End If
End Sub
“`
この処理では、入力された社員コードと同じレコードがM_社員テーブルに1件以上あったら、メッセージを表示して更新を止めています。
DCount関数は単なる集計だけでなく、「存在するかどうか」を判定する用途でも実務でよく使われます。
Count関数との使い分け
なお、フォームやレポートの集計欄で、今表示中のレコードだけを数える場合は、DCountではなく**Count関数**の方が適していることもあります。
DCountは指定した定義域、つまりテーブルやクエリ全体を条件付きで数える関数だと理解すると、使い分けしやすくなります。
失敗しやすい注意点と使い分けのコツ
抽出条件の文字列の作り方に注意
DLookup関数とDCount関数で最も多い失敗は、**抽出条件の文字列の作り方**です。
– 数値型なら「ID = 1」のようにそのまま書ける
– 文字列型なら「コード = ‘A001’」
– 日付型なら「日付 = #2025/1/1#」
のように囲み方が変わります。
特にフォームの値を条件にするときは、ダブルクォーテーション、シングルクォーテーション、アンパサンドの位置が少し違うだけでエラーになったり、正しく抽出できなかったりします。
Null対策も重要
もう一つ重要なのが**Null対策**です。
フォームの入力欄が空のままDLookupやDCountを実行すると、条件式が不完全になったり、戻り値がNullになったりすることがあります。
DLookupは条件に一致するレコードがない場合、Nullを返します。
そのまま文字列や数値として扱うと後続処理でエラーになる場合があるので、必要に応じて**Nz関数**で代替値を指定します。
“`vba
Dim str顧客名 As String
If IsNull(Me!顧客ID) Or Me!顧客ID = “” Then
MsgBox “顧客IDを入力してください。
“, vbExclamation
Else
str顧客名 = Nz(DLookup(“顧客名”, “M_顧客”, “顧客ID = ” & Me!顧客ID), “”)
End If
“`
このように、関数を実行する前に入力値を確認して、戻り値がNullになる可能性にも備えておくと、ユーザーが操作しても止まりにくいフォームになります。
Accessでは空文字「””」とNullは別物として扱われるので、入力チェックでは両方を意識することが大切です。
テーブル結合との使い分け
DLookup関数は便利ですが、クエリで別テーブルの値を表示するだけなら、**テーブル結合**を使った方が適している場合があります。
例えば、顧客テーブルと社員マスタを社員IDで結合すれば、DLookupを使わずに担当社員名を表示できます。
結合の方がAccessの得意な処理で、データ件数が多い場合は速度面でも有利です。
DLookupは次のような場面で使うと効果的です。
– フォーム上で1件だけ参照したい
– VBA内で一時的に値を取りたい
– 条件によって参照先を変えたい
DCountも大量データでは注意
DCount関数も同様に、一覧の各行で何度も実行すると処理が重くなることがあります。
大量データの集計や一覧表示では、集計クエリ、グループ化、結合、サブクエリなどを検討した方が安定します。
一方で、フォーム上の簡単な件数表示、重複チェック、入力値に応じた件数確認であれば、DCountは短い式で実装できるので非常に実用的です。
まとめ:DLookupとDCountを使いこなそう
最後に、DLookup関数とDCount関数の使い分けを整理しておきましょう。
– **別テーブルから名前・単価・区分などの「値」を取り出したい** → **DLookup**
– **条件に合うレコードが何件あるかを知りたい** → **DCount**
ただし、どちらも万能ではありません。
– データ型に合わせた条件式
– Null対策
– 処理速度への配慮
これらが必要です。
基本構文を覚えるだけでなく、「どの場面なら関数で済ませるか」「どの場面ならクエリの結合や集計に任せるか」を判断できるようになると、Accessのフォーム・クエリ・VBAをより実務的に使いこなせるようになります。
ぜひ実際に試しながら、自分のデータベースに活用してみてください!
広告
