いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)クロス表からデータを検索・取得する

 Excelで、検索値に基づいて表の中の行と列を特定し、行と列が交差するセルのデータを取得する方法についてです。

  • XLOOKUP関数を使ってクロス表からデータを抽出することができます。ネストは必要ですが1つの関数で済むのがメリットです。
  • オーソドックスな方法としてINDEX関数とXMATCH関数を組み合わせる方法もあります。

手順

クロス表からの検索とは

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

f:id:accs2014:20200815171815p:plain:w700

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

XLOOKUP関数を使う方法

 VLOOKUP/HLOOKUP関数の後継関数、XLOOKUP関数を使う方法です。
 縦方向の検索、横方向の検索の両方を行うことができるため、この関数だけで検索できるのがポイントです。

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

f:id:accs2014:20200815120903p:plain:w780

=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」が得られました。

f:id:accs2014:20200815120907p:plain:w700

 XLOOKUP関数は引数の与え方によって行方向の検索も列方向の検索もできるため、VLOOKUP関数やINDEX関数による検索に比べて動作が把握しにくいかもしれません。しかし(通常用いられる完全一致検索の場合は)引数も少なく済み、第2引数(検索範囲)と第3引数(戻り範囲)の設定の自由度が高く柔軟な検索が可能であるなど、メリットが大きい関数です。

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

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

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

f:id:accs2014:20200815120911p:plain:w780

 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」が取得できているのがわかります。

f:id:accs2014:20200815120915p:plain:w700