Excel関数 逆引き集 | 文字列で参照 → INDIRECT

Excel VBA Excel
スポンサーリンク

概要

「セル番地を文字として持っておいて、その文字からセルを参照したい」
「シート名をセルに入れておいて、選んだシートの値を取りたい」

そんな“文字列から参照を作る”ときに使うのが 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"&行番号 のように可変範囲も作れる

という“間接参照のスペシャリスト”です。

一方で、

  • どこを参照しているか分かりにくい
  • 計算が重くなりやすい

という弱点もあるので、
「どうしても文字列から参照したい場面」に絞って使うのが、おすすめの付き合い方です。

タイトルとURLをコピーしました