Accessで「条件に一致するレコードから特定の値だけを取得したい」という場合に便利なのがDLookup関数です。
DLookup関数を使えば、テーブルやクエリを対象として、指定した条件に一致するフィールドの値を取得できます。
この記事では、DLookup関数の基本構文から、数値・文字列・日付を条件にする方法、フォームでの利用方法、複数条件の指定、Nullが返る場合の考え方まで順番に解説します。
まずDLookup関数の基本を理解したい方は、上から順番に確認してみてください。
AccessのDLookup関数とは
DLookup関数は、Accessのテーブルやクエリから条件に一致するレコードを検索し、指定したフィールドの値を取得するための関数です。
例えば、社員番号を指定して社員名を取得したり、商品コードから単価を取得したりするときに利用できます。
DLookup関数は、フォームやレポートのコントロールソース、クエリ、VBAなどから利用できるため、「別のテーブルにある値を参照したい」という場面で役立ちます。
ExcelのVLOOKUP関数に近い目的で使われることもありますが、DLookupはAccessのテーブルやクエリを対象として条件を指定し、必要な値を取得する点が特徴です。
DLookup関数の基本構文
DLookup(“取得するフィールド名”, “テーブルまたはクエリ名”, “抽出条件”)
DLookup関数では、大きく3つの情報を指定します。
| 引数 | 説明 |
|
第1引数:取得したいフィールド
|
どの項目の値を取得するのかを指定します。
|
| 第2引数:検索対象 | 値を検索するテーブル名またはクエリ名を指定します。 |
| 第3引数:抽出条件 | どのレコードを対象にするのかを指定します。 |
例えば、次のように記載します。
DLookup("商品名", "T_商品", "商品ID=10")
この例では、「T_商品」テーブルから「商品ID=10」のレコードを検索し、そのレコードの「商品名」を取得します。
DLookup関数の基本的な使い方
数値型フィールドを条件にする
商品IDのような数値型フィールドを条件にする場合は、数値をそのまま条件式に指定できます。
文字列型フィールドを条件にする
商品コードや社員コードなどの文字列を条件にする場合は、条件値を引用符で囲む必要があります。
DLookupで「値が取得できない」という場合、この数値型と文字列型の条件指定の違いが原因になることもあります。
例えば、次のように記載します。
商品コード='A001'
日付型フィールドを条件にする
日付を条件にする場合は、数値や文字列とは異なる記述が必要になります。
Accessでは日付リテラルを扱う際に#を使用するため、DLookupで日付条件を組み立てる場合にもデータ型を意識することが重要です。
複数の条件でDLookupを使う場合
DLookup関数の基本的な使い方を理解したら、次に覚えておきたいのが複数条件によるデータ取得です。
実務では、「社員番号と年度」「商品コードと日付」のように、1つの条件だけでは対象レコードを絞り込めないケースがあります。
AccessのDLookup関数では、抽出条件を組み合わせることで、このような複数条件にも対応できます。

DLookupを実務で使用する場合には、基本形とあわせて複数条件の指定方法も押さえておくと便利です。
さて、次からはテストデータを用いてDLookup関数の動きを解説します。
テストデータについて
DLookup関数は、あるフィールドに対して設定した条件に一致するレコードについて、同じく指定したフィールドの値をを出力するため、対象となるテーブルは、マスタテーブルになることが多いです。そこで、次のようなテストデータを作成しました。なお、作成するテーブル名称は「T_品目マスタ」とします。
■作成するサンプルテーブルの構造
| フィールド名 | データ型 |
| 品目ID | オートナンバー型 |
| 品名 | 短いテキスト |
| 型番 | 短いテキスト |
| 製造元 | 短いテキスト |
サンプルテーブルには、次のデータが含まれているものとします。
■作成するサンプルレコード
| 品目ID | 品名 | 型番 | 製造元 |
| 1 | えんぴつ(HB) | EN-001 | 四菱 |
| 2 | 消しゴム | KE-001 | 四菱 |
| 3 | えんぴつ(B) | EN-002 | 四菱 |
| 4 | 定規 | JY-001 | TOMBO |
| 5 | ノート | NO-001 | コクミ |
次からVBAのコーディング説明になります。
DLookup関数からのデータ抽出
それでは、テストデータからDLookup関数を用いて必要なデータを抽出してみましょう。まずは、「作成」タブの「マクロとコード」欄から「標準モジュール」を選択します。続いて、起動したVBA画面の「挿入」タブで「プロシージャ」を選択し、名前を「Dlookup_Sample」、Subプロシージャ、Publicプロシージャと設定します。詳しくは、以下の記事をご参照ください。

そして次のようにコードを記載してください。
Public Sub Dlookup_Sample()
'この1行を追加する。
MsgBox Dlookup("品名", "T_品目マスタ", "型番 = 'EN-001'")
End Sub
さて、上で紹介したコード中のDlookup関数では、「T_品目マスタ」テーブルの内、「型番」フィールドの値が「EN-001」のレコードにおける、「品名」フィールドの値を出力するという意味です。したがって、型番が「EN-001」である「えんぴつ(HB)」がメッセージボックスで表示されることになります。
実際にVBA画面上のSub/ユーザーフォームの実行アイコンである、緑三角ボタン「▶」をクリックしてください。すると、画面上に「えんぴつ(HB)」というメッセージボックスが現れたと思います。
なお、抽出条件に文字列を使う場合、シングルクォーテーション「’」で、日付型の場合は「#」で括ります。また、数値型の場合はそのまま記入します。
条件に変数を適用する方法
先に紹介した方法では、criteriaに型番の値を直接入力しましたが、変数にすることで任意の値を出力できるようになります。
例えば、InputBox関数、Nz関数(値がNullであれば、条件に応じた別の値を返す関数)とIf文を組み合わせることで対話型の品名確認ができるようになります。
Public Sub Dlookup_Sample()'型番を格納する変数を宣言Dim param As String'InputBox関数でユーザーに値を入力してもらい、その値をparam変数に格納する。param = InputBox("型番入力")'DLookup関数で品名を呼び出す際に、param変数を抽出条件に用いている。 'DLookup関数で対象がない場合にはNullが返されるが、 'Nz関数を用いてNullの代わりに「empty」を返すようにしている。MB = Nz(Dlookup("品名", "T_品目マスタ", "型番 = '" & param & "'"), "empty")'If文で空の場合と、品名を返す場合を分岐させる。If MB = "empty" ThenMsgBox "対象の品はありませんでした。"ElseMsgBox MBEnd IfEnd Sub
入力した型番が、「T_品目リスト」にある場合は、対象となる品名が、そうでない場合は、対象がないとのアラートがでるようになったと思います。
DLookupを使う際の注意点
① データ型を確認する
数値・文字列・日付で条件式の作り方が異なります。
② 一致するレコードを確認する
条件に一致するデータがない場合を考慮します。
③ 複数レコードが存在しないか確認する
「この条件なら1件だけ」と思い込まず、元データの設計も確認します。
④ 大量処理では処理方法も検討する
DLookupを多数回呼び出すような処理では、クエリやDAO/ADOなど別の方法が適していないかも検討します。
さて、DLookup関数の使い方を一通り確認できたと思いますので、以下に様々な利用方法を示します。
フォームの値を条件にDLookupを使う
AccessでDLookup関数を利用する場面として多いのが、フォームに入力された値を条件として、別のテーブルから値を取得する処理です。
例えば、フォームで商品コードを入力したときに、商品マスタから商品名や単価を取得して画面に表示するといった使い方が考えられます。
フォーム上でDLookupを利用する具体的な方法については、次の記事で解説しています。

クエリを対象にDLookupを使う
DLookup関数の検索対象には、テーブルだけでなくクエリを指定することもできます。
あらかじめクエリで必要なデータを抽出・加工している場合には、そのクエリをDLookupの検索対象として利用できます。

DLookupとSQLを組み合わせる
DLookupの条件式を理解するうえでは、SQLのWHERE句と共通する考え方もあります。
条件を動的に組み立てる場合や、フォームからテーブルの値を参照する場合など、SQLの知識があるとDLookupの条件式も理解しやすくなります。
DLookupとSQLを組み合わせた利用方法については、次の記事も参考にしてください。

DLookup関数でNullが返る原因
DLookup関数を使ったときに値が取得できず、Nullが返ることがあります。
この場合は、まず次の点を確認します。
- 条件に一致するレコードが存在しているか
- フィールド名やテーブル名に誤りがないか
- 数値・文字列・日付などのデータ型に合った条件式になっているか
- フォーム上の値がNullになっていないか
DLookupでNullになる場合の確認方法については、次の記事で詳しく解説しています。

まとめ
Accessでデータ操作を行う際のテクニックとして、DLookup関数を紹介しました。
基本的には、
「取得するフィールド」「検索対象」「抽出条件」
の3つを指定することがポイントです。
まずは単一条件で基本的な使い方を理解し、その後、実際の用途に応じて複数条件やフォームとの組み合わせへ進むと理解しやすくなります。
マスタテーブル用意している場合、DLookup関数を活用する機会も多くなると思いますので、本記事を参考にしてください。
上手く機能を利用して、業務効率を改善していただければと思います。
スポンサーリンク


コメント