はじめに:「複数ヒットしたデータを1セルにまとめたい」という悩み
Excelでデータ検索をするとき、こんな場面に遭遇したことはありませんか?
- VLOOKUPで検索したら、同じキーの行が複数あって困った
- 「田中さんの担当案件を全部1セルに表示したい」
- 「カテゴリごとに商品名をカンマ区切りで並べたい」
従来のVLOOKUPやXLOOKUPは「1件だけ返す」のが基本設計。複数結果を1セルにまとめるには、かつては20行超えのVBAマクロや複雑な配列数式が必要でした。それが今では、1行の数式で解決できます。
この記事を読み終えれば、以下の5つのシナリオを即日実務で使いこなせるようになります。
- 特定キーの結果を1セルに結合する
- カンマ区切りで手軽に文字列化する
- 重複を排除してから結合する
- 複数キーに一括対応する
- グループ別に自動でまとめる
サンプルデータの確認
以下の「案件管理表」を使って解説します。列は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="田中"))
動作の仕組み:
FILTER(B2:B7, A2:A7="田中")→ 田中さんの案件名を配列で取得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件ではなく、複数の担当者に対してそれぞれ結果を返したい場合は、LAMBDA と MAP の組み合わせが強力です。
=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+LAMBDA や GROUPBY へとステップアップしていくのがおすすめです。
5つのレシピをすべてマスターすれば、日々の集計・報告業務の大半を自動化できます。ぜひ手を動かしながら試してみてください。