INDEX+SMALLで複数一致を順に抽出|Excel 2019・2016の補助列方式

FILTERなしで 複数行を抽出。無料Excelサンプル付き。

FILTERが使えないExcelでは、条件に一致した行の位置を補助列へ記録し、SMALLで1番目・2番目・3番目の位置を取り出します。その位置をINDEXへ渡すと、該当する明細を順番に表示できます。

この記事の基本の式
数式=IFERROR(INDEX($B$11:$E$14,SMALL($F$11:$F$14,ROWS($A$6:A6)),COLUMNS($A$6:A6)),"")
練習用Excelファイル(無料ダウンロード)
A3の伝票Noに一致する明細をA6:D8へ表示する例題です。元表はA11:E14、位置番号の補助列はF列です。Microsoft 365で利用できます。Excel 2019・2016向けの操作も本文で説明しています。
Excelファイル(.xlsx)/登録不要/数式・練習データ入り
目次

補助列へ一致行の位置を書く

A3に検索する伝票Noを入力します。F11に次の式を入れ、F14までコピーします。

F11に入力(F14までコピー):一致した行に、位置の番号を付ける
数式=IF(A11=$A$3,ROW()-ROW($A$11)+1,"")
ひとことで伝票NoがA3と同じ行には、元表の何番目かを、違う行には空文字列を入れる
A11=$A$3
伝票NoがA3と同じかを判定します。$ で、検索条件のセルを固定します
ROW()-ROW($A$11)+1
元表の先頭(11行目)から数えて、何番目の行かを求めます(1〜4)
""
一致しない行は、空文字列にします
データの流れ
① 伝票Noが1000の行(11・13・14行目)に、位置番号が付く結果
F111F12F133F144
ポイント一致した行には元表内の位置1~4、不一致には空文字列が入ります。元のサンプルのROW(A10)-9も先頭行で1を返しますが、開始セルを使って差を取ると表を移したときの意味を読み取りやすくなります。

まず動かしてみよう|この記事のサンプルをその場で試せます

練習用ファイルをダウンロードしなくても、記事と同じデータ・同じセル番地のサンプルをここで動かせます。黄色いセルを書き換えると、結果がその場で変わります。各解説の最後にある「▶ この式を試す」を押すと、このツールの該当セルへ移動します。

1番目の一致を取得する

A6に次の式を入力します。

A6に入力(D6まで右へ、必要な行まで下へコピー):一致した行を順に取り出す
数式=IFERROR(INDEX($B$11:$E$14,SMALL($F$11:$F$14,ROWS($A$6:A6)),COLUMNS($A$6:A6)),"")
ひとことで位置番号を小さい順に取り出して、元表の、その行・その列の値を返す
$B$11:$E$14
取り出す元表です。商品ID〜数量の4列です
$F$11:$F$14
補助列(位置番号)です。この中の、小さい順に取り出します
ROWS($A$6:A6)
何番目の一致かです。下へコピーすると、1・2・3…と変わります
COLUMNS($A$6:A6)
元表の何列目かです。右へコピーすると、1・2・3…と変わります
IFERROR(…,"")
件数を超えると、SMALLが #NUM! になるので、空白にします
データの流れ
① 位置番号 1→3→4 の順に取り出す結果
A6A001A7A003A8A004
ポイントSMALLの第2引数は1から始まり、INDEXの列番号も1です。そのため、最初の一致行の商品IDが返ります。A3が1000ならA001が最初の結果です。
伝票Noが同じ行を順に取り出す(INDEXとSMALL)式 =IFERROR(INDEX($B$11:$E$14,SMALL($F$11:$F$14,ROWS($A$6:A6)),COLUMNS($A$6:A6)),"") の解説図。A6に入力する
A6に =IFERROR(INDEX($B$11:$E$14,SMALL($F$11:$F$14,ROWS($A$6:A6)),COLUMNS($A$6:A6)),"") を入力。F列は伝票No 1000 の行だけ 番号 1・3・4 が入る 小さい順に1行ずつ取り出す

右と下にコピーする

ポイントA6をD6まで右へコピーし、必要な件数分だけ下へコピーします。右方向ではCOLUMNSが1・2・3・4、下方向ではROWSが1・2・3と変わります。

元表にぶつからない空き領域へ出力してください。例題では3件の結果がA6:D8に収まりますが、結果が増える実務表では抽出先を別シートにする方法が安全です。

該当件数を超えると空白になる

注意SMALLは実際の数値の個数を超えると#NUM!になります。この式ではIFERRORで空白へ置き換えています。ただしIFERRORは他のエラーも隠すため、作成直後は一時的に外して参照範囲が正しいか確認すると原因を調べやすくなります。

2条件に増やすのは補助列側

伝票NoがA3、種類がB3という2条件なら、F11を次のようにします。

F11に入力(F14までコピー):条件を2つにする
数式=IF((A11=$A$3)*(D11=$B$3),ROW()-ROW($A$11)+1,"")
ひとことで伝票Noも種類も一致した行にだけ、位置番号を付ける
A11=$A$3
伝票Noの条件です
D11=$B$3
種類の条件です。* で掛けると、両方TRUEの行だけが 1 になります
補足取り出す側のINDEX+SMALLは、そのまま使えます。通常のEnterで確定できます。
ポイント抽出側のINDEX+SMALLはそのまま使えます。条件判定と抽出を分けるので、どの行が対象かをF列で目視確認できます。この補助列方式の式は通常のEnterで確定できます。

Microsoft 365ならFILTERも選べる

H6に入力(Microsoft 365):FILTERで、1つの式で取り出す
数式=FILTER(B11:E14,A11:A14=A3,"該当なし")
ひとことで補助列もコピーも不要で、一致した行をすべて取り出す
B11:E14
取り出す範囲です
A11:A14=A3
伝票NoがA3と同じ行が TRUE になります
"該当なし"
0件のときの表示です
補足結果の件数に応じて、自動で広がります(スピル)。INDEX+SMALL方式は、必要な行まで式をコピーする点が違います。
ポイントFILTERは結果の件数に応じて自動展開します。INDEX+SMALL方式は出力先の式を必要な行までコピーする点が異なります。古いExcelを使う相手と共有する場合は、対応版を確認して方法を選んでください。
練習用Excelファイル(無料ダウンロード)
A3の伝票Noに一致する明細をA6:D8へ表示する例題です。元表はA11:E14、位置番号の補助列はF列です。Microsoft 365で利用できます。Excel 2019・2016向けの操作も本文で説明しています。
Excelファイル(.xlsx)/登録不要/数式・練習データ入り

次に読むと理解が深まる記事

参考:Microsoft公式ドキュメント INDEX / SMALL / IFERROR

INDEX+SMALLのよくある質問

=IFERROR(INDEX(…),””) のようにIFERRORで囲むのはなぜですか?

該当件数を超えた行で、SMALLが #NUM! になるからです。IFERRORで空白へ置き換えています。ただしIFERRORは他のエラーも隠すため、作成直後は一時的に外して、参照範囲が正しいか確認します。

FILTERが使えない古いバージョンのExcelで、一致した行を上から順番に抽出するには?

補助列に一致行の位置を書き、SMALLで小さい順に取り出してINDEXへ渡します。補助列は =IF(A11=$A$3,ROW()-ROW($A$11)+1,"") です。この補助列方式の式は、通常のEnterで確定できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次