PR

DLookup関数の使い方|条件を指定してデータを取得する方法

VBA

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関数では、抽出条件を組み合わせることで、このような複数条件にも対応できます。

必見!! AccessのDLookUp関数で複数条件を設定する方法
AccessではDLookUp関数を使う頻度が多いと思いますが、条件を設定する場合に複数で指定する必要がある機会もあります。 今回は、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プロシージャと設定します。詳しくは、以下の記事をご参照ください。

業務効率の飛躍的改善に向けた第一歩 Access VBA
業務効率を飛躍的に向上させるためにAccess VBAについて紹介します。 VBAとは「Visual Basic for Application」の略称で、Microsoft Officeアプリケーション(Word、Excel、PowerPoint、Access等)の機能を拡張するために用いられます。 一度VBAでソースコードを作成しておけば、ルーチン的な操作はVBAで実行、自動処理できます。

そして次のようにコードを記載してください。

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" Then
    MsgBox "対象の品はありませんでした。"
  Else
    MsgBox MB
  End If
 
End Sub

入力した型番が、「T_品目リスト」にある場合は、対象となる品名が、そうでない場合は、対象がないとのアラートがでるようになったと思います。

DLookupを使う際の注意点

① データ型を確認する

数値・文字列・日付で条件式の作り方が異なります。

② 一致するレコードを確認する

条件に一致するデータがない場合を考慮します。

③ 複数レコードが存在しないか確認する

「この条件なら1件だけ」と思い込まず、元データの設計も確認します。

④ 大量処理では処理方法も検討する

DLookupを多数回呼び出すような処理では、クエリやDAO/ADOなど別の方法が適していないかも検討します。

さて、DLookup関数の使い方を一通り確認できたと思いますので、以下に様々な利用方法を示します。

フォームの値を条件にDLookupを使う

AccessでDLookup関数を利用する場面として多いのが、フォームに入力された値を条件として、別のテーブルから値を取得する処理です。

例えば、フォームで商品コードを入力したときに、商品マスタから商品名や単価を取得して画面に表示するといった使い方が考えられます。

フォーム上でDLookupを利用する具体的な方法については、次の記事で解説しています。

DlookUpを用いたフォーム上のデータ操作
DlookUp関数を用いてAccessフォーム上の値を更新する方法を紹介します。

クエリを対象にDLookupを使う

DLookup関数の検索対象には、テーブルだけでなくクエリを指定することもできます。

あらかじめクエリで必要なデータを抽出・加工している場合には、そのクエリをDLookupの検索対象として利用できます。

Access クエリでDLookUp関数を用いる方法
AccessクエリでDLookUp関数を活用する方法を紹介します。

DLookupとSQLを組み合わせる

DLookupの条件式を理解するうえでは、SQLのWHERE句と共通する考え方もあります。

条件を動的に組み立てる場合や、フォームからテーブルの値を参照する場合など、SQLの知識があるとDLookupの条件式も理解しやすくなります。

DLookupとSQLを組み合わせた利用方法については、次の記事も参考にしてください。

DLookUp関数とSQLの活用 フォーム上でテーブルの値を呼び出し更新する方法
DLookUp関数とSQLを活用して、テーブルに登録した値をフォーム上の各テキストボックスに反映し、さらに修正した値を再度テーブルに反映する方法を紹介していきます。

DLookup関数でNullが返る原因

DLookup関数を使ったときに値が取得できず、Nullが返ることがあります。

この場合は、まず次の点を確認します。

  • 条件に一致するレコードが存在しているか
  • フィールド名やテーブル名に誤りがないか
  • 数値・文字列・日付などのデータ型に合った条件式になっているか
  • フォーム上の値がNullになっていないか

DLookupでNullになる場合の確認方法については、次の記事で詳しく解説しています。

Access DLookUp関数で参照値がない場合の処理
Accessでは、様々な場面でDLookUp関数を用いますが該当レコードがなかった場合の処理を紹介します。

まとめ

Accessでデータ操作を行う際のテクニックとして、DLookup関数を紹介しました。

基本的には、

「取得するフィールド」「検索対象」「抽出条件」

の3つを指定することがポイントです。

まずは単一条件で基本的な使い方を理解し、その後、実際の用途に応じて複数条件やフォームとの組み合わせへ進むと理解しやすくなります。

マスタテーブル用意している場合、DLookup関数を活用する機会も多くなると思いますので、本記事を参考にしてください。

上手く機能を利用して、業務効率を改善していただければと思います。

スポンサーリンク

Kindle+にサインアップして無料体験に登録する
Kindle+に登録すると、人気のシリーズ、ベストセラー、名作などに好きなだけアクセスして、シームレスなデジタル読書体験を実現できます。

コメント

タイトルとURLをコピーしました