XLOOKUPで複数該当をすべて抽出できる?FILTERとの違いと2件目の取得

同じ名前の データを全件抽出。無料Excelサンプル付き。

XLOOKUPは通常、条件に一致する最初の1行を返します。戻り範囲を複数列にしても、同じ条件の全明細を返すわけではありません。複数該当をすべて表示したい場合はFILTER、最後の1件ならXLOOKUPの検索モード-1を使います。

無料Excelサンプルで一緒に試す

従来のサンプルは、氏名と生年月日の2条件で電話番号を1件検索する練習です。「同じ氏名の全件抽出」を試す場合は、同じ元表に本文のFILTER式を追加してください。

無料サンプルファイルをダウンロード(.xlsx)

Microsoft 365向け。XLOOKUP・FILTER・UNIQUEの例はExcel 2024・2021でも利用できます。本文の対応版もご確認ください。

目次

1件検索と全件抽出の使い分け

欲しい結果方法
最初に一致する1件XLOOKUP
最後に一致する1件XLOOKUPの第6引数を-1
一致する明細をすべてFILTER
全件のうち2件目FILTERの結果をINDEXで指定
ポイントXLOOKUPで商品名・分類・単価の3列を返す操作は「1行分の複数列」です。複数の明細行を返すこととは区別します。

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

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

氏名に一致する全行を返す

配布サンプルのB7:D10は氏名・生年月日・電話番号、B2は検索する氏名です。元表と重ならない空き領域、たとえばF7に入力します。

F7に入力:氏名に一致する全行を返す(FILTER)
数式=FILTER(B7:D10,B7:B10=B2,"該当なし")
ひとことでB2と同じ氏名の行を、すべて取り出す
B7:D10
取り出す範囲です。氏名・生年月日・電話番号の3列(4行)です
B7:B10=B2
条件です。氏名がB2と同じ行が TRUE になり、その行だけが残ります
"該当なし"
該当する行が無いときに表示する文字です
データの流れ
① 氏名が「木村洋子」の行を探す(黄色)
7行目木村洋子8行目田中康規9行目堀川千里10行目木村洋子
▼
② 該当する2行が、下へ並んで返る(スピル)結果
F7木村洋子 1990/9/10F8木村洋子 1992/8/14
ポイントB2が木村洋子なら、同じ氏名を持つ2行が表示されます。生年月日列の結果が数値になった場合、抽出先の該当列を日付形式に設定します。元表のセル書式まで自動コピーする式ではありません。

氏名と生年月日の両方で抽出する

F13に入力:氏名と生年月日の両方で抽出する
数式=FILTER(B7:D10,(B7:B10=B2)*(C7:C10=B3),"該当なし")
ひとことで氏名と生年月日の両方が合う行だけを取り出す
B7:D10
取り出す範囲です。氏名・生年月日・電話番号の3列です
(B7:B10=B2)*(C7:C10=B3)
氏名がB2、かつ生年月日がB3の行だけが 1 になります(* は「かつ」)。同姓同名を区別できます
"該当なし"
該当する行が無いときに表示する文字です
補足同じ氏名・同じ生年月日の行が複数ある場合も、FILTERならすべて返します。
ポイント同姓同名を区別するには生年月日などの条件を追加します。同じ氏名・同じ生年月日の行が複数ある場合も、FILTERならすべて返します。実務の個人情報は閲覧権限や保存先にも配慮して管理してください。

同じ氏名の2件目だけを返す

電話番号を2件目だけ取得する説明例です。先に該当件数を確認します。

B5に入力:同じ氏名の2件目だけを返す
数式=IF(COUNTIF(B7:B10,B2)<2,"2件目なし",INDEX(FILTER(D7:D10,B7:B10=B2),2))
ひとことで同じ氏名が2件以上あるときだけ、電話番号の2番目を返す
COUNTIF(B7:B10,B2)<2
同じ氏名の件数を数えて、2件に満たないかを調べます
"2件目なし"
2件に満たないときの表示です
INDEX(FILTER(D7:D10,B7:B10=B2),2)
同じ氏名の電話番号だけをFILTERで取り出し、INDEXでその2番目を返します
データの流れ
① 同じ氏名の電話番号を、元表の順に取り出す
1件目080-****-00012件目080-****-0004
▼
② 2番目が返る結果
B5080-****-0004
注意これは元表の並び順で2件目です。日付が2番目に新しいという意味ではありません。また氏名に*や?を含む場合、COUNTIFのワイルドカード解釈と等号比較が異なるため、判定条件をそろえる必要があります。

1件だけでよい場合のXLOOKUP

B4に入力:1件だけでよいときのXLOOKUP(条件の比較)
数式=XLOOKUP(1,(B7:B10=B2)*(C7:C10=B3),D7:D10,"該当なし",0)
ひとことで氏名と生年月日の両方が合う、最初の1件の電話番号を返す
(B7:B10=B2)*(C7:C10=B3)
氏名がB2、かつ生年月日がB3の行だけを 1 にします。文字をつなげないので、取り違えが起きません
1
検索値の 1:上の判定が 1 になった行を探します
D7:D10
返す範囲です。電話番号の列です
"該当なし"
見つからないときの表示です。最後の 0 は完全一致です
補足元サンプルの&でつなぐ式と同じ目的を、条件の比較で書いた式です。第6引数へ -1 を追加すると、最後の一致を返します。
ポイント元サンプルの&連結式と同じ目的を、条件比較で書いた式です。検索値の文字列連結による衝突を避けたい場合に使います。第6引数へ-1を追加すると最後の一致を返します。

複数該当の抽出ができない・結果が広がらないときの確認表

症状主な原因確認と対処
#SPILL!抽出先に既存のデータや結合セルがある抽出先を空き領域にする。結合セルは解除する
生年月日が 33126 のような数値になる抽出先の列の書式が日付になっていない抽出先の該当列を日付形式にする(元表の書式まではコピーされない)
「該当なし」になる氏名の表記が違う(スペース・全角と半角など)元表から氏名をコピーして試す。余分なスペースを取り除く
#NAME? になるXLOOKUP・FILTERが使えないExcel(2019・2016)で開いているINDEX+SMALLの補助列方式、またはVLOOKUPと補助列を使う

抽出先に既存データや結合セルがあると#SPILL!になります。FILTERはMicrosoft 365・Excel 2024・2021向けです。Excel 2019・2016で複数件を返す場合はINDEX+SMALLの補助列方式を使います。

注意元表を並べ替えると「2件目」の内容も変わります。順番に業務上の意味があるなら、日付・番号などの並び替え基準を決めてください。

無料Excelサンプルで復習する

従来のサンプルは、氏名と生年月日の2条件で電話番号を1件検索する練習です。「同じ氏名の全件抽出」を試す場合は、同じ元表に本文のFILTER式を追加してください。

無料サンプルファイルをダウンロード(.xlsx)

Microsoft 365向け。XLOOKUP・FILTER・UNIQUEの例はExcel 2024・2021でも利用できます。本文の対応版もご確認ください。

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

参考:Microsoft公式ドキュメント XLOOKUP / FILTER / INDEX

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

この記事を書いた人

コメント

コメントする

目次