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をより実務的に使いこなせるようになります。

ぜひ実際に試しながら、自分のデータベースに活用してみてください!

広告