いまさら聞けないExcelの使い方講座
【Excel】目視とコピペでクロス表から特定条件のデータを抽出するのは非効率!
クロス表のデータを参照して別の表を完成させる処理
2023年5月31日 06:55
「縦」「横」の交差するクロス表からデータを抽出する
以前、一覧表のデータをクロス表にまとめる方法を紹介しました。以下は会員種別と利用時間の一覧表を「縦」「横」の交差するクロス表に集計するサンプルです。利用するのはSUMIF関数のみ。慣れれば意外と簡単です。
では、クロス表にまとめられたデータを参照して、一覧表に埋め込むには? 似たような処理に思えますが、SUMIF関数は使いません。定番のテクニックとして「INDEX関数とMATCH関数」または「VLOOKUP関数とMATCH関数」の2つがあります。順番に見ていきましょう。
①INDEX関数とMATCH関数を組み合わせる
INDEX関数とMATCH関数をそれぞれ単独で使う人は限られるでしょう。今回の例のように、クロス表から縦・横の交差する位置のデータを取得する時に組み合わせて使われます。
INDEX関数は、セル範囲から「行」と「列」の交差する位置の値を求めます。MATCH関数は、検索値がセル範囲の何番目にあるかを返します。構文は以下の通りです。
以下の例では、利用時間(デイ・ナイト)と会員種別(ゴールド・シルバー・一般)のクロス表に金額が入力されています。一覧表の「会員種別」列と「利用時間」列に入力されたデータから、クロス表で該当のデータを取り出したい状況です。
まずはINDEX関数で「ゴールド」会員で「デイ」利用の金額を取得してみます。該当のデータは、セルG2~I3の範囲で1行目1列目ですから、「=INDEX(G2:I3,1,1)」という数式で目的の金額「1,900」を取得できます。
取得した金額は正しいですが、いちいち“何行目”“何列目”の数値を指定するのは現実的ではありませんよね。そこで、検索値の位置情報をMATCH関数で調べて、INDEX関数の引数とするわけです。
検索値とする「ゴールド」「デイ」のデータは一覧表に入力済みです。これらの位置をMATCH関数で取得すると、「ゴールド」は「MATCH(B2,G1:I1,0)」、「デイ」は「MATCH(C2,F2:F3,0)」となります。INDEX関数に指定する引数の順番を間違えないように注意してください。
この数式を下方向にコピーすることを考えて、参照方式を“絶対参照”に切り替えると以下のようになります。MATCH関数の引数[検索値]となる「C2」と「B2」以外はすべて絶対参照です。
②VLOOKUP関数とMATCH関数を組み合わせる
VLOOKUP関数とMATCH関数を組み合わせて、クロス表からデータを取得するテクニックもよく使われます。同じサンプルを利用するので結果も同じですが、数式の構造が異なります。
例えば「ゴールド」会員で「デイ」利用の金額をVLOOKUP関数で取得することを考えると、引数[列番号]の指定で困るはずです。
[列番号]は会員種別(B列の値)によって切り替わるため、VLOOKUP関数の[列番号]に固定の数値は指定できませんよね。ここでMATCH関数の出番です。
MATCH関数の結果の数値が、VLOOKUP関数の[列番号]になるのがポイントです。セルF1を含めて「MATCH(B2,F1:I1,0)」とすると、「ゴールド」(セルB2)は2番目、つまり結果は「2」となります。VLOOKUP関数の[範囲](F1:I3)の2列目は「ゴールド」列ですよね。
下方向へのコピーを考えた時の数式は以下の通り。VLOOKUP関数の[検索値](C2)とMATCH関数の[検索値](B2)は相対参照のまま、残りの引数はすべて“絶対参照”にしておきます。
関数ごとに処理を切り分けて考えよう
INDEX関数とMATCH関数、VLOOKUP関数とMATCH関数の組み合わせは、クロス表のデータを取得する定番のテクニックです。複雑な数式に見えますが、関数ごとに処理を分けて考えると理解できるはずです。