VLOOKUP関数を自作する 近似一致 編
前回は、VLOOKUP関数の完全一致の機能を自作関数(ユーザー定義関数)に仕上げてみました。
今回は、VLOOKUP関数のもう一つの検索方法の近似一致の機能を作ってみたいと思います。
引数や検索範囲の指定などは、前回と同じですが、近似一致を行うための機能に変更してみます。
VLOOKUP関数の近似一致
VLOOKUP関数は、第4引数に FALSE を指定して検索値の完全一致で使用するケースが多いと思います。
検索方法には、完全一致の他に近似一致が用意されています。
近似一致は、指定した値の下方での最大値を取得するような動作となります。
自作のVLOOKUP関数(近似一致)を作る前に、VLOOKUP関数の近似一致をおさらいしましょう。
4つの引数を指定します。
=VLOOKUP ( 検索値, 検索範囲, 列番号, [検索方法] )
検索値: 検索する値を指定します。
検索範囲: 検索対象となる範囲を指定します。
列番号: 検索にヒットした時、抽出する列を指定します。
[検索方法]: 完全一致(FALSE)か近似一致(TRUE)を指定します。
第3引数の「列番号」は、シート上の列ではなく、検索範囲での列になります。
今回は近似一致の機能を試すので、検索方法 TRUE にします。
以下は使用例です。

近似一致の動作
近似一致は、基準値の下方での最大値をえますので、基準となる値は上から小さい順に並んでいなければ上手く動作しません。
今回の場合は「年齢」が基準値となります。

イメージとしては、以下のような感じで、0~5歳までが幼児。6~12歳までが小学生。
という風に選択されるようになります。

このように、近似一致では、基準値は数値を指定する事になります。
用途としては、年齢による種別や、配送業などで重さや距離などにより料金が決まるようなシチュエーションで役立つでしょう。
独自のVLOOKUP関数(近似一致)を作る
最初に答えを言いますと、前回のプログラムからの変更点は少なくて、とても簡単に作れてしまいます。最初にコードをみていきます。
プログラムはユーザ定義関数として、標準モジュールに書きます。
'近似一致
Function myVlookup2(検索値 As Long, 列番号 As Long) As Variant '①
Dim i As Long
Dim v As Variant
v = ""
With Worksheets("料金体系")
For i = 3 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, "A") >= 検索値 Then '②
v = .Cells(i, "A").Offset(0, 列番号 - 1)
Exit For
End If
Next i
End With
myVlookup2 = v
End Function
引数は前回のプログラムと同じで2つだけです。
第一引数はVLOOKUP関数と同じ検索値を指定します。
第二引数は、列番号でヒットした時の検索範囲の列番号を指定します。
検索範囲は、関数の中に埋め込んでいます。(シート名が前回とは異なります。)
基準値(年齢)の項目が空白の場合は、VLOOKUP関数ではエラーとなりましたが、今回の自作関数でも値が無い場合は空白が返るようになっています。
プログラムの変更点を解説します。
まず、返り値はLong型にしています。①
近似一致では数値の大小で検索しますので、文字列などでは都合が悪くなります。
②では検索値との比較部分です。
If .Cells(i, “A”) >= 検索値 Then ’②
ここでは、前回の完全一致が = だったのに対して、近似一致では >= に変更しているだけです。
前回の自作VLOOKUP関数(完全一致)のプログラムは、こちらにあります。
まとめ
VLOOKUP関数の近似一致は、わかりずらいので使うのを避けている方もいるかもしれません。
(そもそも使うシチュエーションが無ければ無理に使う必要もありませんが,,,)
ただ自作関数を作ってみると意外に簡単に実現できてしまったのは驚きでした。
キモとなるのは、検索データの基準値が小さい順に並んでいる事で、プログラムが簡単になるという点です。
作ってみると VLOOKUP関数の近似一致の動作原理も見えてきた気がします。
自作関数にする時は、検索データの基準値を大きい順に並べたい場合にも簡単に対応できるでしょう。
自作できるようになれば、痒いところに手が届くツールを手に入れる事ができるでしょう。
コメント