いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)クロス抽出をする方法

 [※2022年12月更新]
 Excelで、2つの検索値から表の行と列を特定し、行と列が交差するセルのデータを取得する、いわゆるクロス抽出の方法です。

  • XLOOKUP関数を使ってクロス表からデータを抽出することができます。1種類の関数で済み、関数のネストを用いない抽出も可能です。
  • オーソドックスな方法としてINDEX関数とXMATCH関数を組み合わせる方法もあります。

手順

クロス抽出とは

 そもそもの検索の対象と抽出の考え方についてです。
 次の画像のB2:F7の範囲にある「売上集計」と名付けられた表がクロス表です。B列(B3:B7)には店舗の名称が並んでおり、2行目(C2:F2)には4月~7月の月名が並んでいます。
 店舗と月を特定してその行と列が交差するセルを参照することで、その店舗のその月の売上高がわかります。例えば「池袋店」の「6月」の売り上げは「9031」であることがわかります。これがクロス表からのデータ検索の考え方です。

 そこで以下では、H3セルに入力された店舗と、I3セルに入力された月に基づき、J3セルに式を入力して売上高を検索する例を試してみます。

XLOOKUP関数を使う方法(その1)

 XLOOKUP関数を用いる、比較的新しい方法です。
 関数のネスト(入れ子)は必要ですがXLOOKUP関数だけで済みます。


 画像ではJ3セルに次のように入力しています。


=XLOOKUP(I3,C2:F2,XLOOKUP(H3,B3:B7,C3:F7))

 まず内側の「XLOOKUP(H3,B3:B7,C3:F7)」により、「C3:F7の中で『B3:B7内での池袋店の位置』に対応する行(つまり2行目)」を得ることができます。
 これによりC3:C7の範囲のうち2行目の内容、つまり「9440」「10423」「9031」「12510」という4つの数字の配列が得られます。
 さらにこの結果に対してXLOOKUP関数を適用することにより、「『9440』『10423』『9031』『12510』の中で『C2:F2内での6月の位置』に対応する列(つまり3列目)」を得ることができます。
 4つの数字のうち3列目(3番目)の値は「9031」ですので、最終的にこの値が得られることとなります。
 

 確定すると「9031」が得られました。

XLOOKUP関数を使う方法(その2)

 同じくXLOOKUP関数を使う方法です。
 少し変わった式になり、関数の動作解釈も上記の方法とは異なるものになりますが、関数のネスト(入れ子)を要しないのがポイントです。


 画像ではJ3セルに次のような式を入力しています。


=XLOOKUP(H3,B3:B7,C3:F7) XLOOKUP(I3,C2:F2,C3:F7)

 珍しい感じの式ですが、XLOOKUP関数の戻り値がセル範囲参照($C$3のような)と同様に扱えることと、半角スペースが「2つの範囲の共通部分を抽出する演算子」として使えることを利用しています。
 最初の「XLOOKUP(H3,B3:B7,C3:F7)」により、「C3:F7の中で『B3:B7内での池袋店の位置』に対応する行(=2行目)」への参照を得ることができます。これによりC3:C7の範囲のうち2行目、つまりC4:F4の範囲が得られます。
 次の「XLOOKUP(I3,C2:F2,C3:F7)」により、「C3:F7の中で『C2:F2内での6月の位置』に対応する列(=3列目)」への参照を得ることができます。これによりC3:C7の範囲のうち3列目、つまりE3:E7の範囲が得られます。
 これらの2つの式を半角スペース(共通部分演算子)でつなぐことにより、「C4:F4」と「E3:E7」の共通部分である「E4」が得られます。


 確定すると、E4セルに記録されている数値「9031」が得られました。

 なお、XLOOKUP関数と参照演算子(コロンやスペース)の組み合わせや、それを可能にするXLOOKUP関数の動作について次の記事でも紹介しています。

www.officeisyours.com

INDEX関数とXMATCH関数を使う方法

 従来多用されてきた方法です。
 本来はXMATCH関数でなくMATCH関数でしたが、比較的新しい関数であるXMATCH関数を使えば(完全一致検索をするための)引数を省略できるのでXMATCHを用いることとします。

 画像ではJ3セルに次のような式を入力しています。

 J3セル

=INDEX(C3:F7,XMATCH(H3,B3:B7),XMATCH(I3,C2:F2))

 INDEX関数は「=INDEX(表の範囲,表内行番号,表内列番号)」とすることで、表内のその位置にある値を抽出する関数です。まさにこの手の検索のためにあるような関数です。
 ただし、この例では行番号や列番号を直接指定するのではなく、店名と月から番号を特定する必要があります。そこで配列内の位置を返す関数、XMATCH関数を用います。「XMATCH(H3,B3:B7)」は「B3:B7の範囲で『池袋店』が何番目にあるか」を返します。また、「XMATCH(I3,C2:F2)」は「C2:F2の範囲で『6月』が何番目にあるか」を返します。
 2つのXMATCH関数はそれぞれ「2」と「3」という結果を返しますので、上記の式は次の式と同じ意味となります。ここまで来れば結果が見えてくると思います。

=INDEX(C3:F7,2,3)

 

 そして結果は次の画像のようになります。
 「池袋店」の行にあり、かつ「6月」の列にある数値、つまり「9031」が取得できているのがわかります。

逆の抽出について

 表内の検索値から見出し(行・列)を抽出する方法について、次の記事で紹介しています。

www.officeisyours.com