ExcelのVLOOKUP関数(第4引数TRUEによる近似値検索)を実現する

 Accessで別表から値を参照・抽出するとき、完全一致検索であれば結合(Join)あるいはDLookUp関数を普通に用いて実現することができますが、ExcelのVLOOKUP関数による近似値検索に該当する関数や機能は基本的にありません。
 しかし実現は難しくありませんのでやってみます。

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

 まずはExcelの例です。
 左側の表には各個人のスコアが記されていて、右側の表にはランク判断基準が記されています。ランクの判断については画像にも注釈がありますが、例えばAランクはスコア80以上90未満に該当します。


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

 各個人のランクを表示させてみます。
 左側の表の最初の空欄に次のように入力します。
 最初の引数は検索値(70)を、2番目の引数は右側の表の範囲を、3番目の引数は参照しようとする列の番号(2…ランク記号が記録されているのは左から2番目の列)を、そして4番目の引数は完全一致検索ではなく近似値検索を行うことを表しています。


=VLOOKUP($D3,$H$3:$I$7,2,TRUE)


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

 ランク「B」が表示されました。


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

 後はドラッグすれば各個人のスコアに応じたランクが表示されます。
 決して難しくはありませんが、右側の表については下限スコアの昇順にしておかなければならなかったり、ランク列が下限スコア列より右側になければならない(左側にあると列番号が指定できず参照できない)といった制約があり、なかなか面倒なところであります。


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

 さてAccessに移ります。
 まず同じようなテーブルを作ります。こちらが成績テーブルです。


f:id:accs2014:20171224093943p:plain:right:w300

 こちらはランクテーブルです。


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

 クエリデザイン画面です。
 両方のテーブルを表示させ(線で結合しないこと)、各列を表示します。
 そして下限スコア列の抽出条件に次のように記します。これにより各個人のスコアに対応する下限スコアが抽出され、結果的にランクもそれに応じたものが表示されます。
 なお、データ型を考慮してVal関数を置いていますがなくても作動します。

Val(DMax("下限スコア","ランクテーブル","下限スコア <= " & [スコア]))


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

 データシートビューです。
 ランクテーブルの内容に面倒な制約がつかないあたりはExcelより楽かと思います。


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

 ちなみに値を直接引きたい場合は次のような表記が考えられます。
 クエリの場合は上記のやり方の方が扱いやすいと思いますが、フォームでテキストボックスに入力された値から直接ランクを求めるような場合には使えるかもしれません。



ランク: DLookUp("ランク","ランクテーブル","下限スコア = " & DMax("下限スコア","ランクテーブル","下限スコア <= " & [スコア]))