はじめに
VLOOKUP 関数はデータ抽出を行う際に非常に便利な関数ですが、
ある2つの関数を組み合わせることで、VLOOKUP関数と同等の(もしくはそれ以上の)動作を実現できます。
その2つの関数とは、INDEX関数とMATCH関数です。
このページでは、INDEX関数とMATCH関数を組み合わせたデータ抽出方法をご紹介します。
なお VLOOKUP関数について詳しく知りたい方は下記リンクをどうぞ。
MATCH 関数と INDEX 関数
まず、MATCH関数とINDEX関数について説明します。そして、その2つを組み合わせを用いたデータ抽出方法をご紹介します。
MATCH 関数
指定したキーワードがデータの何行目にあるかを調べる関数です。
MATCH関数の書式
検査値
指定するキーワードのことです。
検査範囲
キーワードを検索するデータの範囲のことです。
照合の種類
下記の値を指定します。文字検索として MATCH関数を使用する場合、「0」を指定します。
- 1 → 以下
- 0 → 完全一致
- -1 → 以上
具体例
例えば、下記画面のようなデータがあるとし、名前が「山田」のデータが何行目にあるかを調べます。
まず、検査値として「山田」のセル(E2)とし、検査範囲を下記赤枠のデータ範囲(A1:A6)、照合の種類を完全一致(0)とします。
そうすると、下記左側のデータでは4行目に「山田」のデータが存在するため、「4」という値になります。
INDEX 関数
あるデータ範囲の指定した行と列番号の値を調べる関数です。
INDEX関数の書式
配列
調べるデータ範囲のことです。
行番号 & 列番号
データ範囲から調べたいデータの行番号と列番号を指定します。
※ 【配列】(調べるデータ範囲)が1列のみの場合は、列番号は省略可能です。
具体例
例えば、下記画面のようなデータの4行2列にあるデータを調べたいとする場合は下記のようにします。
データ範囲(青色の枠)の4行2列目のデータは、「156」となります。
MATCH × INDEX 関数
もう一度おさらいしますと、
- MATCH 関数 → あるデータが何行目にあるかがわかる
- INDEX 関数 → あるデータ範囲の指定した行番号と列番号のデータがわかる
これを組み合わせると、MATCH関数であるデータの行番号がわかり、INDEX関数でその行番号の別の列のデータがわかるんです。
つまりこれは、VLOOKUP関数と同じ動作(あるデータから別の列のデータを取得する)です。
下記画面は【氏名】が「山田」の【身長】のデータを抽出する場合の例です。
MATCH × INDEX 関数の書式
少し難しく見えるかもしれませんが、要は INDEX 関数の行番号の部分を MATCH 関数に置き換えただけです。
INDEX関数は下記の書式でした。
=INDEX(配列,行番号,列番号)
これの行番号にMATCH関数の書式を加えただけです。
=INDEX(配列,行番号,列番号) → =INDEX(配列,MATCH(検査値,検査範囲,照合の種類),列番号)
具体例
では下記のようなデータがあり、【氏名】が「山田」の【身長】はいくつかを調べます。
(1)まずは「山田」が何行目にあるかを調べます。これは MATCH 関数でさきほどと同様に記述し、4行目にあるとわかります。
(2)次に INDEX 関数を追加します。INDEX関数の行番号を指定する箇所にMATCH関数をそのまま貼り付ければOKです。
INDEX × MATCH関数を書きなれていない方は、まず先にMATCH関数を書いてからINDEX関数を書くことをお勧めします!
※ INDEX × MATCH関数 は検索した値がない場合は「0」が返されます。もし「0」ではなく空欄で返したい場合は下記リンクを参考にしてください。
VLOOKUP 関数との違い
① MATCH×INDEX関数には、検索キーワードを1列目にする制約がない!
下記ページにも記載していますが、VLOOKUP関数では、検索キーワードを1列目にする制約があります。
その制約が MATCH× INDEX 関数にはなく、優れた関数といえます。
➁ 膨大なデータの場合、若干 MATCH×INDEX関数のほうが速い!
これは、私の仕事の同僚(システムエンジニアとして20年勤めているベテラン)の聞いた話ですが、
いままでは6件ほどの少ないデータを例に挙げていましたが、何十万件でのデータとなると VLOOKUP関数よりも処理が速くなるそうです。
最後に
いかがでしたでしょうか?
MATCH 関数と INDEX 関数は、2つの関数をただ組み合わせるだけで VLOOKUP関数と同等かそれ以上の優れた関数になります。
もちろん VLOOKUP 関数で書けば1つの関数で処理が終わるというメリットもあります。
しかし、VLOOKUP関数を使っていると、エラーになってうまく動作しないということがあると思います。
そういう場合はぜひ MATCH×INDEX関数を使ってみてください。