いきなり答える備忘録

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

(Excel)FILTER関数の代用となる関数の例

 FILTER関数が使えない旧バージョンのExcelで、他の関数を組み合わせて同様の結果を得る(条件に合う値・行をすべて抽出する)方法を紹介します。
 絶対参照の知識が必要となるのでご留意ください。もちろんフィルタ機能を使うのも一つの方法です。
 (※動作はExcel2010で確認していますが、記事中の画面はMicrosoft 365で実行したものです)

手順

 次の画像の左側の表から、県名がF3セルの値(石川県)と一致する行を抽出するものとします。
 まずH3セルに次のように入力します。

 H3セル

=COUNTIF(B$3:B3,F$3)

 「B3セルからその行のセルまでにある、F3セルと同じ値をカウントする」という式ですが、ここではわかりにくいので以下でもう一度触れます。



 これをH9セルまでフィルコピー(H3セルの右下の四角をH9セルまでドラッグ)します。
 すると各セルに数値が表示されます。この数値は条件に該当する行において1,2…と加算され、その他の行では0または上の行と同じ値になっているのがわかります。

 


 ここでH9セルを選択すると、数式が「=COUNTIF(B$3:B9,F$3)」となっています。
 繰り返しになりますが、この式は「B3セルからその行のセルまでにある、F3セルと同じ値をカウントしている」ということがわかります。絶対参照($)の効果をご確認ください。



 あとは数値が加算されている行(1,2…の値が初めて出現する行)の値を、表から抽出すればよいことがわかります。
 そこでI3セルに次のように入力します。

 I3セル

=INDEX(B$3:B$9,MATCH(ROW(A1),$H$3:$H$9,0))

 MATCH関数によりH3:H9の範囲から1(=ROW(A1))が初めて出現する位置(上からn番目)を検索し、INDEX関数によりB3:B9の範囲からその位置にある値を抽出する、という内容です。
 INDEX関数の第1引数(抽出範囲)が「B$3:B$9」で、列については絶対参照($)がないことがポイントです。これにより以降で行う横方向へのフィルコピーによりC列、D列の値を抽出することができます。



 この式をI9セルまでフィルコピー(I3セルの右下の四角をI9セルまでドラッグ。ここではダブルクリックでもいいです)すると3つの「石川県」の値が抽出できました。

 


 そのままI3:I9の範囲を選択した状態で、I9セルからK9セルまでフィルコピー(I9セルの右下の四角をK9セルまでドラッグ)すれば完成です。

 


 ここでK5セルを選択すると、数式は次のようになっています。

 K5セル

=INDEX(D$3:D$9,MATCH(ROW(C3),$H$3:$H$9,0))

 H3:H9の範囲から3(=ROW(C3))が初めて出現する位置(上からn番目。ここでは6番目となる)を検索し、D3:D9の範囲からその位置の値(6番目=247)を抽出する、という式になっています。



 #N/Aエラーを表示させたくない場合は、IFERROR関数を使って次のようにします。
 以下の例でも同様ですが、以下では省略します。

 I3セル(I9セルへ→K9セルへフィルコピー)

=IFERROR(INDEX(B$3:B$9,MATCH(ROW(A1),$H$3:$H$9,0)),"")

複数条件の場合

 AND/OR条件で抽出する例です。
 一部使用する関数が異なるだけで基本的な考え方や手順は上記例と同様ですので、説明は手短にします。

AND条件の例

 左の表の内容は上記例と同じです。
 ここでは面積を条件とするものとし、「面積がF3セルの値以上、かつG3セルの値以下」である行を抽出するものとします。

 まずはI3セルに次の式を入力してI9セルにフィルコピーします。

 I3セル(I9セルまでフィルコピー)

=COUNTIFS(D$3:D3,">="&F$3,D$3:D3,"<="&G$3)

 最初の例ではCOUNTIF関数を使いましたが、ここではCOUNTIFS関数でAND条件のカウントを行っています。



 あとは最初の例と同様にJ3セルに次の式を入力し、J9セルへ、さらにJ9セルからL9セルへフィルコピーすれば完成です。

 J3セル(J9セルへ→L9セルへフィルコピー)

=INDEX(B$3:B$9,MATCH(ROW(A1),$I$3:$I$9,0))

 参照範囲が異なるだけで最初の例と同様です。

OR条件の例

 ここでは「面積がF3セルの値以上、またはG3セルの値以下」である行を抽出するものとします。
 まずはI3セル、J3セルにそれぞれ次の式を入力して適宜フィルコピーすれば完成です。

 I3セル(I9セルまでフィルコピー)

=SUMPRODUCT(((D$3:D3>=F$3)+(D$3:D3<=G$3)>0)*1)

 スピルがないバージョンにおいてOR条件でカウントする際に重要なSUMPRODUCT関数を使っています。
 2つの条件をカッコで囲むことでそれぞれの条件が満たされれば1となります。これを足し算し、結果が0でなければ(つまり少なくとも一方の条件を満たせば=OR条件)TRUEとなります。さらにカッコで囲んで「*1」をつけることでTRUEが「1」に変換されカウントされます。かなり面倒ですが慣れるしかありません。

 J3セル(J9セルへ→L9セルへフィルコピー)

=INDEX(B$3:B$9,MATCH(ROW(A1),$I$3:$I$9,0))

 参照範囲が異なるだけで最初の例と同様です。

備考

 連番の生成にROW関数を使っているので行・列の操作にご注意ください。例えばA列や1行目が削除されると式に「=ROW(A1)」を含むセルは「#REF」エラーになります。