いまさら聞けないExcelの使い方講座
【Excel】XLOOKUP関数を応用してクロス表から簡単にデータを取得する方法
2023年8月2日 06:55
XLOOKUP関数なら定番のINDEX & MATCH関数は不要
「縦」「横」の交差する箇所に必要な情報を掲載する「クロス表」は、料金表や商品カタログのスペック表などでよく見かけます。目的の1箇所の情報を確認するには便利ですが、条件を切り替えながら該当のデータを抽出したり、一覧形式に集計したりする時には少し面倒です。
例えば、以下のような料金表で「中学生」「1日パス」の料金は「4,800円」です。上端の見出しから「中学生」を探して、左端の「1日パス」を目で追ったと思います。では「大人」「ナイトパス」は? 同じく目視で「大人」で「ナイトパス」と探すでしょう。
この程度のサイズの表でも目視では時間がかかりますよね。できれば、セルG1とG2に入力した値から自動的に料金を取得できる仕掛けを作りたいところです。
定番のテクニックでは、INDEX関数とMATCH関数を組み合わせます。詳しくは、以前に紹介した記事も参考にしてください。
INDEXとMATCHは従来からある関数なので、エクセルのバージョンの互換性を心配しなくてもいいのですが、数式が少し複雑に感じるかもしれません。もし、Microsoft 365のExcel、Excel 2021を使っているなら、XLOOKUP関数を使って、クロス表からデータを抽出する方法を覚えておくと便利です。
XLOOKUP関数の構文
最初にXLOOKUP関数の構文を見てみましょう。6つの引数のうち、最初の[検索値][検索範囲][戻り範囲]の3つの引数を指定すれば動作します。引数の名前は、そのまま引数の役割です。今回紹介するテクニックでも[検索値][検索範囲][戻り範囲]しか使いません。
XLOOKUP関数をネストする
以下の数式をセルG3に入力すると、セルG1とG2の値を参照してクロス表からデータを抽出可能です。
=XLOOKUP(G1,B1:D1,XLOOKUP(G2,A2:A6,B2:D6))
これだけでは何をやっているのかわかりにくいため、XLOOKUP関数の構文と見比べながら数式の内容を見ていきましょう。入力した数式は、XLOOKUP関数の引数として、XLOOKUP関数をネストしています。
内側の数式は「XLOOKUP(G2,A2:A6,B2:D6)」です。セルG2の値を[検索値]、セルA2~A6が[検索範囲]となります。[戻り範囲]はセルB2~D6と指定しているので、結果はスピルで3列表示されるはずです。試しに「=XLOOKUP(G2,A2:A6,B2:D6)」と入力してみましょう。
内側のXLOOKUP関数の結果を「スピル」で取得しているのがポイントです。この結果を外側のXLOOKUP関数の引数[戻り範囲]に指定すると、[検索値]のセルG1の値を[検索範囲]のセルB1~D1から探して、{5800, 4800, 2400}という配列から該当するデータを返します。
スピルで得られた配列(セルG5~I5)は「G5#」と表現できるので、「=XLOOKUP(G1,B1:D1,G5#)」と入力してみます。
ここでは、横方向へスピルして「5800」「4800」「2400」と配列を取得しましたが、外側と内側のXLOOKUP関数の数式は逆でも構いません。以下のような数式です。
=XLOOKUP(G2,A2:A6,XLOOKUP(G1,B1:D1,B2:D6))
この場合、内側の数式で得られる結果はスピルで、{4500, 4800, 4000, 4200, 4000}のような配列となります。
一覧表に埋め込む
同様の数式を利用して、クロス表のデータを一覧表に埋め込むことも可能です。ただし、数式のコピー時にセル参照がズレないように、[検索範囲]と[戻り範囲]のセル範囲は“絶対参照”で指定してください。
一覧表に入力された値に対応するデータをクロス表から抽出するには、先ほど入力した数式を調整して以下のようになります。
=XLOOKUP(B2,G1:I1,XLOOKUP(C2,F2:F6,G2:I6))
しかし、このままオートフィルでコピーすると[検索範囲]と[戻り範囲]のセル範囲がズレてしまいます。絶対参照を使った数式を入力しましょう。
=XLOOKUP(B2,$G$1:$I$1,XLOOKUP(C2,$F$2:$F$6,$G$2:$I$6))
XLOOKUP関数のネストは応用範囲が広い
ここでは、2つのXLOOKUP関数をネストしてクロス表からデータを抽出する方法を紹介しました。関数の結果をスピルとして取得することに慣れると単純なミスの防止にもつながります。スピルは既存の関数にも使えるので、ぜひ活用してください。