AccessのDLookup関数についてお探しですね。
広告
Accessで別テーブルから値を引っ張る!DLookup関数の使い方を分かりやすく解説
Accessでデータベースを作っていると、「別のテーブルやクエリから、条件に合うデータだけを持ってきたい」という場面がよくあります。
ExcelのVLOOKUP関数のようなことをAccessでやりたいときに便利なのが「DLookup関数」です。
ただ、VLOOKUP関数と比べて書き方がちょっと独特で、特に条件式の書き方やデータ型の扱いで戸惑う方が多いんです。
この記事では、AccessのDLookup関数を使って別テーブルやクエリから条件に合う値を取得する方法を、基本的な書き方からデータ型ごとの違い、実務で役立つエラー対策まで、できるだけ分かりやすく説明していきます。
1. DLookup関数の基本的な書き方と3つの引数
DLookup関数を使いこなすには、まず基本的な書き方と、3つの引数がそれぞれ何を意味しているのかを理解することが大切です。
DLookup関数は「=DLookup(“取得したい項目名”, “テーブル名またはクエリ名”, “条件”)」という形で書きます。
ExcelのVLOOKUP関数とは引数の順番や指定の仕方がけっこう違うので、最初は「あれ?」と思うかもしれませんが、それぞれの意味を分けて覚えれば難しくありません。
1番目の引数には取り出したい項目の名前を、2番目の引数にはそのデータがあるテーブルやクエリの名前を指定します。
ここで押さえておきたいのが、2番目の引数に指定する「ドメイン」というAccessならではの考え方です。
Accessでいうドメインとは、データのかたまりであるテーブルや、計算・抽出した結果のクエリのことをまとめて指す言葉です。
DLookup関数では、元データのテーブルから取得する場合も、複雑な処理を経たクエリから取得する場合も、2番目の引数にその名前をダブルクォーテーション(”)で囲んで書くだけでOKです。
つまり、どこから引っ張ってくる場合でも、基本的な書き方は同じということをまず覚えておきましょう。
3番目の引数である「条件」は、たくさんあるデータの中から、どのデータを取ってくるかを決める一番大事な部分です。
「”社員ID = 10″」のように、項目名と探したい値を「=」などの記号でつないで書くのが一般的です。
もしこの条件を書かないと、エラーにはなりませんが、テーブルやクエリの一番上にあるデータが勝手に返ってきてしまいます。
思い通りのデータを正確に取ってくるには、この条件を正しく書くスキルが欠かせません。
特にデータ型によって書き方が変わるので、その違いをしっかり把握しておく必要があります。
2. データ型で変わる!条件の正しい書き方
DLookup関数を使うとき、初心者から中級者まで一番つまずきやすいのが、3番目の引数である条件の書き方です。
検索したい項目の「データ型」によって、条件として指定する値を囲む記号を変えなきゃいけないという、Accessならではの厳しいルールがあるんです。
まず、検索対象の項目が「数値型」の場合は、書き方がシンプルで分かりやすいです。
たとえば、商品IDが100番の単価を取りたいときは、条件を「”商品ID = 100″」のように、数値をそのまま書くだけで大丈夫です。
数値型の場合は値を特別な記号で囲む必要がないので、直感的に書けるのが特徴です。
一方、検索対象が「短いテキスト」や「長いテキスト」などの文字列として設定されている場合は、書き方に注意が必要です。
文字列の値を検索条件にするときは、指定する値をシングルクォーテーション(’)で囲まないと正しく動きません。
たとえば、担当者名が「山田」の部署名を取りたいときは、条件を「”担当者名 = ‘山田'”」と書く必要があります。
DLookup関数の引数全体を囲むダブルクォーテーション(”)の中に、さらに文字列の条件を書くので、内側をシングルクォーテーションにするという入れ子のルールになっているわけです。
さらに、検索対象が「日付/時刻型」の場合は、値をシャープ記号(#)で囲むというAccessならではの特別なルールがあります。
特定の日付のデータを取りたいときは、条件を「”売上日 = #2023/10/01#”」のように書いて、日付データだと認識させます。
実際の作業では、固定の値だけじゃなく、フォーム上のテキストボックスに入力された値を条件にしたい場面も多いですよね。
そんなときは、「”商品ID = ” & [Forms]![フォーム名]![テキストボックス名]」のように、アンパサンド(&)を使って固定の文字列部分と変わる値をつなげるテクニックが必要になります。
これらのデータ型ごとのルールを整理して覚えることが、エラーを防ぐ一番のコツです。
3. 別テーブル・クエリから複数の条件で値を取得する応用ワザ
実際にデータベースを使っていると、「商品IDが100番で、なおかつ担当者が山田さん」みたいに、複数の条件を組み合わせて特定の値を取りたいケースがよくあります。
DLookup関数で複数の条件を指定するには、3番目の引数の中で「AND」や「OR」といった論理演算子を使って書きます。
考え方はSQLのWHERE句と同じで、それぞれの条件を論理演算子でつなぐだけです。
たとえば、条件全体を「”商品ID = 100 AND 担当者 = ‘山田'”」と書けば、両方の条件を満たすデータから、ピンポイントで目的の値を取得できます。
複数条件を書くときに初心者がよくやってしまうミスが、クォーテーション記号の閉じ忘れや、半角スペースの入れ忘れによるエラーです。
特に、フォーム上の複数の入力欄の値を組み合わせて条件を作る場合は、「”商品ID = ” & [txtProductID] & ” AND 担当者 = ‘” & [txtManager] & “‘”」のように、記号とアンパサンドが複雑に入り混じることになります。
こんな長くて複雑な条件を書くときは、いきなりAccessの狭い画面に直接打ち込むんじゃなくて、一度メモ帳などに書き出して整理するのがおすすめです。
固定の文字列部分、変わる値の部分、文字列を囲む記号を見やすく区別することで、入力ミスをぐっと減らせます。
また、DLookup関数を使って別テーブルから複数のデータを取るとき、気をつけなきゃいけないのが処理速度の問題です。
DLookup関数は手軽でとても便利な反面、クエリの中で大量のデータに対して何度も実行すると、データベースの動きがすごく遅くなる原因になります。
数万件以上のデータがあるテーブルに対して、一覧画面の行ごとにDLookup関数を何度も実行させるような作り方は現実的じゃありません。
もし一覧表示などで大量の関連データを表示したいなら、DLookup関数に頼るんじゃなくて、クエリのリレーションシップ機能(テーブル結合)を使ってデータを取る設計に根本から見直すことが大切です。
4. DLookup関数でよくあるエラーと確実な対処法
DLookup関数を使っていると、書き方もデータ型の指定も正しいはずなのに、「実行時エラー」やコントロール上の「#エラー」という表示が出て、思い通りに値が取れないことがあります。
その一番よくある原因が、「指定した条件に合うデータがテーブルやクエリの中に一つも存在しなかった」というケースです。
DLookup関数は、条件に合うデータが見つからなかったとき、エラーメッセージを出すんじゃなくて「Null(空っぽの値)」を返すという仕様になっています。
このNullをテキストボックスに表示するだけなら画面が空白になるだけですが、その結果を使って計算しようとしたり、Nullを受け付けないVBAの変数に入れようとしたりすると、システム全体が止まるエラーを起こしてしまいます。
こんな厄介なNullエラーを防ぐための一番確実な方法が、「Nz関数」をDLookup関数と一緒に使うテクニックです。
Nz関数は、チェック対象の値がNullだったとき、あらかじめ指定しておいた別の安全な値(0や空の文字列など)に自動で変換してくれる便利な関数です。
使い方は簡単で、「=Nz(DLookup(“単価”, “商品マスタ”, “商品ID = 100”), 0)」のように、DLookup関数全体をNz関数で包むように書きます。
こうしておけば、もし商品IDが100のデータが見つからずDLookup関数がNullを返しても、外側のNz関数がそれをすぐに「0」に変えてくれるので、後の金額計算などで致命的なエラーが起きるのを完全に防げます。
さらに、エラー表示は出ないけど「まったく別のデータが取れてしまう」というトラブルも、実際の作業ではよく見かけます。
DLookup関数は、指定した条件に合うデータがテーブルの中に複数あった場合、その中で「一番最初に見つかったデータ」の値を無条件で返すという仕様になっています。
つまり、条件の指定が曖昧だと、本当に欲しい最新のデータじゃなくて、古い別のデータが取れてしまう危険性があるんです。
これを確実に防ぐには、検索条件として指定する項目(商品IDや社員IDなど)が、テーブル内で絶対に重複しない「主キー」や「一意のインデックス」として正しく設定されているかを確認することが欠かせません。
確実に一つだけ特定できる条件を指定して、Nz関数でNull対策もしておけば、DLookup関数はとても頼りになるデータベースツールになります。
広告
