スプレッドシートのINDIRECT関数とは?
「シート名をセルで切り替えたい」「プルダウンの選択に応じて参照先を変えたい」――そんな場面、ありませんか?
手作業でいちいち数式を書き換えるのは面倒ですし、シートが増えるたびに修正が必要になります。
スプレッドシートのINDIRECT関数を使えば、文字列をセル参照に変換できます。参照先を動的に切り替える仕組みが、数式ひとつで作れますよ。
読み方・語源
INDIRECT関数は「インダイレクト関数」と読みます。英語の「indirect」は「間接的な」という意味です。
セル番地を直接指定するのではなく、文字列を経由して間接的に参照する。この動きがそのまま関数名になっています。
INDIRECT関数でできること
INDIRECT関数を使うと、次のようなことができます。
- 文字列で指定したセル番地の値を取得する
- プルダウンの選択値に応じて参照先シートを切り替える
- IMPORTRANGE(別ファイルのデータを取り込む関数)と組み合わせて、参照先ファイルを動的に変更する
- セル番地を文字列の結合で組み立てて参照する
ポイントは「参照先を固定しない」ことです。セルの値や数式の結果に応じて、どこを見に行くかを自在に変えられます。
スプレッドシートのINDIRECT関数の書き方(構文・引数)
基本構文
=INDIRECT(セル参照の文字列, [A1形式にする])
引数の説明
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| セル参照の文字列 | 必須 | セル参照を表す文字列、またはその文字列が入ったセル参照 |
| A1形式にする | 省略可 | TRUE(またはデフォルト)= A1形式。FALSE = R1C1形式 |
第1引数には"A1"のような文字列リテラルだけでなく、セル参照も渡せます。たとえばA1セルに「B3」と入力されていれば、=INDIRECT(A1)でB3セルの値を取得します。
第2引数は、ほとんどの場合は省略してOKです。R1C1形式を使いたいときだけFALSEを指定してください。
INDIRECT関数の基本的な使い方
同じシート内のセルを文字列で参照する
もっともシンプルな使い方です。文字列でセル番地を指定して、その値を取得します。
たとえばB2セルに「100」と入っているとします。
=INDIRECT("B2")
結果は「100」です。"B2"という文字列が、B2セルへの参照に変換されます。
「それなら=B2と書けばいいのでは?」と思いますよね。そのとおりです。この使い方だけなら、INDIRECT関数を使うメリットはありません。
真価を発揮するのは、参照先を動的に変えたいときです。
別シートのセルを動的に参照する
A1セルに「売上データ」というシート名が入っているとします。「売上データ」シートのB2セルの値を取得するには、次のように書きます。
=INDIRECT(A1&"!B2")
A1の値と"!B2"を結合して、"売上データ!B2"という文字列を作っています。INDIRECT関数がこれをセル参照に変換してくれます。
A1セルの値を「経費データ」に変えれば、参照先は自動で「経費データ!B2」に切り替わります。数式を書き換える必要はありません。
注意点: シート名にスペースや記号が含まれる場合は、シングルクォーテーションで囲む必要があります。
=INDIRECT("'"&A1&"'!B2")
セル番地を文字列で組み立てて参照する
行番号や列名をセルに持たせて、参照先を組み立てることもできます。
A1セルに「B」、B1セルに「5」と入っているとします。
=INDIRECT(A1&B1)
"B"と"5"が結合されて"B5"になり、B5セルの値を取得します。
ADDRESS関数(行番号と列番号からセル番地の文字列を生成する関数)と組み合わせる方法もあります。
=INDIRECT(ADDRESS(3,2))
ADDRESS(3,2)は"$B$3"を返します。これをINDIRECT関数がB3セルへの参照に変換し、B3の値が取得されます。
スプレッドシートならではの実践活用パターン
パターン1: プルダウンで参照先シートを切り替える
月別にシートを分けている場合を考えてみましょう。「1月」「2月」「3月」というシートがあるとします。
A1セルにプルダウンを作成し、シート名を選べるようにします。B2セルに次の数式を入力します。
=INDIRECT(A1&"!B2")
プルダウンで「2月」を選ぶと、2月シートのB2が参照されます。「3月」に切り替えれば、3月シートのB2に変わります。
月次レポートの集計など、同じ構成のシートを切り替えて見たいときに便利です。
範囲全体を参照したい場合は、次のように書きます。
=SUM(INDIRECT(A1&"!B2:B10"))
これでプルダウンの選択に応じたシートのB2:B10が合計されます。
パターン2: IMPORTRANGE+INDIRECTで別ファイルを動的に切り替える
これはスプレッドシートならではの使い方です。Excelではできません。
IMPORTRANGE関数は、別のスプレッドシートファイルからデータを取り込む関数です。通常はURLを直接指定しますが、INDIRECT関数と組み合わせると参照先ファイルを動的に切り替えられます。
A1セルにスプレッドシートのURLが入っているとします。
=IMPORTRANGE(INDIRECT(A1),"Sheet1!A1:D10")
INDIRECT(A1)がA1セルのURL文字列を返し、IMPORTRANGEがそのファイルのデータを取り込みます。
A1のURLを変えるだけで、別ファイルのデータに切り替わります。部署ごとにファイルが分かれている場合などに活用できます。
注意点: IMPORTRANGEは初回使用時にアクセス許可が必要です。URLを切り替えるたびに、新しいファイルへの許可が求められる場合があります。
パターン3: INDEX/MATCHと組み合わせた検索
INDEX関数(範囲から行・列番号で値を取り出す関数)とMATCH関数(検索キーの位置を返す関数)にINDIRECT関数を組み合わせると、検索対象の範囲自体を動的に切り替えられます。
A1セルにシート名「商品マスタ」が入っているとします。
=INDEX(INDIRECT(A1&"!C2:C100"),MATCH("りんご",INDIRECT(A1&"!B2:B100"),0))
ちょっと長く見えますが、やっていることはシンプルです。
- MATCH関数が「りんご」の行番号を探す
- INDEX関数がその行のC列の値を返す
- INDIRECT関数が検索範囲のシートを動的に決めている
シート名を変えるだけで、別のマスタから同じ検索ができます。
ただし、参照先が固定で決まっている場合はINDIRECT関数を使う必要はありません。INDEX関数とMATCH関数だけで十分です。「参照先を切り替えたい」ときにINDIRECT関数を足す、と覚えておきましょう。
パターン4: 名前付き範囲をINDIRECTで呼び出す
スプレッドシートでは「名前付き範囲」を設定できます。たとえば「売上合計」という名前でA1:A10を定義しているとします。
=SUM(INDIRECT("売上合計"))
名前付き範囲の名称を文字列として渡すと、その範囲を参照できます。
セルに名前付き範囲の名称を入れておけば、動的な切り替えも可能です。
=SUM(INDIRECT(A1))
A1に「売上合計」と入力すれば売上合計の範囲が、「経費合計」と入力すれば経費合計の範囲が参照されます。
よくあるエラーと対処法
INDIRECT関数で発生するエラーと、その原因・対処法をまとめます。
| エラー | 主な原因 | 対処法 |
|---|---|---|
#REF! | 存在しないシート名を指定した | シート名のスペルを確認する |
#REF! | セル参照の文字列が空 | 参照元のセルが空でないか確認する |
#REF! | 不正なセルアドレス(例: "ZZZ1") | セル番地の文字列が正しいか確認する |
#REF! | IMPORTRANGE連携でURLが無効 | URLが正しいか、アクセス許可があるか確認する |
#VALUE! | 第2引数にTRUE/FALSE以外を指定した | 第2引数を省略するか、TRUE/FALSEを指定する |
もっとも多いのは#REF!エラーです。INDIRECT関数に渡している文字列が、有効なセル参照になっているかを確認しましょう。
デバッグのコツは、INDIRECT関数を外して引数の文字列だけを確認することです。たとえば=INDIRECT(A1&"!B2")でエラーが出たら、=A1&"!B2"だけをセルに入力してみてください。出力される文字列を目視で確認するのが一番早いです。
似た関数との違い・使い分け
| 関数 | 特徴 | 使いどころ |
|---|---|---|
| INDIRECT | 文字列をセル参照に変換する | 参照先を動的に切り替えたいとき |
| ADDRESS | 行番号・列番号からセル番地の文字列を生成する | INDIRECTに渡す文字列を組み立てるとき |
| INDEX | 範囲から行番号・列番号で直接値を取得する | 参照先が固定なら、INDIRECTより高速でシンプル |
| VLOOKUP | 検索キーに一致する行の値を返す | 単純な縦方向の検索にはVLOOKUPが手軽 |
INDIRECTとINDEXの使い分けが特に重要です。
INDEX関数は行番号と列番号を指定して値を取得します。参照先が計算で確定するなら、INDEX関数のほうが適しています。
INDIRECT関数は揮発性関数です。シートの値が変更されるたびに再計算されます。大量に使うとスプレッドシートの動作が重くなる可能性があります。
「参照先のシートやファイルを動的に切り替えたい」ならINDIRECT関数。「範囲内の特定の位置から値を取りたい」ならINDEX関数。この基準で選んでみてください。
まとめ
スプレッドシートのINDIRECT関数は、文字列をセル参照に変換する関数です。
この記事のポイントをおさらいします。
- 構文は
=INDIRECT(セル参照の文字列, [A1形式にする]) - 文字列を「間接的に」セル参照として使える
- プルダウンと組み合わせて参照先シートを切り替えられる
- IMPORTRANGE+INDIRECTで別ファイルの動的切り替えができる(スプレッドシート限定)
- 揮発性関数なので、大量使用には注意が必要
- 参照先が固定ならINDEX関数のほうがシンプルで高速
「どのシートを見るか」「どのファイルから取るか」をセルの値で制御したいとき、INDIRECT関数はとても頼りになります。ぜひ活用してみてください。
