doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

【Excel実務レシピ】複数ヒットを1セルにまとめるFILTER活用テクニック集(TEXTJOIN・GROUPBY・LAMBDA対応)

スポンサーリンク


はじめに:「複数ヒットしたデータを1セルにまとめたい」という悩み

Excelでデータ検索をするとき、こんな場面に遭遇したことはありませんか?

  • VLOOKUPで検索したら、同じキーの行が複数あって困った
  • 「田中さんの担当案件を全部1セルに表示したい」
  • 「カテゴリごとに商品名をカンマ区切りで並べたい」

従来のVLOOKUPやXLOOKUPは「1件だけ返す」のが基本設計。複数結果を1セルにまとめるには、かつては20行超えのVBAマクロや複雑な配列数式が必要でした。それが今では、1行の数式で解決できます。

この記事を読み終えれば、以下の5つのシナリオを即日実務で使いこなせるようになります。

  1. 特定キーの結果を1セルに結合する
  2. カンマ区切りで手軽に文字列化する
  3. 重複を排除してから結合する
  4. 複数キーに一括対応する
  5. グループ別に自動でまとめる

サンプルデータの確認

以下の「案件管理表」を使って解説します。列はA〜D列の4列構成です。

担当者 案件名 金額 ステータス
田中 A社提案 100 進行中
鈴木 B社改修 200 完了
田中 C社導入 150 進行中
佐藤 D社保守 80 保留
鈴木 E社開発 300 進行中
田中 F社更新 120 完了

後の応用例で「金額(C列)」「ステータス(D列)」も使います。最初からこの4列構成で手元に用意しておくとスムーズです。


方法①:FILTER+TEXTJOIN で複数結果を1セルに結合 ★☆☆ 初級

最初に覚えるべき基本形です。「特定の担当者の案件名をすべて取り出したい」という最頻出のシナリオに対応します。

=TEXTJOIN("、", TRUE, FILTER(B2:B7, A2:A7="田中"))

動作の仕組み:

  1. FILTER(B2:B7, A2:A7="田中") → 田中さんの案件名を配列で取得
  2. TEXTJOIN("、", TRUE, ...) → 配列を読点区切りで1セルに結合

結果: A社提案、C社導入、F社更新

条件を動的にする

F2セルに担当者名を入力することで、プルダウンと連動した動的な絞り込みが実現できます。

=TEXTJOIN("、", TRUE, FILTER(B2:B7, A2:A7=F2, "該当なし"))

第3引数の "該当なし" は、検索結果が0件だったときのフォールバック表示です。エラーではなくメッセージを返せるため、実務での運用がしやすくなります。


方法②:FILTER+ARRAYTOTEXT でシンプルに文字列化 ★☆☆ 初級

書式の細かい制御が不要なら、TEXTJOIN よりも ARRAYTOTEXT の方が手軽です。

=ARRAYTOTEXT(FILTER(B2:B7, A2:A7="鈴木"), 0)
  • 第2引数 0:簡潔モード(カンマ区切り)
  • 第2引数 1:厳密モード(各要素に引用符が付く)

結果: B社改修, E社開発

区切り文字や空白のカスタマイズが不要なシーンでは ARRAYTOTEXT を使うと数式がすっきりします。「とにかく素早く確認したい」という場面にも最適です。


方法③:LAMBDA+MAP で複数キーに一括対応 ★★☆ 中級

特定の1件ではなく、複数の担当者に対してそれぞれ結果を返したい場合は、LAMBDAMAP の組み合わせが強力です。

=MAP(F2:F4, LAMBDA(name,
    TEXTJOIN("、", TRUE, FILTER(B2:B7, A2:A7=name, "なし"))
))

F2:F4 に担当者名のリストを入れておけば、各担当者の案件一覧を縦に並べて一括で返します。個別にセルへ数式を書かなくてよいため、担当者が増えてもメンテナンスが楽です。

名前付きLAMBDAで再利用性をさらに高める

「名前の管理」で GetCases として登録しておきます。

=LAMBDA(name, TEXTJOIN("、", TRUE, FILTER(B2:B7, A2:A7=name, "なし")))

登録後は、シート上のどこでも次のように呼び出せます。

=GetCases("田中")

チームで共有するブックに仕込んでおけば、他のメンバーも数式の中身を意識せずに使えます。


方法④:UNIQUE+TEXTJOIN で重複排除してから結合 ★★☆ 中級

担当者の一覧をユニークにしてから表示したい場合に使います。「検索して返す」というより「マスタ一覧を動的に作る」用途です。

=TEXTJOIN("・", TRUE, UNIQUE(A2:A7))

結果: 田中・鈴木・佐藤

応用:条件付きユニーク

「金額が100以上の案件を担当している人(重複なし)」を取得するには、FILTER と組み合わせます。

=TEXTJOIN("・", TRUE, UNIQUE(FILTER(A2:A7, C2:C7>=100)))

結果: 田中・鈴木

この FILTER の条件列はC列(金額)です。先ほどのサンプルデータの列構成と照らし合わせて確認してください。


方法⑤:GROUPBY+LAMBDA でグループ別に自動まとめ ★★★ 上級

Microsoft 365の比較的新しい関数 GROUPBY を使えば、グループ化と集計を1つの数式で完結できます。全担当者の案件一覧を一気に作りたい場合に効果絶大です。

=GROUPBY(
    A2:A7,
    B2:B7,
    LAMBDA(v, ARRAYTOTEXT(v, 0)),
    0
)

結果イメージ:

佐藤 D社保守
鈴木 B社改修, E社開発
田中 A社提案, C社導入, F社更新

各引数の役割:

引数 内容
第1引数 グループ化のキー列(担当者)
第2引数 集計対象の列(案件名)
第3引数 集計関数(LAMBDAで自由に定義)
第4引数 ヘッダーの有無(0=なし)

GROUPBY は「担当者別レポートを手作業でまとめている」という業務を丸ごと自動化できる、まさにルックアップ+集約の決定版です。なお、この関数はMicrosoft 365の比較的新しいバージョンが必要です。利用前にお使いのバージョンをご確認ください。


使い分けのまとめ

やりたいこと おすすめの組み合わせ 難易度
特定キーの結果を1セルに FILTER+TEXTJOIN ★☆☆
手軽にカンマ区切りにしたい FILTER+ARRAYTOTEXT ★☆☆
複数キーに一括対応したい MAP+LAMBDA+FILTER ★★☆
重複排除して結合したい UNIQUE+TEXTJOIN ★★☆
グループ別に自動まとめ GROUPBY+LAMBDA ★★★

おわりに

「複数ヒットを1セルに返す」という一見シンプルな要件も、正しい関数の組み合わせを知っているかどうかで、作業時間が数時間から数秒に変わります。

まずは難易度★☆☆の =TEXTJOIN("、", TRUE, FILTER(...)) を自分のシートで試してみてください。基本形が手に馴染んだら、MAP+LAMBDAGROUPBY へとステップアップしていくのがおすすめです。

5つのレシピをすべてマスターすれば、日々の集計・報告業務の大半を自動化できます。ぜひ手を動かしながら試してみてください。