Excel VLOOKUPで複数シートから検索する方法|VSTACK関数で一括範囲指定(XLOOKUP対応)


はじめに
顧客リストや商品マスタが「月ごと」や「カテゴリごと」に別々のシートに分かれており、VLOOKUP関数でまとめて検索できずに困った経験はないでしょうか。
通常、VLOOKUP関数やXLOOKUP関数は一つのシート(範囲)しか検索対象にできません。これまではIFERROR関数を長く繋げたり、INDIRECT関数でシート名を操作したりする複雑な工夫が必要でした。
しかし、Microsoft 365で追加された新関数「VSTACK」を使えば、複数のシートを「一つの範囲」として一瞬で結合し、シンプルに検索できるようになります。
本記事では、最新のVSTACK関数を使った効率的な方法を中心に、従来のExcel環境でも使えるテクニックまで、複数シートを検索する全手法を解説します。
サンプル表
このように三つの表に検索範囲が分かれた例で手順を記載します。
検索値に一致するものが複数存在する場合、
そのまま使用すると最初に一致する値が取得されます。






方法1:VSTACK関数で検索範囲を一つに結合する(推奨)
解説動画
本記事の内容を、実際のExcel操作画面を交えて動画で解説しました(約3分)。 ナレーションには、声優・井上喜久子さんの声を元に制作された『VOICEPEAK 桜乃そら』を使用しています。落ち着いたトーンで聞き取りやすくまとめていますので、テキストを読むのが大変な方はこちらをご覧ください。
基本的な結合と検索の手順
2022年9月にMicrosoft365(Office365)のExcelに追加された新関数を使うので
古いバージョンのExcelでは使用できません。
VSTACK関数・HSTACK関数はセル範囲を結合し、
その結果をVLOOKUP関数やXLOOKUP関数に利用することが可能です。
=VSTACK(マグロ!A2:B4,サバ!A2:B5,カツオ!A2:B5)


=VLOOKUP(C2,VSTACK(マグロ!A2:B4,サバ!A2:B5,カツオ!A2:B5),2,FALSE)


XLOOKUP関数に利用する場合は検索範囲と戻り範囲を、それぞれ結合する必要があります。
=XLOOKUP(C2, VSTACK(マグロ!A2:A4,サバ!A2:A5,カツオ!A2:A5), VSTACK(マグロ!B2:B4,サバ!B2:B5,カツオ!B2:B5) )


行数が不明な場合に列全体を指定する(#NUM!エラー対策)
検索対象の行数が不定で、列そのものを指定したいケースがありますが、
そのままではExcelの行数の限界を超えてしまいエラーになってしまいます。


この場合、結合前に有効行だけに加工する必要があります。
- 【推奨】TRIMRANGE関数で有効行のみを結合する
- 【参考】LAMBDA関数で有効行を定義する(旧手法)
【推奨】TRIMRANGE関数で有効行のみを結合する
TRIMRANGE関数は2025年10月のアップデートで正式実装された余白セルを削除する関数です。
VSTACK関数・HSTACK関数を利用可能な状況であれば基本的に利用できるので②の方法はメリットがありません。こちらを優先的に利用しましょう。
利用方法はシートの各シートのセル範囲指定にTRIMRANGE関数を適用するだけです。
これにより結合でエラーにならなくなります。
VLOOKUP関数の例:
=VLOOKUP(C2,VSTACK(TRIMRANGE(マグロ!A:B),TRIMRANGE(サバ!A:B),TRIMRANGE(カツオ!A:B)),2,FALSE)


ヘッダー行が存在する場合は、DROPでヘッダー分の行数を削除します。(検索条件によっては不要)
=VLOOKUP(C2,VSTACK(DROP(TRIMRANGE(マグロ!A:B),1),DROP(TRIMRANGE(サバ!A:B),1),DROP(TRIMRANGE(カツオ!A:B),1)),2,FALSE)
XLOOKUP関数の例:
=XLOOKUP(C2, VSTACK(TRIMRANGE(マグロ!A:A),TRIMRANGE(サバ!A:A),TRIMRANGE(カツオ!A:A)), VSTACK(TRIMRANGE(マグロ!B:B),TRIMRANGE(サバ!B:B),TRIMRANGE(カツオ!B:B)) )


=XLOOKUP(C2, VSTACK(DROP(TRIMRANGE(マグロ!A:A),1),DROP(TRIMRANGE(サバ!A:A),1),DROP(TRIMRANGE(カツオ!A:A),1)), VSTACK(DROP(TRIMRANGE(マグロ!B:B),1),DROP(TRIMRANGE(サバ!B:B),1),DROP(TRIMRANGE(カツオ!B:B),1)) )
【参考】LAMBDA関数で有効行を定義する(旧手法)
有効行だけに制限を利用します。
この数式を利用できる場合は基本的にTRIMRANGE関数を利用できるので、TRIMRANGE関数登場前の手法の参考情報です。
(TRIMRANGE関数が登場するまでの方法でした)
有効行だけに制限をそのまま利用しても構いませんが、
名前の管理で数式を登録すると利用しやすくなります。


「新規作成」をクリックします、


名前に任意の関数名、参照範囲に次の数式を指定します。
=LAMBDA(指定範囲,LET(中間範囲,HSTACK(BYROW(指定範囲,LAMBDA(行,COUNTA(行))),指定範囲),MAP(DROP(FILTER(中間範囲,CHOOSECOLS(中間範囲,1)>0),,1),LAMBDA(セル,IF(セル="","",セル)))))


指定の関数名で利用することが可能になります。(例では「有効行」)
=VSTACK(有効行(マグロ!A:B),有効行(サバ!A:B),有効行(カツオ!A:B))


ヘッダー行が存在する場合は、DROPでヘッダー分の行数を削除します。
(検索条件によっては不要)
=VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1),DROP(有効行(カツオ!A:B),1))


このセル範囲は、そのままVLOOKUP関数に利用可能です。
=VLOOKUP(C2,VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1),DROP(有効行(カツオ!A:B),1)),2,FALSE)


XLOOKUP関数にも利用可能ですが、範囲から列を抽出するCHOOSECOLS関数を併用します。
=XLOOKUP(C2,CHOOSECOLS( VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1),DROP(有効行(カツオ!A:B),1)),1),CHOOSECOLS( VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1),DROP(有効行(カツオ!A:B),1)),2))


VLOOKUP関数の方が数式は簡潔ですが、XLOOKUP関数では冗長になります。
XLOOKUP関数で数式を短く記述するコツ
有効行のセル範囲を展開してから指定
まず有効行をどこかに展開にします。(例ではE1)
TRIMRANGE関数の例:
=VSTACK(DROP(TRIMRANGE(マグロ!A:B),1),DROP(TRIMRANGE(サバ!A:B),1),DROP(TRIMRANGE(カツオ!A:B),1))


LAMBDA関数の例:
=VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1))


有効行のみにする数式のあるセルに#を付けると
結合したセル範囲全体になるためそれを利用することも可能です。
=XLOOKUP(C2, CHOOSECOLS(E1#,1), CHOOSECOLS(E1#,2) )


LET関数で名前をつける
LET関数を利用すると有効行をどこにも展開せずに実現可能です。
TRIMRANGE関数の例:
=LET(対象範囲,
VSTACK(DROP(TRIMRANGE(マグロ!A:B),1),DROP(TRIMRANGE(サバ!A:B),1),DROP(TRIMRANGE(カツオ!A:B),1)),
XLOOKUP(C2,CHOOSECOLS(対象範囲,1),CHOOSECOLS(対象範囲,2))
)


LAMBDA関数の例:
=LET(対象範囲,
VSTACK(DROP(有効行(マグロ!A:B),1),DROP(有効行(サバ!A:B),1),DROP(有効行(カツオ!A:B),1)),
XLOOKUP(C2,CHOOSECOLS(対象範囲,1),CHOOSECOLS(対象範囲,2))
)


方法2:INDIRECT関数で検索対象シートを動的に切り替える
セルでシート(セル範囲)を指定します。


検索値が同じでもシートが異なると結果がこのように切り替わります。


実現にはVLOOKUP関数の範囲指定にINDIRECT関数を使用します。
それぞれセル範囲に名前を付けて、INDIRECT関数の引数にしても実現が可能です。
セルの行や列が変わる場合は特に効果的です。
数式は下記のようになります。
=VLOOKUP(C3,INDIRECT(C2&"!A:B"),2,FALSE)
=XLOOKUP(C3,INDIRECT(C2&"!A:A"),INDIRECT(C2&"!B:B"))




方法3:IFERROR関数で複数のシートを順番に検索する
IFERROR関数を使用し、検索対象の全シートを対象とする
VLOOKUP関数を順番に記述しています。
#N/AエラーしなければVLOOKUP関数の結果を返しますが
結果が見つからないと#N/Aエラーとなるため次のVLOOKUP関数を実行します。
複数の検索対象に存在する検索値を指定した場合、
書いた順番(マグロ→サバ→カツオ)で優先されます。
数式は下記のようになります。
=IFERROR(VLOOKUP(C2,マグロ!A:B,2,FALSE),IFERROR(VLOOKUP(C2,サバ!A:B,2,FALSE),VLOOKUP(C2,カツオ!A:B,2,FALSE)))
=IFERROR(XLOOKUP(C2,マグロ!A:A,マグロ!B:B),IFERROR(XLOOKUP(C2,サバ!A:A,サバ!B:B),XLOOKUP(C2,カツオ!A:A,カツオ!B:B)))




まとめ
本記事では、Excelで複数シートにまたがるデータを検索するいくつかの方法を紹介しました。
- VSTACK関数(推奨): 複数の範囲を仮想的に「縦」に結合し、VLOOKUP/XLOOKUPでそのまま検索可能にする最もスマートな方法。
- INDIRECT関数: シート名がセルに入力されている場合に有効。
- IFERROR関数: 古いExcel環境で、どうしても検索が必要な場合の代替策。
環境が許すのであれば、数式がシンプルで管理しやすい「VSTACK関数」の利用がおすすめです。データの散在による検索エラーを解消し、業務効率を向上させましょう。
関連記事
XLOOKUP(VLOOKUP)関数の使い方・活用方法の記事一覧
Excel 文字列による柔軟なセル指定を行う(INDIRECT関数)
Excel完全マスター: 関数・テクニック・新機能を網羅した決定版ガイド


本書は、Excelの基礎から応用まで、包括的に学べるガイドブックです。当サイトの豊富な情報を、電子書籍向けに最適化し、読みやすく再構成しました。
【本書の特徴】
- 情報量:Word-A4サイズ換算で1,400ページ相当
- 基本操作から高度なテクニックまで、段階的に学習可能
- 140種類の関数を詳細に解説
- 109種類の実用的なテクニックと具体例を紹介
- 最新機能(XLOOKUP関数、LET関数、シートビュー、LAMBDA関数、スピル等)を徹底解説
【対象読者】
- Excel初心者からプロフェッショナルまで
- 体系的にExcelスキルを向上させたい方
- 業務効率化を目指すビジネスパーソン
- データ分析や可視化のスキルを磨きたい方
【本書の強み】
- 実務に即した例題と解説
- 視覚的な図表やスクリーンショットで理解を促進
- 最新のExcelバージョンに対応した内容
- 著者の長年の経験に基づく、実践的なTipsを多数収録
【更新とサポート】
- 常に最新の情報を反映するため、定期的に内容を更新
- 最新版の入手方法:Amazonカスタマーサポートへお問い合わせください
【入手方法】
- 買い切り:950円
- Kindle Unlimited:読み放題プランで利用可能
Excelマスターを目指す方、業務効率を劇的に向上させたい方に、自信を持っておすすめできる一冊です。この1冊で、Excelの可能性を最大限に引き出す力が身につきます。