いきなり答える備忘録

Google Workspace(旧G Suite)・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)クロス抽出の逆の抽出をする

 Excelで、クロス抽出とは逆に表内の値から見出し列(行)の内容を抽出する方法です。

  • XLOOKUP関数とTOCOL関数等を使って、クロス抽出とは逆に検索値から見出しを抽出できます。
  • FILTER関数とTOCOL関数等を使えば、同じ検索値が複数ある場合に見出しをすべて抽出できます。

手順

見出しを1組だけ抽出する場合

 画像では、G3セルに入力されている担当者名を担当表から検索し、対応する見出し(日、時間帯)の2つの値を求めています。
 (H3セルには表示形式「日付」を適用しています)

 具体的にはH3セル、I3セルに次のような式を入力して求めています。

 H3,I3セル

=XLOOKUP(G3,TOCOL(C3:E6),TOCOL(IF(B3:B6&C2:E2<>"",B3:B6)))
=XLOOKUP(G3,TOCOL(C3:E6),TOCOL(IF(B3:B6&C2:E2<>"",C2:E2)))

 

 H3セル(日付を抽出する)の例で詳細を見てみます。

 XLOOKUP関数の第2引数「TOCOL(C3:E6)」で担当者名を縦1列に並べています。
 同じく第3引数の「TOCOL(IF(B3:B6&C2:E2<>"",B3:B6))」で、日付を縦1列に並べています。このときIF関数で(ムリヤリ)各日付を3つ(=時間帯の見出しの数)ずつ生成して縦に並べることで、横に並んだ日付と担当者の対応付けが元の担当表における対応付けと同じものになります。
 あとはこの2つの列に対しXLOOKUPで担当者名を検索すれば、担当者名に対応する日付が得られるというわけです。時間帯についても理屈は同じです。


 複数の氏名を検索する場合はスピルを利用します。2つの式の第1引数をそれぞれ「G3:G4」に置き換えるだけでOKです。

 以下は備考です。

  • 元の表の見出しに何も入ってないと(IF関数の内容が原因で)おかしな結果になります。
  • 検索値(担当者名)が複数見つかる場合、最も上の行の最も左のセルに対応する見出しが返ります。左を優先したい場合は関数をいじっても出来ますが元の表をTRANSPOSEした方が早いです。
  • 上記の2つの式の第3引数をHSTACKで1つにまとめれば1つの式で2列出力できます。ただし検索値(担当者名)を複数与えたときに左の列(日)しか返りません。
  • 要はデータを縦持ちにしておいた方が表の加工も検索も楽、という話に帰着します。

該当する見出しをすべて抽出する場合

 上記のXLOOKUP関数をFILTER関数に簡単に置き換えれば、検索値(担当者名)が複数存在するときに、対応する見出しをすべて抽出することができます。
 (H3セル以降には表示形式「日付」を適用しています)

 H3,I3セル

=FILTER(TOCOL(IF(B3:B6&C2:E2<>"",B3:B6)),TOCOL(C3:E6)=G3)
=FILTER(TOCOL(IF(B3:B6&C2:E2<>"",C2:E2)),TOCOL(C3:E6)=G3)

 考え方はXLOOKUPの例と全く同じで、関数の特性により条件の与え方が異なるだけです。
 備考についてもXLOOKUPの例とおおむね同様です。


 なお細かい話になりますが一発で2列出力させるときに引数をHSTACKするより見出し同士の直積を作って検索した方が早そうな感じがします。ただ、比較的簡単に生成するやり方だと数値や日付が文字列になってしまう難点があります。

 H3セル

=LET(x,FILTER(TOCOL(B3:B6&"_"&C2:E2),TOCOL(C3:E6)=G3),
HSTACK(TEXTBEFORE(x,"_"),TEXTAFTER(x,"_"))
)