概要
「セル番地を文字として持っておいて、その文字からセルを参照したい」
「シート名をセルに入れておいて、選んだシートの値を取りたい」
そんな“文字列から参照を作る”ときに使うのが INDIRECT(インダイレクト)関数です。
INDIRECT は
「文字列で書かれたセル参照・範囲参照」を、本物の参照として解釈してくれる関数
と覚えてください。
INDIRECT の基本
書式
=INDIRECT(文字列参照)
文字列参照 のところに、
"A1"のような「セル番地の文字列」"Sheet2!B5"のような「シート名+セル番地」- それらをつなげて作った文字列(
"A"&B1など)
を入れると、その文字列が指しているセルや範囲を参照できます。
いちばん単純な例
A1 に 100 が入っているとして、B1 に次の式を書いてみます。
=INDIRECT("A1")
「”A1″ という文字列 → A1 セル」と解釈されるので、
結果は A1 と同じ 100 になります。
ここでのポイントは、"A1" は“文字列”であって、普通なら数式としては解釈されないものを、
INDIRECT が「参照」として読み替えてくれている、ということです。
セルに書かれた「住所文字列」から参照する
A1 に「A5」という文字が入っている場合
A5 に 500 が入っているとします。
- A1:
A5(文字列) - A5:
500(数値)
このとき B1 に:
=INDIRECT(A1)
と書くと、「A1 に書かれている文字列 = “A5” → A5 セル」と解釈され、
結果は 500 になります。
つまり、
A1 に「どのセルを参照するか」を文字で持っておいて、
INDIRECT で“間接的に”参照しているイメージです。
行番号や列記号を組み合わせて参照を作る
行番号をセルから指定して参照
A列にデータがあり、B1 に「何行目か」が入っているとします。
- A2:A10 … データ
- B1 … 行番号(例:5)
「A列の B1 行目(A5)を参照したい」とき:
=INDIRECT("A"&B1)
” A ” + B1(=5) → “A5” という文字列が作られ、
INDIRECT がそれをセル参照として解釈してくれます。
列も行もセルから指定する
- C1 に「列記号(例:B)」
- C2 に「行番号(例:7)」
が入っているとします。
=INDIRECT(C1&C2)
C1&C2 → “B”&”7” → “B7” となり、B7 を参照します。
別シート名を文字列で持って参照する
INDIRECT の真骨頂は「シート名もセルで切り替える」パターンです。
シート名をセルに入力して切り替える
- D1 にシート名(例:Sheet2)
- そのシートの A1 に、参照したい値
このとき、今のシートで D1 のシートの A1 を参照するには:
=INDIRECT(D1 & "!A1")
D1 & “!A1” → “Sheet2!A1” という文字列になり、
INDIRECT がそれを参照として解釈します。
D1 を「Sheet1」「Sheet3」などに変えると、
参照先シートを簡単に切り替えられます。
シート名にスペースがある場合
シート名が「売上 2024」のようにスペースを含む場合は、
アポストロフィ(’)で囲む必要があります。
=INDIRECT("'" & D1 & "'!A1")
D1 に「売上 2024」が入っていれば、
“‘” & “売上 2024” & “‘!A1” → “‘売上 2024’!A1”
となり、正しく参照できます。
可変範囲を文字列で作る
OFFSET や INDEX でも可変範囲は作れますが、
INDIRECT なら「範囲文字列」をそのまま作って参照できます。
行数が変わる表を「A2:A(行番号)」で参照
- B1 に「最終行番号」(例:10)が入っているとします。
=SUM(INDIRECT("A2:A"&B1))
B1=10 のとき:
- “A2:A”&10 → “A2:A10”
- INDIRECT(“A2:A10”) → A2:A10 を範囲として返す
- SUM でその合計を計算
という流れです。
INDIRECT の注意点
参照先を「文字で見る」ので分かりづらくなる
INDIRECT は柔軟な反面、
式を見ただけでは「どこを参照しているか」が分かりづらくなります。
特に、大規模シートでは使いすぎ注意です。
コメントや名前定義で補うと管理しやすくなります。
計算が重くなりやすい
INDIRECT は「揮発性関数」と言われ、
シートのどこかが変わるたびに再計算されます。
大量に使うと動作が重くなりがちなので、
どうしても必要な箇所に絞るのがおすすめです。
参照先が壊れてもエラーになるだけで気づきにくい
文字列で参照先を作っているため、
シート名変更・セル構造の変更などで「存在しない参照文字列」になっても、#REF! になるだけで、どこが原因か追いにくいことがあります。
例題
問題1: A1 に「B3」という文字列が入っています。B3 には数値 200 が入っています。A1 に書かれたセルを参照して、その値を表示する式を C1 に書いてください。
=INDIRECT(A1)
問題2: B1 に「行番号」(例:7)が入っています。A列の B1 行目(A7)を参照して、その値を C1 に表示する式を書いてください。
=INDIRECT("A"&B1)
問題3: C1 に「列記号」(例:D)、C2 に「行番号」(例:5)が入っています。C1 と C2 で指定されたセル(例:D5)を参照する式を C3 に書いてください。
=INDIRECT(C1&C2)
問題4: D1 にシート名(例:Sheet2)が入っています。D1 で指定されたシートの A1 セルを参照し、その値を今のシートの E1 に表示する式を書いてください。
=INDIRECT(D1 & "!A1")
問題5: B1 に「最終行番号」が入っています(例:10)。A2 から A「B1 行目」までの合計を C1 に表示する式を書いてください。
=SUM(INDIRECT("A2:A"&B1))
まとめ
INDIRECT は、
- 文字列 → 参照 に変換する関数
- セルに書かれた「住所文字列」からセルを参照できる
- シート名をセルに持たせて、参照先シートを切り替えられる
"A2:A"&行番号のように可変範囲も作れる
という“間接参照のスペシャリスト”です。
一方で、
- どこを参照しているか分かりにくい
- 計算が重くなりやすい
という弱点もあるので、
「どうしても文字列から参照したい場面」に絞って使うのが、おすすめの付き合い方です。
