INDIRECT関数の使い方|シート名を可変にする書き方と使う前の注意点

INDIRECT関数は、文字列として書かれた参照先を、本物のセル参照に変換する関数です。"B5" という文字を B5セルの参照に変えられるため、シート名や範囲をセルの値から組み立てられます。便利な反面、再計算のたびに評価される揮発性の関数なので、使いどころを絞るのが実務の作法です。

この記事でわかること

  • INDIRECT関数の2つの引数と、文字列が参照に変わる仕組み
  • シート名をセルから可変にする書き方(記号を含むシート名の囲み方も)
  • 名前の定義・テーブルと組み合わせる書き方
  • ⛔ 使う前に知っておく3つの弱点(揮発性・追従しない・閉じたブック)
  • INDIRECTを使わずに済ませる代わりの手段(串刺し集計・INDEX)


目次

INDIRECT関数の構文と引数

構文

=INDIRECT(参照文字列, [参照形式])
引数指定するもの注意点
参照文字列参照先を表す文字列"B5" のように文字で書くか、その文字が入ったセルを指定する
参照形式TRUE=A1形式/FALSE=R1C1形式省略すると TRUE。通常は省略してよい

INDIRECT関数は Excel 2016・2019・2021・Microsoft 365 のいずれでも使えます。

動作を1行で言うと

「文字を参照として読み直す」関数です。次の2つは書き方が似ていますが、意味がまったく違います。

数式動き
=A1A1に入っている値をそのまま返す
=INDIRECT(A1)A1に入っている文字を参照先とみなし、その参照先の値を返す

A1に B5 という文字が入っていれば、=INDIRECT(A1) はB5の値を返します。参照先を後から差し替えられるのがINDIRECTの本質です。

INDIRECT関数の使い方|シート名を可変にする書き方と使う前の注意点の解説図1

基本の使い方

直接書く場合

=INDIRECT("B5")

この式は =B5 と同じ結果になります。ただし違いが1つあります。B5の上に行を挿入しても、INDIRECTの参照先は文字列 "B5" のまま動きません。通常の参照なら =B6 に書き換わるところです。

この性質は、弱点であると同時に「位置を固定したい」場面では利点にもなります。

セルに書いた参照先を使う

参照先を切り替えたい場面での基本形です。

セル内容
A1B5(切り替えたい参照先を文字で入力)
C1=INDIRECT(A1)

A1を B6 に書き換えれば、C1の結果もB6の値に切り替わります。プルダウンでA1を選ばせる形にすると、選択に応じて参照先が変わる表になります。

列名や行番号を組み立てる

文字列なので、& でつなげます。

=INDIRECT("B" & A2)

A2に 10 が入っていれば B10 を参照します。行番号を数式で計算して渡せるため、参照先を計算で決めたいときに使えます。


本命の使い方:シート名を可変にする

INDIRECTがいちばん効くのは、シートをまたぐ参照です。月別にシートを分けている表で、集計シートに各月の合計を集める場面を考えます。

基本形

A2に 4月 と入力しておき、その月のシートのB3を取り出します。

=INDIRECT(A2 & "!B3")

A2を下へ 5月 6月 …と並べておけば、1つの数式を下にコピーするだけで全月分が集まります。シート名を数式に直接書く方式だと、月の数だけ数式を書き換える必要があります。

⚠️ シート名は必ずシングルクォートで囲む

シート名にスペース・記号・数字始まりが含まれると、囲まないままではエラーになります。安全な書き方はこちらです。

=INDIRECT("'" & A2 & "'!B3")

"'" はシングルクォート1文字を表します。シート名が 2026年 4月 のような形でも通ります。囲んでおいて損はないので、シートをまたぐときは常にこの形で書くのが確実です。

範囲を渡して集計する

セル1つだけでなく、範囲も渡せます。

=SUM(INDIRECT("'" & A2 & "'!C2:C100"))

シート名の一覧をA列に用意しておけば、シートが増えても行を足すだけで済みます。この形が、月別ブックの集計でいちばん使われる書き方です。

INDIRECT関数の使い方|シート名を可変にする書き方と使う前の注意点の解説図2

名前の定義・テーブルとの組み合わせ

名前を文字列で呼び出す

「数式」タブの「名前の定義」で 商品リスト という名前を付けた範囲があるとき、INDIRECTは名前も参照に変えられます。

=SUM(INDIRECT("商品リスト"))

セルの値から名前を組み立てられるので、=SUM(INDIRECT(A2 & "リスト")) のように名前そのものを切り替える使い方ができます。

テーブルの列を参照する

データの入力規則など、テーブル参照をそのまま書けない場所では、INDIRECTで文字列にくるみます。

=INDIRECT("テーブル1[商品名]")

テーブルは行を足すと範囲が自動で広がるため、参照側を書き換えなくても追従します。プルダウンの項目を自動で増やしたいときの定番の形です。

なお、1つ目の選択で2つ目の候補が変わる連動プルダウンも、名前の定義とINDIRECTの組み合わせで作ります。設定手順はプルダウンの記事にまとめてあります。


⛔ 使う前に知っておく3つの弱点

① 揮発性関数である

INDIRECTは揮発性関数です。参照先が変わっていなくても、シート上のどこかを編集するたびに再計算されます。

数十個なら体感できませんが、数千行に敷き詰めると、入力のたびに待たされるブックになります。行数の多い表では、次章の代替手段を先に検討してください。

② 行や列の挿入に追従しない

参照先は文字列なので、シートの構造が変わっても書き換わりません。

  • B5を参照している状態で上に行を挿入しても、INDIRECTはB5のまま(本来はB6を指すべき)
  • 参照先のセルを切り取って移動しても、追いかけない
  • シート名を変更すると、途端に #REF! になる

「使う人がシートを触らない」前提が崩れると、静かに間違った値を返します。

③ 閉じたブックは参照できない

他のブックをINDIRECTで参照した場合、参照先のブックを開いている間しか値が取れません。閉じると #REF! になります。通常のリンク参照は閉じていても値が残るため、ここは明確な違いです。

INDIRECT関数の使い方|シート名を可変にする書き方と使う前の注意点の解説図3

うまくいかないときの原因と直し方

症状主な原因直し方
#REF! になるシート名の綴り違い・シートを削除したシート名を実際のタブと突き合わせる
#REF! になる(記号を含むシート名)シングルクォートで囲んでいない"'" & A2 & "'!B3" の形に直す
#REF! になる(名前の定義)その名前が存在しない「名前の管理」で綴りを確認する
参照先がずれている行や列を挿入した文字列側の行番号を直す。または通常参照に戻す
他ブックの値が取れない参照先ブックが閉じている参照先を開く。または同じブックにデータを移す
ブックが重い揮発性の再計算INDEXなど非揮発性の関数に置き換える
結果が文字のまま出るINDIRECTを付け忘れている=A1 ではなく =INDIRECT(A1) になっているか確認する

シート名を後から変更した場合、通常の参照は自動で追随しますが、INDIRECTは追随しません。シート名をキーにする設計にしたときは、「シート名は変更しない」ことを表の中に明記しておくと事故が減ります。


似た関数との使い分け

手段揮発性選ぶ場面
INDIRECTあり参照先を文字列から組み立てたい。シート名を可変にしたい
INDEXなし同じシート内で位置を指定して取り出したい
CHOOSEなし候補が数個で固定。番号で選び分けたい
OFFSETあり基準セルからの相対位置で範囲を動かしたい
串刺し集計(3-D参照)なし複数シートの同じ位置を合計したい

シート集計なら串刺し集計で足りることが多い

すべてのシートで同じ位置のセルを合計するだけなら、INDIRECTは不要です。

=SUM('4月:3月'!B3)

先頭シートと末尾シートを : でつなぐ書き方で、間に並んでいるシートすべてのB3が合計されます。シートを間に追加すれば自動的に含まれます。数字で始まるシート名はシングルクォートで囲みます。

  • 串刺し集計が向く:全シートの同じ位置を合計するだけ
  • INDIRECTが向く:シートごとに違う位置を取りたい、集計結果を月ごとに並べたい
INDIRECT関数の使い方|シート名を可変にする書き方と使う前の注意点の解説図4

位置指定ならINDEXのほうが安全

同じシート内で「n行目・m列目を取りたい」だけなら、INDEX関数を使います。非揮発性で、行や列の挿入にも追従します。

=INDEX($B$2:$B$100, A2)

文字列を組み立てる必要がないなら、INDIRECTを選ぶ理由はありません。


よくある質問

Q1:INDIRECTで参照した範囲を、そのままSUMやVLOOKUPに渡せますか?

渡せます。INDIRECTが返すのは値ではなく参照そのものなので、=SUM(INDIRECT("B2:B100")) や =VLOOKUP($A2, INDIRECT("'"&$C$1&"'!$A$2:$D$100"), 2, FALSE) のように、範囲を受け取る引数の位置に置けます。

Q2:シート名の一覧を自動で作れますか?

関数だけでシート名の一覧を作る方法は用意されていません。シート数が固定なら手入力で足ります。一覧が手入力である以上、綴りの不一致が #REF! の最大の原因になります。

Q3:=INDIRECT("R2C3", FALSE) はどういう意味ですか?

第2引数に FALSE を指定すると、R1C1形式(行番号・列番号で位置を表す形式)として解釈されます。R2C3 は2行目・3列目=C2を指します。列を数値で扱いたいときに便利ですが、読み手が混乱しやすいため、通常はA1形式のまま使うほうが無難です。

Q4:INDIRECTを大量に使ったブックが重いです。減らす方法はありますか?

3つの方向があります。①シートの同じ位置を集計しているだけなら串刺し集計に置き換える ②位置指定であればINDEX関数に置き換える ③そもそもシートを分けず、1枚の表に「月」の列を足してピボットテーブルで集計する形に設計を変える。根本的にはシートを分けない設計がいちばん軽くなります。


まとめ

INDIRECTの要点
  • 文字列を参照として読み直す関数。参照先を後から差し替えられる
  • 本命はシートをまたぐ参照。"'" & A2 & "'!B3" と必ず囲む
  • テーブルや名前の定義も文字列でくるめば参照にできる
  • ⛔ 揮発性・行挿入に追従しない・閉じたブック不可の3点は先に把握する
  • 同じ位置の合計なら串刺し集計、位置指定ならINDEXで足りる

※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、白石です。製造業の生産管理で15年、毎日の実績集計と帳票づくりをExcelでやってきました。マクロを組もうとして早々に挫折し、そこからは「関数と表の機能だけでどこまでやれるか」でしのいできた口です。部門では「この集計どうやるの」と聞かれる係になり、聞かれた内容を手元にメモし続けました。そのメモがいつのまにか、関数名ではなくやりたいことから引く形になっていて、それがこのサイトのもとになっています。Excelは同じことをやるのに何通りもやり方があって、しかもバージョンによって使える関数が違います。ここでは実際に動かして確かめた式だけを載せ、つまずきやすいところと使えないバージョンを先に書くようにしています。

目次