INDEX関数とMATCH関数を組み合わせることで、表やテーブル内の値を自由自在に検索することができます。INDEX関数の引数にMATCH関数を使用するので数式は少し長くなりますが、理解してしまえば難しい事はありません。
VLOOKUP関数はテーブルの左端に検査値が必要ですが、この関数の組み合わせではその制限はありません。VLOOKUP関数の上位互換と考えていいでしょう。
INDEX関数の使い方
INDEX関数は範囲内で指定した行と指定した列が交差したセルの値を返します。構文は配列形式と参照形式の2種類がありますが、参照形式は割愛します。
配列形式
=INDEX(配列, 行番号, [列番号])
…配列の中から指定した行番号と指定した列番号が交差するセルの値を返します。
- 配列
省略不可。セル範囲を指定します。
- 行番号
省略不可。ただし、セル範囲が1行の場合はここを列番号に置き換えることができます。
- 列番号
省略可。セル範囲が1列の場合は省略できます。
INDEX関数の引数を省略すると極端に可読性が悪くなります。引数は省略しないことをおすすめします。
- 配列(範囲)を指定する
- 行番号を指定する(範囲の中で何行目かを指定する)
- 列番号を指定する(範囲の中で何列目かを指定する)
INDEX関数のサンプル
=INDEX(C3:G6,2,4)
C3:G6内で2行目と4列目の交点はF4です。F4の値が2なので2を返します。
仕組みはとても簡単です。サンプルは行番号と列番号を値で指定しましたが、セル参照させることもできます。行番号用のセルと列番号用のセルを用意すれば、入力した数値で戻り値が変化します。
- 配列から行番号や列番号がはみ出すと#REF!を返します。
INDEX関数は座標を割り出す関数です。
MATCH関数の使い方
MATCH関数は検索範囲内から検索値の位置を返す関数です。単独で使用するケースはあまりなく、INDEX関数やVLOOKUP関数等と組み合わせて使用する機会が多い関数です。
=MATCH(検査値,検査範囲,[照合の種類])
…検査範囲の中から検査値を検索し、何番目に見つかるかを数値で返します。
- 検査値
省略不可。検査範囲の中で検索する値を指定します。数値、文字列、論理値(TRUE or FALSE)またはこれらに対するセル参照も指定できます。
- 検査範囲
省略不可。検索範囲を指定します。
- 照合の種類
省略可。省略すると既定値の1が適用されます。1、0、-1のいずれかの数値で指定します。数値の意味は下表の通りです。
照合の種類 動作 1 検査値以下の最大値の位置を返します。検査範囲は昇順に並んでいる必要があります。 0 検査値と等しい値の最初の位置を返します。 -1 検査値以上の最小値の位置を返します。検査範囲は降順に並んでいる必要があります。 検査範囲の中に検査値が複数ある場合、最初に見つかった位置を返すので注意が必要です(2つ目以降は抽出されない)。
- 探す値を指定する
- 探す範囲を指定する
- 照合方法を指定する…等しい値を探すなら基本0でOK
処理時間にこだわるなら照合の種類の1と-1も使いこなせた方がいいです。線形探索と2分探索を勉強すれば理解できます(その内別記事で解説します)。
MATCH関数のサンプル
テーブル内で日付を検索するサンプルです。検査範囲C2:G2の中で検査値12/4を検索します。
範囲内で4番目に見つかるので4を返します。
MATCH関数は検査値の位置を返す関数です。位置を他の関数の引数にあてることによって、その関数の参照範囲などを可変させることができます。
MATCH関数とINDEX関数を組みわせたサンプル
INDEX関数とMATCH関数を組み合わせます。
- INDEX関数=座標を割り出す関数
- MATCH関数=検査値の位置を返す関数
要は、INDEX関数+MATCH関数=「表の見出しを数値に置き換えて座標を割り出す関数」になります。
=INDEX(C3:G6,MATCH(D8,B3:B6,0),MATCH(B8,C2:G2,0))
C3:G6内で氏名と日付を指定して検索します。
- MATCH(D8,B3:B6,0)で谷風 長道を検索し、1を返します。
- MATCH(B8,C2:G2,0))で12/4を検索し、4を返します。
- =INDEX(C3:G6,1,4)となり25を返します。
INDEX関数の配列の中から行と列をMATCH関数の検査値で指定して検索するこの形をテンプレートとして覚えて下さい。テーブル内でのデータ検索の基本になります。
=INDEX(C3:C6,MATCH(B8,B3:B6,0),1)
先ほどのサンプルと違い、行方向のみで検索を行うサンプルです。
- MATCH(B8,B3:B6,0)で谷風 長道を検索し、1を返します。
- INDEX(C3:C6,1,1)となり10を返します。
VLOOKUP関数は検査値がテーブルの左端にある必要がありますが、INDEX関数とMATCH関数の組み合わせではその制限はありません。
=INDEX(A3:A6,MATCH(B8,B3:B6,0),1)でA列の中から値を返すこともできます。
INDEX関数とMATCH関数の組み合わせはVLOOKUP関数より便利
行見出しと列見出しで検索する場合はVLOOKUP関数のみでは代用できません。INDEX関数とMATCH関数を組み合わせて検索します。行見出しのみ場合、検査値が検索値より左にあればVLOOKUP関数が使えます。
私は使い分けはしていません。全てINDEX関数+MATCH関数の組み合わせを使用しています。
値を検索する作業を人間がやっていては時間の無駄です。INDEX関数とMATCH関数を使いこなして仕事時間を短縮してください。
この関数の組み合わせは慣れれば簡単です。どちらかというと「検索に容易に対応できる表の作成」の方が難しいです。
ここではINDEX関数とMATCH関数の組み合わせを説明しましたが、OFFSET関数とMATCH関数の組み合わせも便利です。別記事で解説しているので是非ご覧下さい。