(Excel)XLOOKUP関数の検索モードの使い方

省略または1を指定した場合(先頭から検索)

 次の画像ではF3セルにXLOOKUP関数を使った数式を入力し、E3セルに入力されている商品(もも)を表から検索して対応する価格(280)を抽出しています。
 なお、検索範囲であるB列には「もも」が2つあることが注意点です。

 F3セル

=XLOOKUP(E3,B3:B9,C3:C9)

 この式では検索モード(第6引数)を指定していません。
 このとき第1引数(もも=検索値)を、第2引数の範囲(B3:B9=検索範囲)内の先頭(上)から順に検索します。そして見つかった位置に対応する第3引数(C3:C9=戻り範囲)内の値を取得します。
 先頭から順に検索するので、検索値が複数ある場合には一番上にあるものが見つかり、それに対応する値を取得します。



 「1」を指定しても全く同じです。
 つまり既定値(デフォルト。指定を省略したときに適用される値)は1です。

-1を指定した場合(末尾から検索)

 次の画像では検索モードを「-1」としています。
 E3セルの値(もも)は変わっていませんが、抽出されている値が250に変わっています。
 2つある「もも」のうち下にある方が検索により見つかっているからです。

 F3セル

=XLOOKUP(E3,B3:B9,C3:C9,,,-1)

 第6引数(検索モード)を「-1」とすると、第1引数(もも=検索値)を、第2引数の範囲(B3:B9=検索範囲)内の末尾(下)から順に検索します。そして見つかった位置に対応する第3引数(C3:C9=戻り範囲)内の値を取得します。
 末尾から順に検索するので、検索値が複数ある場合には一番下にあるものが見つかり、それに対応する値を取得します。


 なお、検索範囲内に検索値が3つ以上ある場合に、2番目のものを見つけたいと思っても基本的にできません。
 そのような場合は、FILTER関数を使って条件に該当するデータを一括(すべて)抽出するの適当です。ただし具体例は省略します。

2を指定した場合(バイナリ検索・昇順対応)

 検索モードとして「2」(及び「-2」)を指定する目的は検索の高速化です。
 ただしデータの並べ方が制約されるので、以下で実例を見てみます。


 次の画像では、左側の表に「商品ID」という列が加わり3列になっています。
 G3セルにXLOOKUP関数を使った数式を入力し、F3セルの商品ID(6)を表から検索して対応する価格(230)を抽出しています。
 ただし商品IDは昇順(小さい順)とし、XLOOKUP関数の検索モードを「2」としていることがポイントです。

 G3セル

=XLOOKUP(F3,B3:B9,D3:D9,,,2)

 検索モードを「2」とすると、次のような検索が行われます。

  1. 検索値を、検索範囲内の真ん中の位置にある値と比較し、一致したら対応する戻り範囲の値を抽出して終了します。
  2. 検索値の方が小さい(大きい)場合は検索範囲の上半分(下半分)のうち真ん中の位置にある値と比較し、一致したら対応する戻り範囲の値を抽出して終了します。
  3. 同様に、比較するごとに検索範囲の残り半分を比較対象から除き、残った半分の範囲のうち真ん中の位置にある値と比較することを繰り返します。比較対象がなくなったら終了します。
 つまり検索範囲(ここではB列の商品ID)内の値が昇順で並んでいることを前提として、先頭や末尾から1つ1つ比較するのではなく飛ばし飛ばしに比較することで比較回数を減らしています。ただし次の例でみるようなソートの不備によるエラーのリスクもありますので、速度に大きな不満がない限りこの設定を意識する必要はないと思われます。



 上記のように検索範囲内の値が昇順となっていることが前提なので、商品IDの並びが昇順でないと検索に失敗します。
 次の画像は「6,キウイ,230」の行を表の上半分に移動させた様子です。XLOOKUP関数は最初に検索値(6)と検索範囲内の真ん中の位置(B6セル)にある「3」を比較し、検索値の方が大きいためそれ以降は表の上半分を検索しません。よって「6」は最後まで見つからずエラーとなります。

 もちろん値の並び方によっては偶然見つかる場合もありますが、昇順にしておかないとたいていは検索に失敗してエラーとなります。

-2を指定した場合(バイナリ検索・降順対応)

 次の画像の左側の表は、1つ上の例の表を上下逆に並べ替えたものです。
 G3セルにXLOOKUP関数を使った数式を入力し、F3セルの商品ID(6)を表から検索して対応する価格(230)を抽出しています。
 商品IDが降順(大きい順)で、XLOOKUP関数の検索モードが「-2」となっていることがポイントです。

 G3セル

=XLOOKUP(F3,B3:B9,D3:D9,,,-2)

 検索の進め方は1つ上の例と同様ですが、検索値と検索範囲内の値が一致しないときに次に進む方向(上下)が逆になります。
 よって商品IDの並びが降順でないと(偶然見つかるような位置にない限り)検索に失敗します。



 次の画像は「6,キウイ,230」の行を表の下半分に移動させた様子です。XLOOKUP関数は最初に検索値(6)と検索範囲内の真ん中の位置(B6セル)にある「3」を比較し、検索値の方が大きいためそれ以降は表の下半分を検索しません。よって「6」は最後まで見つからずエラーとなります。