Excelで月別にシートが分かれているデータを集計するとき、こんな経験はありませんか?「12ヶ月分のVLOOKUP数式をコピーして、シート名を1つずつ手作業で書き換えた……」。参照先を1月・2月・3月と直していく作業は単調で、ミスも起きやすい。
INDIRECT関数を使えば、セルの値を変えるだけで参照先シートを自動切替できます。この記事を読み終えれば、月次レポートのシート切り替えを数式の修正ゼロで実現できるようになります。
なぜINDIRECTが必要なのか
通常のVLOOKUPで別シートを参照すると、数式はこうなります。
=VLOOKUP(A2, '1月'!B:D, 2, FALSE)
'1月' の部分が固定されているため、2月・3月に切り替えるたびに数式を書き直す必要があります。シートが12枚あれば12回の修正作業です。
INDIRECT関数は「文字列として書いたセル参照を、実際の参照として解釈」してくれる関数です。シート名をセルから読み取って参照先を動的に組み立てられるため、この問題をまるごと解決できます。
INDIRECT関数の基本
=INDIRECT("参照文字列")
セルA1に Sheet2 と入力されているとき、
=INDIRECT(A1 & "!B2")
と書くと Sheet2!B2 の値を取得できます。文字列の連結(&)でシート名を動的に組み立てるのがポイントです。
VLOOKUP+INDIRECTの基本構文
シート名が入力されたセル(例:C1)を参照先に使うには次のように書きます。
=VLOOKUP(A2, INDIRECT("'" & C1 & "'!B:D"), 2, FALSE)
シングルクォートで囲む理由
シート名にスペースや日本語が含まれる場合(「1月売上」など)、シート名をシングルクォート(')で囲まないと #REF! エラーになります。アルファベットのみのシート名ならクォートなしでも動きますが、常にクォートで囲む習慣をつけるのが安全です。
実践例:月別シートから売上を検索する
シート構成
| シート名 | 内容 |
|---|---|
| 集計 | 検索キー・月名・結果を表示するシート |
| 1月・2月・3月… | 商品コード・商品名・売上金額の一覧 |
各月シートのサンプルデータ(例:1月シート)
| A列(商品コード) | B列(商品名) | C列(売上金額) |
|---|---|---|
| P001 | ノートPC | 120,000 |
| P002 | マウス | 3,500 |
| P003 | キーボード | 8,000 |
集計シートの設定
| セル | 内容 |
|---|---|
| A2 | 検索する商品コード(例:P001) |
| B2 | 参照したい月(例:1月) |
| C2 | 数式を入力 |
C2に入力する数式
=IFERROR(VLOOKUP(A2, INDIRECT("'" & B2 & "'!A:C"), 3, FALSE), "データなし")
B2に 1月 と入力すれば1月シート、3月 に変えれば3月シートを自動で参照します。IFERROR で囲むことで、シートが存在しない場合(#REF!)や商品コードが見つからない場合(#N/A)のどちらも「データなし」と表示できます。
応用:ドロップダウンリストと組み合わせる
B2セルにドロップダウンリストを設定しておくと、マウスで月を選ぶだけで検索結果が切り替わるシートが完成します。
設定手順(Excel 2019 / Microsoft 365 共通)
- B2セルを選択する
- 「データ」タブ → 「データの入力規則」をクリック
- 「設定」タブの「入力値の種類」で 「リスト」 を選択
- 「元の値」に
1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月と入力 - 「OK」をクリック
Excel 2016以前の場合:同じ手順で設定できますが、「データの入力規則」は「データ」タブ内の「データツール」グループに含まれています。
C2の数式はそのままで、B2を変えるたびに自動的に結果が更新されます。
注意点
| 注意点 | 内容 |
|---|---|
| 揮発性関数 | INDIRECTは揮発性関数(ファイルを開くたびに全セルを再計算する関数)。シートやデータが多いとファイルが重くなる場合がある |
| シート名の完全一致 | セルに入力する月名と実際のシート名が1文字でも違うと #REF! エラーになる。ドロップダウンリストを使うと入力ミスを防げる |
#REF! と #N/A の違い |
#REF! はシート名が存在しないとき、#N/A は検索値が見つからないとき。IFERRORで両方まとめて処理できる |
| Googleスプレッドシート | 基本構文はほぼ同じだが、スペースを含むシート名の扱いが一部異なる場合あり |
Excel 365ユーザーへの補足
Microsoft 365をお使いであれば、INDIRECT の代わりに XLOOKUP の範囲引数に INDIRECT を組み合わせる方法もあります。XLOOKUPはVLOOKUPより柔軟なため、左方向の検索やエラー処理を一括で書けるメリットがあります。
まとめ
INDIRECTを使うとシート名をセルで動的に指定できる- 基本構文は
INDIRECT("'" & シート名セル & "'!範囲")でシングルクォートを忘れずに IFERRORと組み合わせて#REF!(シートなし)・#N/A(値なし)の両エラーに対処する- ドロップダウンリストと組み合わせるとマウス操作だけでシートを切り替えられる
このテクニック1つで、毎月の数式書き換え作業をまるごとなくせます。月別・担当者別・店舗別など、シートが分かれているデータを扱う場面ならどこでも応用できます。ぜひ今日の業務から取り入れてみてください。