doodle-on-web

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

月切り替えが一瞬!シート名をセルで動的に変えるVLOOKUP+INDIRECTの使い方

スポンサーリンク


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 共通)

  1. B2セルを選択する
  2. 「データ」タブ → 「データの入力規則」をクリック
  3. 「設定」タブの「入力値の種類」で 「リスト」 を選択
  4. 「元の値」に 1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月 と入力
  5. 「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つで、毎月の数式書き換え作業をまるごとなくせます。月別・担当者別・店舗別など、シートが分かれているデータを扱う場面ならどこでも応用できます。ぜひ今日の業務から取り入れてみてください。


関連記事