DLookUp関数による値の抽出と結合(Join)による値の抽出

 ExcelにはVLOOKUP関数やINDEX関数、MATCH関数といったような、別表から値を参照・抽出することを目的とした関数が多数あります。
 一方Accessでは”レコードの順番”とか”レコードの位置により値を指定する”といった概念がありませんので、INDEX関数やMATCH関数のような関数は存在しませんし、かろうじてDLookUp関数がVLOOKUP関数に近い働きをするぐらいです。
 それでもクエリにおける結合(Join)という機能でたいてい事足りるため特に不自由はせず、DLookUp関数もそれほど多用するわけではないのですが、Accessに触れ始めの頃は「値は関数で引っ張ってくるもの」という感覚で、値の抽出の際にDLookuUp関数に依存することがあるかもしれません。

 そこで、ここではDLookUp関数により別表から値を抽出する例と、それを結合(Join)に置き換える例を少し見てみます。

単一の条件(値)により抽出する例

f:id:accs2014:20171231164930p:plain:right:w400

 このような受付テーブルがあります。
 単純な予約受付簿です。


f:id:accs2014:20171231164926p:plain:right:w400

 こちらは顧客テーブルです。
 受付テーブルと顧客テーブルの両方に顧客番号(予約者)が記されていますので…


f:id:accs2014:20171231164923p:plain:right:w500

 これらのテーブルをもとに、このようなデータ(クエリ)を作成することができます。
 

f:id:accs2014:20171231164918p:plain:right:w600

 このクエリはDLookUp関数を利用して作成しています。具体的には、まずデザインビューにて受付テーブルを表示して下部のデザイングリッドにて各列を選択するとともに、次のような2つの列を設けて、顧客テーブルから値を抽出しています。

氏名: DLookUp("氏名","顧客テーブル","顧客番号 = " & [顧客番号])
住所: DLookUp("住所","顧客テーブル","顧客番号 = " & [顧客番号])

 Excelのようにセルごとに関数の内容を切り替えられるような柔軟さはありませんが、関数を記すのは各列ごとに1回ずつですので、だいぶ手間が省けるのがわかります。


f:id:accs2014:20171231164914p:plain:right:w600

 しかし結合(Join)による抽出はさらに簡単です。
 デザインビューに両方のテーブルを置き、値抽出のキーとなっている「顧客番号」を線で結びます(一方からもう一方に向けてドラッグ)。あとは下部のデザイングリッドにて各テーブルの各列を選択します。


f:id:accs2014:20171231165039p:plain:right:w500

 データシートビューです。
 得られるデータは全く同一です。


複数の条件(値)により抽出する例

f:id:accs2014:20171231165034p:plain:right:w500

 さて次の例です。
 これも受付テーブルですが、顧客番号(予約者)の代わりに、棟記号と部屋番号(予約対象)が記録されています。


f:id:accs2014:20171231165029p:plain:right:w450

 一方、こちらが部屋テーブルです。
 それぞれの部屋は、棟記号と部屋番号の2つの値が揃ってはじめて特定されます(同じ棟記号に属する部屋は複数あり、同じ部屋番号の部屋も複数あるが、両方が同じ部屋は存在しない)。


f:id:accs2014:20171231165018p:plain:right:w500

 このとき、これらのテーブルをもとに、このようなデータ(クエリ)を作成することができます。


f:id:accs2014:20171231165025p:plain:right:w600

 これもDLookUp関数を用いて作成されています。
 やはりデザインビューに受付テーブルを置いたうえで、次のような2つの列を設けます。



部屋タイプ: DLookUp("部屋タイプ","部屋テーブル","[棟記号]='" & [棟記号] & "' And 部屋番号 = " & [部屋番号])
面積: DLookUp("面積","部屋テーブル","[棟記号]='" & [棟記号] & "' And 部屋番号 = " & [部屋番号])

 式はちょっと長くなりますが、複数の条件(棟記号と部屋番号)をもとに値を抽出する例となっています(棟記号のところにあるシングルクォーテーション(')の存在に注意してください)。
 ExcelのVLOOKUP関数ですと複数の条件を設けることができません(よって値を連結したような列を設けなければならない)ので、この辺りはAccessが優秀という気がします。

 ※上記データシートビューからわかるように面積は文字列型となって抽出されています。数値型にしたい場合は上記関数をVal関数で囲めばOKです。


f:id:accs2014:20171231165131p:plain:right:w600

 しかし、これも結合を用いればもっと簡単です。
 2つのテーブルを置いて、値抽出のキーとなっている2つの列を線でつなぐだけです。


f:id:accs2014:20171231165128p:plain:right:w500

 データシートビューです。
 得られるデータはDLookUp関数によるものと基本的に同一です。


複合的な例

f:id:accs2014:20171231165122p:plain:right:w600

 さて、最後に複合例です。
 受付テーブルに顧客番号(予約者)と棟番号、部屋番号(予約対象)が記録されています。


f:id:accs2014:20171231165117p:plain:right:w600

 こうなるとDLookUp関数を記入していくのも面倒になってきますので省略し、結合による抽出の例のみ示します。
 やはり3つのテーブルを表示して、それぞれの値抽出のキーとなっている列を線でつなぐだけです。 

 慣れないうちはDLookUp関数で抽出する方が抽出内容を把握しやすい(まず受付テーブルを基礎に置いてデータを抽出するという感覚)かもしれませんが、慣れれば結合の方が断然楽になります。デザインビューの内容から一目瞭然で、視覚的に把握しやすいのがポイントです。


f:id:accs2014:20171231165111p:plain:right:w650

 データシートビューです。


備考

 いくつか例をみてみましたが、複数のテーブルから値を抽出する場合には、一般には結合を用いるのが簡単です。
 ただし、抽出条件によっては何がどう抽出されているのか把握することが難しい場合もありますし、ときには最初の例のようにメインとなるテーブルを1つ置いてあとは「値を関数で引っ張ってくる」方が安全確実な場合もあります(メインのテーブルが抽出から漏れることがないため)ので、使い分けも大事になります。