ACCESS DLookup関数を使ってテーブルの値を参照する方法

ACCESSのクエリやVBAで、特定のテーブルの値を参照して計算したいけれど、方法がわからなくて困ったことはありませんか?

ACCESSであるテーブルの値を元に、他のテーブルの値を参照したい時に使用するのがDLookup関数です。
EXCELではVLookup関数が同じような位置づけですね。
今日は非常に使用範囲の広い、DLookup関数の使い方を解説していきましょう。


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

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

構文

最初にDLookup関数の構文を示します。

DLookup ( 値を返すフィールド , レコード セット , データ範囲を制限する文字列式 )

いくつか使用例を挙げます。

1.社員マスターテーブルから社員IDが3番の人の社員名を参照したい時。

DLookup ( “社員名” , “社員マスター” , “社員ID = 3” )

2.顧客マスターテーブルから顧客IDが5番の人の電話番号を参照したい時。

DLookup ( “電話番号” , “顧客マスター” , “顧客ID = 5” )

3.社員マスターテーブルから、顧客IDが5番の人を担当している社員の社員名を参照したい時。

DLookup ( “社員名” , “社員マスター” , “社員ID = ” & DLookup ( “担当社員ID” , “顧客マスター” , “顧客ID = 5 ” )

このように、DLookupを使用する際は、3つ目の引数であるデータ範囲を制限する文字列式には、そのテーブルの主キーとなる値でレコードを指定する使い方が一般的です。

クエリでの使用例

もう少し具体的な使用例で説明します。
まずはクエリで使用する場合です。

例えば、以下のような2つのテーブルがあるとします。

1.TRN_売上
売上情報を記録するテーブル

2.MST_商品
商品情報を記録するテーブル

TRN_売上にある「商品ID」は、MST_商品の「商品ID」と同じもの指しています。

ここで、TRN_売上の商品IDから、MST_商品の商品名を参照したいとします。
DLookup関数を使うなら選択クエリで以下のように設定します。

選択クエリの5列目に

商品名: DLookUp(“商品名”,”MST_商品”,”商品ID = ” & [商品ID])

と記載しました。

クエリでは、既存のテーブルにあるフィールドを表示する以外に、上記のように新しいフィールドを計算式で作成することが可能です。

この際、「:」で区切った左側(今回でいう「商品名」)がフィールド名になります。

一方、「:」の右側が計算式です。
今回はDLookup関数を使っています。

「TRN_売上」テーブルの「商品ID」を基に、「MST_商品」テーブルから「商品ID」が一致するレコードを探し、その「商品名」を表示する、という式です。

ここで記載方法について2点ほど注意点があります。

クエリのフィールド名を使用する場合は[]で囲う

上記の式で最後の商品IDだけが[]で囲われています。

これは何を示しているかというと、このクエリにある「商品ID」を使いなさい、という指示なのです。
つまり、クエリで参照している「TRN_売上」の「商品ID」ですね。

Dookup関数のような関数で、そのクエリ自身にあるフィールド名を参照する場合は[]で囲うことを覚えておきましょう。

条件式は””で囲うが、値を参照する部分は””から除外する

条件式部分は “商品ID = ” & [商品ID] と指定しています。

「”」を使っているのは、条件式を文字列型として認識させるためです。
では、なぜ

“商品ID = [商品ID]”

と書かないのでしょうか?

それは、 “商品ID = [商品ID]” と書いてしまうと、[商品ID]の部分をそのままテキストとしてACCESSが読んでしまうためです。
この部分はクエリにある商品IDの値に読み替えてもらわなければいけません。

そのため、この部分はテキストとして認識させないように、””の範囲から除外しているのです。

では、データシートビューで結果を見てみましょう。

このような形で無事に商品名が表示されました。

しかし、実はこの使い方をすることはあまりありません。
なぜなら、クエリでリレーションを設定したほうが早いからです。
つまり、選択クエリでこのように設定すれば同じことができます。

クエリでDlookpup関数を使用するのは、条件に応じて参照先を変えるためにIIF関数と組み合わせて使用する場合など、単純なテーブル間のリレーションでは解決しない、複雑な場合が多いでしょう。

VBAでの使用例

DLookup関数は選択クエリで使用するよりは、VBAで使用するケースの方が多いでしょう。
ある処理中に特定のテーブルの値を元に他のテーブルの値を参照したいが、クエリを作成して呼び出すほどでもなくDLookup関数で呼び出すというケースです。

例えば、以下のようなフォームを作成し、上段にある商品ID入力欄に商品IDを入力すると商品の価格をメッセージボックスに表示する機能を作ってみましょう。

コードは下記になります。

Private Sub 商品ID入力_AfterUpdate()

 MsgBox “価格は” & DLookup(“価格”, “MST商品”, “商品ID = ” & Me!商品ID入力) & “です。”, vbOKOnly + vbInformation, “価格表示”

End Sub

「商品ID入力」テキストボックスのAfter_Updateイベント、つまり更新後処理を作成しています。

テキストボックスが更新されると、メッセージが表示される処理です。
メッセージの一部にDLookup関数を使用しています。

DLookupの3つ目の引数である条件をフォームから指定をする際は、カレントフォームの値を参照する「Me」を使うことが多いですね。
結果を見てみましょう。

このように、商品IDに数値を入力してエンターを押すと、メッセージボックスに対象商品の価格が表示されました。

クエリの抽出条件でフォームを参照させる方法については、下記の記事でより詳しく書いています。

クエリの抽出条件でフォームを参照させる方法

以上、ACCESSでDLookup関数を使って他のテーブルの値を参照する方法をご紹介しました。


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

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

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

サービス一覧

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