1/05/2023

Excel。オートフィルターをつかわずに、該当するデータを別のセルに表示したい【Extract】

Excel。オートフィルターをつかわずに、該当するデータを別のセルに表示したい

<IF+ROW関数 IFERROR+INDEX+SMALL+ROW+COLUMN関数>

データベースや表から、該当する条件のデータを抽出して、別のセルに表示したい場合、オートフィルターでデータを抽出して、コピーをする。


この作業でもいいのですが、抽出条件が変わるとなると、オートフィルターで抽出してコピーするという作業が面倒になってきます。


そこで、数式だけで、対応することもできます。


A1:C8にデータがあって、G1のクラス名に合致するデータを、F4を起点として抽出表示したいわけです。


G1を「B」にしたら、クラスBのメンバーが抽出され表示するというものです。


最初は準備として、D2に次の数式を設定し、D8までオートフィルで数式をコピーします。


=IF(B2=$G$1,ROW()-1,"")


B列のデータと、G1のデータが合致したら、行番号-1を算出するという数式ですね。

ROW関数は行番号を算出します。

「-1」するのは、あとでINDEX関数をつかうのですが、座標がわかりやすくするために、「1」からの値にしたいからです。


今回は、データの1件目が2行目にありますので、「-1」すれば、「1」から表示することができます。


F4にメインとなる数式を設定します。

設定したら、オートフィルで数式をコピーします。


=IFERROR(INDEX($A$2:$C$8,SMALL($D$2:$D$8,ROW(A1)),COLUMN(A1)),"")


長い数式ですが、これだけで、該当するデータを抽出し表示することができます。

F4:H8まで数式を設定してあります。


それでは、数式を確認していきます。

最初のIFERROR関数ですが、データの件数が少ない場合、「#NUM!」というエラーが表示されてしまうので、その防止のためにIFERROR関数をつかっています。


INDEX関数は、設定した範囲の中から、指定した行番号と列番号のデータを抽出するという関数です。


最初の引数は、「配列」です。

「$A$2:$C$8」と設定します。

オートフィルで数式をコピーしますので、絶対参照を忘れないようにしましょう。


2番目の引数は、「行番号」です。

SMALL($D$2:$D$8,ROW(A1))

先程、IF関数で算出した結果を、SMALL関数を使い、1番小さい値を抽出させます。

1番小さい値、次に2番目の小さい値というようにしたいので、SMALL関数をつかい、さらに、ROW関数でA1を指定します。

オートフィルで数式をコピーすると、A1がA2とかわり、2番目・3番目に小さい値のある場所を見つけてくれるという仕組みです。


最後の引数は、「列番号」です。

COLUMN(A1)

こちらも、先程と同じ仕組みで、オートフィルで数式をコピーするときに、座標がズレるようにしています。


このように、INDEX関数をつかうことで、データを抽出することもできます。