Excelでリストから特定のデータを抽出する関数として、有名なのはVLOOKUPかと思います。
しかし、「INDEX」と「MATCH」の組み合わせ数式がVLOOKUPの完全上位互換になるため、VLOOKUPを使用する意味はあまりありません。
特に難易度も変わりませんし、どちらかを覚えるなら断然INDEX関数をおすすめします。
このページではINDEX&MATCHの使い方をはじめ、VLOOKUPを使わないほうがいい理由と、INDEX&MATCHがどのように優れているかについて解説します。
VLOOKUPを多用している方にとっては新しい選択肢を提供できる内容となっていますので、ぜひご一読ください。
VLOOKUPをおすすめしない理由
まずはINDEX&MATCH関数とVLOOKUP関数について、それぞれのシンプルな使用例を見てください。
このような販売記録のリストがあったとして、「販売物名」をキーに「売上」や「販売日」を抽出する場合、青枠のセルにはそれぞれ次のような数式を入力します。
(売 上)=INDEX(D5:D13,MATCH(F7,C5:C13,0))
(販売日)=INDEX(B5:B13,MATCH(F7,C5:C13,0))
売上の例では、「INDEX(D5:D13,」で抽出列を指定しておき、「MATCH(F7,C5:C13,0)」では「C5:C13」の範囲から「F7」の値(”キャベツ”)が何行目にあるのかを検索する仕組みです。
(売 上)=VLOOKUP(F11,C5:D13,2,FALSE)
(販売日)抽出不可(キー列より左側にあるため)
VLOOKUPは指定範囲の一番左側にある列をキー列とする決まりがあります。
売上の例で仕組みを解説すると、「C5:D13」で範囲を指定した場合、その範囲の一番左側の列の「C5:C13」がキー列になります。
売上は抽出できますが、販売日はキー列より左側にあるため抽出できません。
試しに、販売日とキー列を含む範囲を指定した「=VLOOKUP(F11,B5:C13,0,FALSE)」という数式を入力しても、当然ながらエラーになります。
「B5:C13」を指定した場合、キー列は「B5:B13」の販売日となり、販売日から”キャベツ”を検索するという意味不明な数式になるわけです。
豆知識&VLOOKUPをおすすめしない理由まとめ
INDEX&MATCHとVLOOKUPによる抽出を比較対象として例示しましたが、このような単列指定の抽出ならわざわざVLOOKUPを使わなくても「LOOKUP」という関数で対応できます。
LOOKUP関数はVLOOKUPやHLOOKUPに比べて認知度が低いように思いますが、LOOKUP系関数のひとつで、単列指定での抽出ができるというものです。
LOOKUP関数には「ベクトル型」と「配列型」、2つの使い方がありますが、ここではシンプルなベクトル型だけ紹介します。
使い方は次のとおり。とてもシンプルです。(ベクトル型)
=LOOKUP(検索値,検索範囲,対応範囲)
「検索値」は特定の値で、それが「検索範囲」の上から何番目にあるかを検索し、「対応範囲」の上から同じ位置にある値を抽出します。(「検索範囲」と「対応範囲」の指定行数は同じでなければエラーとなります。)
先ほどの表で使い方を例示するなら次のように記載します。
(売 上)=LOOKUP(F7,C5:C13,D5:D13)
(販売日)=LOOKUP(F7,C5:C13,B5:B13)
単列指定でデータ抽出をするならVLOOKUPよりLOOKUPのほうが明らかに向いています。
抽出列を直接範囲指定するため列番号の指定は不要で、検索範囲が左端に来るように意識する必要もありません。
列番号を指定する必要がなということは、表に列を追加挿入したりする場合などでも列番号の修正が必要なくなり、メンテナンス性にも優れるということです。
LOOKUP関数のほうが適しているときでも、VLOOKUPを使っていることが多いのではないでしょうか。
少なくとも私の周囲ではそういった事例をよく見かけます。
ただ、これはこれでいいと思います。たくさんの類似関数を覚えるのは実務上効率が悪いとも言えるからです。
人間、あれもこれも覚えて実践的に使いこなすのは難しいですし。
目的別に、できるだけ多くのケースで共通使用できる上位互換の関数を1つ覚えて、使い慣れておくことが本当の意味で効率的ではないでしょうか。
ここであらためて整理すると、LOOKUP系関数には次の4種類があります。
種類 | 概要 |
---|---|
LOOKUP | 垂直方向、単列指定、単列抽出 |
VLOOKUP | 垂直方向、表指定、単列抽出 |
HLOOKUP | 水平方向、表指定、単行抽出 |
XLOOKUP | 多機能抽出(後述)、現在サブスク版のみ使用可能 |
この中で、まだ普及が限定的なXLOOKUPを除いたとき、残り3種類できることはINDEX&MATCH関数でほぼすべてできます。
INDEX&MATCH関数を使ったほうがいい理由はこのためです。
便宜上、使いやすいINDEX&MATCH関数を紹介していますが、OFFSET&MATCH関数でも同じことができます。
どちらを使うかは好みによるところもありますが、たぶん多くの方にとってINDEX&MATCH関数のほうが理解しやすいのではないかと思います。
VLOOKUP関数とINDEX関数との主な違い
主な違いは次のとおりです。
ポイント | VLOOKUP | INDEX&MATCH |
---|---|---|
キー列の位置 | 抽出列が キー列より右側に来るように指定(キー列の左側の値は抽出不可) | キー列の左右位置に制限はない(キー列の左右どちらの値でも抽出可能) |
範囲指定 | キー列から抽出列までをまとめて指定 | キー列と抽出列を別々に指定(それぞれ同じ範囲を指定することも可能) |
抽出列の指定 | 必須 | 抽出列を1列のみ指定した場合は省略可 |
繰り返しになりますが、最大の違いはキー列の位置制限にあります。
VLOOKUPはキー列が必ず抽出列の左側に来なければ機能しないため、キー列より左側の列からの抽出はできません。
その点、INDEXとMATCHの組み合わせによる抽出はキー列の左右どちら側にある列からも抽出できるため、自由度の高い抽出ができます。
また、 VLOOKUPは抽出列がキー列から右側へ何列目かを整数で指定する必要があるため、表の列数が多い場合、抽出列がキー列から右に何列目かを数えるのは少しめんどうです。
さらに、列の入れ替えなどを行った場合、忘れずに数式を修正しないと結果が狂う危険性もあります。
INDEX&MATCHであれば抽出列を1列のみ指定することでそういった心配はなくなりますし、列の入れ替えをしても通常はExcelが勝手に数式を修正してくれます。
もちろん、抽出列の番号指定についてはVLOOKUPでも表のタイトル行をMatch関数で特定することができます。
例えば
=VLOOKUP(F11,C5:D13,MATCH(“売上”,B4:D4,0),FALSE)
という具合です。
図解するとこうなります。
VLOOKUPを使用する場合でも、継続的に入力していく表などは後々のメンテナンス性を考慮して抽出列の番号指定はMatch関数を使用するなど、動的な数式を作るのが良いと思います。
INDEX&MATCH関数の構造
前段のサンプルはよく使う例として、抽出範囲を単列(1列)で指定し、行のみをMatch関数で検索する方法を紹介しました。
これはこれで短く実用的な数式ですが、INDEX&MATCH関数の真価は、抽出範囲を複数行指定し、抽出列も検索させることができる点にあります。
先程と同じ表で、「キャベツの売上」の抽出例を書くと次のようになります。
MATCH関数が2つ記載されていますが、左側のMatchでは「行」を検索し、右側のMatchでは「列」を検索しています。
表の中で、この「行番号」と「列番号」が交わるセルのデータを抽出する、というわけです。
数式はパッと見で嫌になりそうな長さですが、この例でMatch関数の検索値は、行が「6」、列が「3」になります。
つまり、MATCH関数の部分を検索値で置き換えると、
=INDEX(B5:D13,6,3)
この「6」と「3」の部分をMATCH関数で検索指定しているだけです。
あらためてINDEX関数の構成を見ると、
=INDEX( 抽出範囲 , 行番号 , 列番号 )
たったこれだけなんです。
INDEX関数では最初に抽出範囲を指定して、あとはMatch関数で「行」と「列」を検索するという仕組みです。抽出範囲を単列(1列)で指定した場合、「列」の検索は省略できます。
なので、INDEX&MATCH関数のポイントはMATCH関数の理解にあるのかもしれません。
まとめ
データ抽出はとても便利な機能です。
とくにINDEX&MATCH関数は抽出の自由度が高く、表を作成する際も、キー列の位置を意識しなくいいのでおすすめです。
今回はキャベツ1点のデータを抽出する方法を例示しましたが、本来はオートフィルなどを使って複数のセルに連続してデータを抽出する使い方が多いと思います。
その場合は、INDEX関数の「抽出範囲」や、MATCH関数の「検索範囲」を”絶対参照”という方法で指定する必要があります。
絶対参照については次のページで紹介していますのでぜひご参考ください。
新機能のXLOOKUP関数について
これまでINDEX&MATCHの組み合わせがベストと説明してきましたが、じつは上でも少しだけ触れたように今はXLOOKUPという新しい関数がリリースされています。
サブスクリプション版のOffice365に、2020年2月のアップデートで追加された機能です。
XLOOKUPは、今回紹介したINDEX&MATCHでできることに加えて、「処理結果がエラーとなった場合にどうするか」という通常はIFERROR関数を組み合わせて行うような処理も標準装備されています。
いわば「 INDEX & MATCH & IFERROR 」の合体関数というすばらしいもので、XLOOKUPは今後利用されるケースが増えていくことは間違いないと思います。
ただし、Office365またはOffice2021以降でしか使用できないため、Excelファイルを他者と共有する必要があるなど、旧バージョンとの互換性を持たせておくことが必要なケースではご注意ください。
コメント
コメント一覧 (1件)
I woulld likke tto thank you for the efforts you’ve puut in penning this blog.
I’m hhoping to check out the same high-grade blog posts by you lwter
on as well. In truth, your creative writing abilities hhas inspired me to get
my own, personal site now 😉 https://WWW.Waste-Ndc.pro/community/profile/tressa79906983/