スプレッドシートのINDIRECT関数の使い方|文字列からセル参照

スポンサーリンク

スプレッドシートの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))

ちょっと長く見えますが、やっていることはシンプルです。

  1. MATCH関数が「りんご」の行番号を探す
  2. INDEX関数がその行のC列の値を返す
  3. 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関数はとても頼りになります。ぜひ活用してみてください。

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