Index関数 - より適応範囲の広い検索のために
Vlookup関数やHlookup関数は使用機会も多くとても便利ですが、万能というわけではありません。もっと一般性を持った検索ができるIndex関数を用いることによって、Vlookupではできなかった様々な検索や集計ができるようになります。
オフィシャルサイトでは様々な使い方が紹介されていますが、主に使うことが多いのは3種類ではないかと思います。
最初の使い方は、1列または1行の範囲から、検索を行う方法です。よく、Vlookup関数で対応できないような場合(返したい値の列が検索値の含まれる列より左にある、など)に用いられることがあります。
=INDEX(参照したい値を含む列, MATCH(検索値, 検索する値を含む列, 0))
指定した範囲の中で、(上から、または左から)何番目の数字か、を2番目の引数で指定します。ここに直接数字を打ち込んでしまってはあまりIndex関数を使うメリットがありません。そうではなく、行番号と列番号の取得にMatch関数を使って、検索に柔軟性を持たせる使い方をすることが多いのではないでしょうか。
2番目の使い方は、配列から交差するセルを見つける方法です。まず、検索範囲の配列を指定し、行番号(上から下に向けて何番目か)と列番号(左から右に向けて何番目か)を2・3番目の引数に指定します。前述したように、行番号と列番号に直接数字を打ち込むのではなく、Match関数を(2回)使いましょう。
=INDEX(参照したい値を含む範囲, MATCH関数, MATCH関数)
3番目の使い方は、行番号または列番号に0(または空欄)を入力することにより、配列を返す方法です。関数の結果として配列が返ってくるということは、その配列をさらに別の関数でネストすることにより、様々な処理ができるということです。この使い方の方が、Index関数の便利さをよりよく実感できると思いますので、今回はこちらをメインに話すことにします。
例えば、経理やレポーティングで働く際に、以下のような構造のデータを定期的に受け取る、という場面があるのではないでしょうか。
垂直方向に会計科目や商品名、また水平方向に子会社や店舗、などです。当たり前のように目にする表です。しかし、実はこのような構造の表は、データベースから取り出すRawDataと比べると、集計や分析などを目的としたユーザーにとっては親切な構造ではありません。
理由は色々ありますが、上記のような分割表(クロス表)の主な欠点としては、データを様々な角度から集計・分析したいときに、(RawDataのテーブルに比べて)処理が煩雑になってしまうということです。例えば「支店ごと(縦)に、商品カテゴリA・B・Cそれぞれに属する商品の売上を(横に)集計」することを考えてみます。以下のような集計用のシートがあるとします。
Sumifs関数を使うことは容易に想像できますが、もとのデータでは店舗がそれぞれの列に広がってしまっているという問題があるため、このままでは直接集計することはできません。
また、当然ながらそのままピボットテーブルにすることもできません。実際に行ってみればすぐに分かりますが、店舗や子会社の名前がそれぞれ別の変数のタイトルのように扱われてしまうためです。
ここで、配列を返してくれるIndex関数が役に立ちます。Sumifs関数の集計範囲にIndex関数を使うことによって、左右に広がっている列の中から、自動的に対象範囲を選んでくれます。
=SUMIFS(INDEX(集計したい列を含む範囲,0, MATCH関数), 条件範囲1, 条件1, 条件範囲2, 条件2, ...)
(Sheet1にクロス表データがあります。)
0を入力するというのは、少し違和感があるかもしれませんが、「行は一つに指定せずに全部選択する」というイメージで捉えると理解しやすいかもしれません。
もちろん、Sumifs関数以外でも、配列を引数にする関数であれば何でも使用できますので、様々の指標の値を店舗ごとに並べることができます。Countifsでも、Averageifsでも大丈夫です。
上記で行っていることは、「2次元(縦と横)に広がる集計表を、フラットデータと同じように集計することを可能にしている」ということです。そこまで大したことないように思えなくもないのですが、ただ実際にIndex関数以外の方法で同じ集計を行おうとすると、不必要な過程が増えてブック全体の構成が混沌としてきます。是非、縦横の表を見たら「Index関数でそのまま集計できる」と覚えていても損はありません。
最初に触れたように、Vlookup関数は万能ではありません。Index関数の方が適応範囲が遥かに広く、「Vlookup関数でできることはIndex関数(Match関数と併用)で可能」です。しかし、Index関数もやはり万能ではなく、もう少し複雑な検索になると対応できないことがあります。そのような場合は、やはり配列関数の力が必要になります。
上記を踏まえると、エクセルでの検索機能の適応範囲は以下のようになっています。
Vlookup関数 < Index関数 << 配列関数
作りをシンプルにするためにも、必要のない状況で難しい関数を使うことは避けましょう。「Vlookup関数は使ってはいけない」というような記事やコメントを目にしたことがありますが、そのようなことは絶対にないと思います。もちろん、Vlookupには多くの弱点がありますが、そこは状況に応じてIndex関数や配列関数を使い分ければよいのではないでしょうか。ただし、その「使い分け」ができず、Vlookupのみの限られた検索や集計ができないようでは、限られた見解しか得ることができません。Index関数は適応ケースが非常に多いですので、是非ともマスターするようにしてください。