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つは書き方が似ていますが、意味がまったく違います。
| 数式 | 動き |
|---|---|
=A1 | A1に入っている値をそのまま返す |
=INDIRECT(A1) | A1に入っている文字を参照先とみなし、その参照先の値を返す |
A1に B5 という文字が入っていれば、=INDIRECT(A1) はB5の値を返します。参照先を後から差し替えられるのがINDIRECTの本質です。

基本の使い方
直接書く場合
=INDIRECT("B5")
この式は =B5 と同じ結果になります。ただし違いが1つあります。B5の上に行を挿入しても、INDIRECTの参照先は文字列 "B5" のまま動きません。通常の参照なら =B6 に書き換わるところです。
この性質は、弱点であると同時に「位置を固定したい」場面では利点にもなります。
セルに書いた参照先を使う
参照先を切り替えたい場面での基本形です。
| セル | 内容 |
|---|---|
| A1 | B5(切り替えたい参照先を文字で入力) |
| 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は名前も参照に変えられます。
=SUM(INDIRECT("商品リスト"))
セルの値から名前を組み立てられるので、=SUM(INDIRECT(A2 & "リスト")) のように名前そのものを切り替える使い方ができます。
テーブルの列を参照する
データの入力規則など、テーブル参照をそのまま書けない場所では、INDIRECTで文字列にくるみます。
=INDIRECT("テーブル1[商品名]")
テーブルは行を足すと範囲が自動で広がるため、参照側を書き換えなくても追従します。プルダウンの項目を自動で増やしたいときの定番の形です。
なお、1つ目の選択で2つ目の候補が変わる連動プルダウンも、名前の定義とINDIRECTの組み合わせで作ります。設定手順はプルダウンの記事にまとめてあります。
⛔ 使う前に知っておく3つの弱点
① 揮発性関数である
INDIRECTは揮発性関数です。参照先が変わっていなくても、シート上のどこかを編集するたびに再計算されます。
数十個なら体感できませんが、数千行に敷き詰めると、入力のたびに待たされるブックになります。行数の多い表では、次章の代替手段を先に検討してください。
② 行や列の挿入に追従しない
参照先は文字列なので、シートの構造が変わっても書き換わりません。
- B5を参照している状態で上に行を挿入しても、INDIRECTはB5のまま(本来はB6を指すべき)
- 参照先のセルを切り取って移動しても、追いかけない
- シート名を変更すると、途端に
#REF!になる
「使う人がシートを触らない」前提が崩れると、静かに間違った値を返します。
③ 閉じたブックは参照できない
他のブックをINDIRECTで参照した場合、参照先のブックを開いている間しか値が取れません。閉じると #REF! になります。通常のリンク参照は閉じていても値が残るため、ここは明確な違いです。

うまくいかないときの原因と直し方
| 症状 | 主な原因 | 直し方 |
|---|---|---|
#REF! になる | シート名の綴り違い・シートを削除した | シート名を実際のタブと突き合わせる |
#REF! になる(記号を含むシート名) | シングルクォートで囲んでいない | "'" & A2 & "'!B3" の形に直す |
#REF! になる(名前の定義) | その名前が存在しない | 「名前の管理」で綴りを確認する |
| 参照先がずれている | 行や列を挿入した | 文字列側の行番号を直す。または通常参照に戻す |
| 他ブックの値が取れない | 参照先ブックが閉じている | 参照先を開く。または同じブックにデータを移す |
| ブックが重い | 揮発性の再計算 | INDEXなど非揮発性の関数に置き換える |
| 結果が文字のまま出る | INDIRECTを付け忘れている | =A1 ではなく =INDIRECT(A1) になっているか確認する |
シート名を後から変更した場合、通常の参照は自動で追随しますが、INDIRECTは追随しません。シート名をキーにする設計にしたときは、「シート名は変更しない」ことを表の中に明記しておくと事故が減ります。
似た関数との使い分け
| 手段 | 揮発性 | 選ぶ場面 |
|---|---|---|
| INDIRECT | あり | 参照先を文字列から組み立てたい。シート名を可変にしたい |
| INDEX | なし | 同じシート内で位置を指定して取り出したい |
| CHOOSE | なし | 候補が数個で固定。番号で選び分けたい |
| OFFSET | あり | 基準セルからの相対位置で範囲を動かしたい |
| 串刺し集計(3-D参照) | なし | 複数シートの同じ位置を合計したい |
シート集計なら串刺し集計で足りることが多い
すべてのシートで同じ位置のセルを合計するだけなら、INDIRECTは不要です。
=SUM('4月:3月'!B3)
先頭シートと末尾シートを : でつなぐ書き方で、間に並んでいるシートすべてのB3が合計されます。シートを間に追加すれば自動的に含まれます。数字で始まるシート名はシングルクォートで囲みます。
- 串刺し集計が向く:全シートの同じ位置を合計するだけ
- INDIRECTが向く:シートごとに違う位置を取りたい、集計結果を月ごとに並べたい

位置指定なら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枚の表に「月」の列を足してピボットテーブルで集計する形に設計を変える。根本的にはシートを分けない設計がいちばん軽くなります。
まとめ
- 文字列を参照として読み直す関数。参照先を後から差し替えられる
- 本命はシートをまたぐ参照。
"'" & A2 & "'!B3"と必ず囲む - テーブルや名前の定義も文字列でくるめば参照にできる
- ⛔ 揮発性・行挿入に追従しない・閉じたブック不可の3点は先に把握する
- 同じ位置の合計なら串刺し集計、位置指定ならINDEXで足りる
※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。

