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つ目の引数であるデータ範囲を制限する文字列式に、そのテーブルの主キーとなる値でレコードを指定する使い方が一般的です。

なお、3つ目の例では、Dlookup関数を二重に使っています。

テーブル構造が複雑な場合は、こうした使い方も可能です。

クエリでの使用例

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

例えば、以下のような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の値に読み替えてもらわなければいけません。

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

この書き方は非常によく使いますので、覚えておくと便利です。

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

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

しかし、実はこの使い方をすることはあまりありません。

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

上記の例では、TRN_売上とMST_商品を商品IDでリレーションさせています。

2つのテーブルの間に商品IDを結ぶ線が引かれているのがその証です。

そのうえで、クエリの下段(デザイングリッド)にMST_商品の商品名を5列目に表示させています。

これにより、TRN_売上の商品IDに紐づいた商品名が、MST_商品から参照されて表示されるのです。

クエリで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関数でMST商品テーブルから、商品IDがフォームの商品ID入力と一致するレコードを抽出し、価格フィールドの値を返す、という指定をしています。

DLookupの3つ目の引数である条件をフォームから指定をする際は、カレントフォームの値を参照する「Me」を使うと便利です。
ここでいうMeは、現在利用している「商品管理」フォームを指しています。

Meの使い方については下記の記事に書いていますので興味がある方はご覧ください。

Meキーワードの使用方法

では、結果を見てみましょう。

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

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

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

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


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

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

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

サービス一覧

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