いきなり答える備忘録

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

(Excel)FILTER関数で指定した列だけ抽出する

 ExcelのFILTER関数で、対象となる表のうち取得する列を指定し、その中で条件を満たす行を抽出する方法についてです。

  • FILTER関数とHSTACK関数を併用すれば、HSTACK関数で指定した列だけを対象としてFILTER関数を実行できます。
  • 抽出する列の見出しを用意しておき、CHOOSECOLS/XMATCH関数と併用する方法もあります。

抽出内容について

 画像にある5つの列を持つ表のうち、赤い枠で囲んだ3つの列だけを取得対象とし、条件(「魔力」の値が70以上)に該当する行を抽出するものとします。

HSTACK関数を併用する方法(列見出しを参照しない)

 H~J列を使って抽出を行っています。
 この3つの列にも行見出しを付けていますが、ここでは列見出しを抽出に使用してはいません。
 具体的にはH3セルに次のような式を入力しています。

 H3セル

=FILTER(HSTACK(B3:C7,E3:E7),E3:E7>=70)

 FILTER関数の第1引数を「HSTACK(B3:C7,E3:E7)」としています。これでFILTER関数の対象をはじめからB,C,Eの3つの列に絞り込んでいます。
 単純ですが、列見出しがない表でも問題なく抽出できるのがメリットです。



 HSTACK関数の内容を書き換えれば、取得する列の順番を入れ替えることができます(見出しの書き換えは手動によるものです)。

 H3セル

=FILTER(HSTACK(B3:B7,E3:E7,C3:C7),E3:E7>=70)

CHOOSECOLS/XMATCH関数を併用する方法(列見出しを参照する)

 こちらの方法ではH~J列の見出しを関数から参照し、同名の列を取得しています。
 具体的にはH3セルに次のような式を入力しています。

 H3セル

=FILTER(CHOOSECOLS(B3:F7,XMATCH(H2:J2,B2:F2)),E3:E7>=70)

 やや長いですがFILTER関数の第1引数を「CHOOSECOLS(B3:F7,XMATCH(H2:J2,B2:F2))」としています。XMATCH関数により、見出しの名前が元の表においてそれぞれ何列目にあるのかという配列つまり{1,2,4}が得られますので、これをCHOOSECOLS関数に渡すことで3つの列を抽出しています(見出しそのものを除く)。
 あとはFILTER関数で条件を満たす行を抽出しています。



 このやり方の場合、式はそのままでH~J列の見出しを入れ替えれば取得する列を入れ替えることができます。
 なおこの例では内側のXLOOKUP関数により{1,4,2}という配列が得られています。

備考

 上記の他に考えられるやり方として、FILTER関数をネストしてCOUNTIF関数と併用する方法があります。
 これも上記2つ目の例と同じく、H2:J2の範囲の見出しを参照し、元の表(データ)から同名の列を取得しようとするものです。

 H3セル

=FILTER(FILTER(B3:F7,COUNTIF(H2:J2,B2:F2)),E3:E7>=70)

 考え方がちょっと複雑ですが、まず内側のFILTER関数で3つの列を絞り込んでいます。ここでは「元の表の各列の見出し(B2:F2)が抽出側の見出し(H2:J2)内にそれぞれいくつあるか」をCOUNTIF関数で数えて(結果的に{1,1,0,1,0}という配列が得られます)、それをFILTER関数の抽出条件にしています。



 しかしこのやり方の場合、見出しの列名を入れ替えても得られる列の内容は入れ替わりません。
 内側のFILTER関数の抽出の仕方では、見出し(H2:J2)の順番を変えてもCOUNTIF関数で得られる配列{1,1,0,1,0}は変わらず、内側のFILTER関数の結果が変わらないからです。このやり方では見出しの順番を元の列の順番に沿ったものにしていないと正しい結果が得られません。

 式もそこそこ短いので、わかっていて利用する分には悪くないやり方ですが、注意する必要があります。