DLookup関数は、テーブルやクエリからレコードを検索し、指定したフィールドの値を返してくれる関数です。この記事では、基本的な構文や、具体的な使い方について解説します。
DLookup関数とは
テーブルやクエリから条件に一致する値を1件だけ取得する関数です。定義域集計関数と呼ばれる関数の一種です。
構文
DCount(フィールド名, テーブル名, 抽出条件)
各引数の内容は次のとおりです。
引数 | 必須/任意 | 内容 |
---|---|---|
フィールド名 | 必須 | 値を取得するフィールド名 |
テーブル名 | 必須 | 取得するフィールドが属するテーブル名やクエリ名 |
抽出条件 | 任意 | SQLのWHERE句に相当する条件式 |

DLookup関数は、複数のデータが該当する場合でも最初の1件目だけを取得します。
よって、あくまで抽出条件は任意ですが、実務では必ず抽出条件を指定します。
具体例
次のテーブルを元に、DLookup関数
で値を参照する基本的な具体例を解説します。
【参照元テーブル(M_社員マスタ)】

【具体例】
DLookup("社員名", "M_社員マスタ", "社員コード='1000000002'")
【解説】
上記のDLookup関数
は、抽出条件として社員コードが1000000002
の社員名
を取得する、という命令です。実行結果として、社員名の田中
を取得することができます。
なお、本事例では抽出条件に使用した社員コードフィールドが文字列型であるため、条件の値をシングルコーテーション(’)で囲む必要があります。日付型であればシャープ(#)で囲む、数値型であれば不要です。
使用例
上記は最も基本的な具体例ですが、DLookup関数
はAccess内の様々な場所で使用することができます。ここでは、フォームのコントロールソース、VBA、クエリで使用する例をご紹介します。
フォームのテキストボックスで使用
フォームに配置したテキストボックスのコントロールソースにDLookup関数
を設定することで、抽出条件である他のテキストボックスの値に応じた、結果を取得することができます。
【具体例】
=DLookUp("社員名","M_社員マスタ","社員コード='" & [テキスト4] & "'")
【解説】
前述の基本的な具体例では、抽出条件に値を直接指定していますが、入力した内容によって動的な抽出条件を実現することもできます。

テキスト4という非連結テキストボックスに入力した値に応じて、テキスト7に結果の値を表示します。例えば、テキスト4に1000000006
と入力してEnterキーを押すと、テキスト7に伊藤
が表示されます。
VBA内で使用
VBAでDLookup関数を使う場合は、取得した値を変数に格納するパターンが多く見受けられます。
【具体例】
Private Sub btnLogin_Click()
Dim strPass As String
strPass = Nz(DLookup("パスワード", "T_ユーザー", "ユーザーID='" & Me.txtUserID & "'"), "")
If strPass = "" Then
MsgBox "ユーザーIDが存在しません。", vbCritical
ElseIf strPass = Me.txtPassword Then
MsgBox "ログイン成功!"
DoCmd.OpenForm "F_メニュー"
Else
MsgBox "パスワードが違います。", vbExclamation
End If
End Sub
【解説】
ツールのログイン画面で、入力したIDとパスワードを判定するパターンです。
テキストボックスtxtUserID
に入力された値と一致するパスワードをT_ユーザ
テーブルから抽出し、変数strPass
に格納します。
次にIf関数
で変数strPass
の値を判定し、結果によりフォームを開いたり、エラーのメッセージを表示します。
クエリで使用
DLookup関数は、クエリのデザイングリットで使用するケースもあります。
具体例については、こちら↓の記事の「DLookup関数を使用した抽出」で詳しく解説しています。
まとめ
DLookup関数とは
テーブルまたはクエリから、条件に合うレコードの中から指定したフィールドの値を 1 件だけ取得する関数。
構文
DLookup(フィールド名, テーブル名, 抽出条件)最後に記事の要点をまとめます。
ポイント
- 複数ヒットしても最初の 1 件のみを返す。
- 抽出条件では、フィールドのデータ型に応じて値を囲む記号が異なる(文字列ならシングルクォーテーション、日付型なら #、数値ならそのまま等)。
注意点 / 推奨事項
- 条件を指定しないと意図しないレコードが返る可能性あり。
- 多くのデータを対象にすると処理が遅くなる可能性があるため、パフォーマンスを考慮。
- 場合によっては SQL やクエリの別の方法を使った方が効率的なこともある。
こちらの記事では、Accessで使うことができる主な関数を一覧形式で解説しています。