こんにちはmasalifeです。
Accessの力を最大限に発揮させるためには、関数の知識が必要不可欠です。
僕が多くのシステム構築をしてきた経験から、
この関数は覚えといた方がいい
というものを順に紹介していきたいと思います。
今回紹介するのは、
DLookup関数
です。
テーブルやクエリから指定した条件のフィールドの値を参照する
ときに使います。
DLookup関数を使いこなせるようになると、作成する入力フォームの機能が充実します。
Accessでツール構築をしている方、したい方は知っていないと損ですよ。
DLookup関数とは?
【構文】
microsoft-officeサポートでは次のように示されています。
DLookup(expr, domain[, criteria])
*microsoft-officeサポートより引用
引数 | 省略の可否 | 説明 |
expr | 否 | 参照するフィールド名 |
domain | 否 | 参照するテーブル名・クエリ名 |
criteria | 可 | 抽出条件 |
*criteriaを省略すると全レコードが対象となる。
クエリでの使用:異なるテーブルから値を参照する
使用頻度は高くないですが、クエリを使って、異なるテーブルから値を参照してみます。
T_会員ごと使用日(テーブル)には会員IDの情報しかないため、該当の会員名をT_会員マスタ(テーブル)から参照してフィールドに表示させます。
クエリをデザインビューで開いて、T_会員ごと使用日のテーブルを追加します。
新たなフィールドに、
会員名: DLookUp(“会員名”,”T_会員マスタ”,”会員ID = ‘” & [会員ID] & “‘”)
と記述します。
*抽出条件は会員IDのデータ型がテキスト型の場合の記述方法
記述した引数を整理すると次のとおりとなります。
引数 | 説明 |
“会員名” | 会員名を参照したいので、会員名フィールドを指定 |
“T_会員マスタ” | 参照したい会員名フィールドがあるT_会員マスタテーブルを指定 |
“会員ID = ‘” & [会員ID] & “‘” | ・T_会員マスタテーブルの会員IDフィールドの値とデザインしているクエリの会員IDフィールドが一致の条件を指定 ・ただし、この記述は会員IDフィールドのデータ定義がテキスト型に有効 ・数値型の場合は“会員ID = ” & [会員ID]と記述 |
重要な点として、クエリのフィールドを指定するときは[]で囲む必要があります。
“会員ID = ‘” & [会員ID] & “‘” の最初の会員IDはT_会員マスタの会員IDフィールドで次の会員IDはクエリの会員IDフィールドであることを明示しています。
クエリを実行すると、
正しく参照されていることが確認できます。
感のいい方はすでにお気づきだと思いますが、実際にはこの使い方の出番はほとんどありません。
なぜなら、クエリのリレーションシップで簡単に同様の参照ができるからです。
方法はクエリをデザインビューで開いて、2つのテーブル(T_会員ごと使用日・T_会員マスタ)を追加し、関連付ける項目である会員IDのフィールドをクリックしながら、もう一方のテーブルの会員IDフィールドにドラッグします。
フォーム(VBA)での使用:参照する値をメッセージとして出す
DLookup関数はフォームにVBAを組み込んで使用するのがメジャーです。
一例として、フォーム上から参照した値をメッセージボックスに出すプログラムを作成してみましょう。
作成する機能とフォームの概要は次のとおりです。
会員IDを選択して、【誕生日は?】のボタンをクリックすると、
該当の会員名と誕生日をテーブル(T_会員マスタ)から参照し、メッセージが表示される仕様とします。
参照するテーブル(T_会員マスタ)は次のとおりです。
ボタンに記述するVBAは次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub btn誕生日_Click() Dim name As String Dim birthday As String name = DLookup("会員名", "T_会員マスタ", "会員ID = Forms![F_誕生日]![cmb会員ID]") birthday = DLookup("誕生日", "T_会員マスタ", "会員ID = Forms![F_誕生日]![cmb会員ID]") MsgBox name & "の誕生日は" & birthday & "です" End Sub |
criteria(抽出条件)を“会員ID = Forms![F_誕生日]![cmb会員ID]”とすることにより、
選択した会員IDにより参照する値が切り替わります。
「ユーザーが選択した条件で参照する値を流動的に変化させることができる」点でフォームと相性がいい関数と言えます。
その他の使い方が気になる方はこちらを読んでください。
こんにちはmasalifeです。 今回はwebフォームでよく見かける 「郵便番号を入力したら、住所が自動で入力される機能」 をAccessで作る方法を紹介します。 作るイメージは次のとおりです。 […]
DLookup関数の注意点
次の場合は対象レコードの中から先頭のレコードが選ばれるという点に注意してください。
・引数criteria(抽出条件)を省略
・1レコードに絞りこめない抽出条件を指定
例えば、【目次1.3 フォーム(VBA)での使用:参照する値をメッセージとして出す 】のT_会員マスタに格納されているデータが次であった場合、
会員IDを4と選択して実行すると、
会員IDが4の2つのレコード(間瀬 次郎・6月15日/都築 誠・3月3日)の中で先頭のレコードである(間瀬 次郎・6月15日)が選択されます。
今回の例だと、会員IDは通常、一意の値であるべきなのに対して、重複した値が入っているのが不適切であるといえます。
抽出条件を指定する際には、そもそものテーブルがDLookup関数を使用するのに適切であるかを考えることも重要です。
さいごに
DLookup関数を使って、フォームの機能を充実させることにチャレンジしてみてください。
入力の効率化、検索の効率化に必ず繋がると思います。
最後まで読んでいただきありがとうございます。