「Excelの作業、もっとラクにできないかな…」と感じたことはありませんか。そんなときに役立つのがINDIRECT(インダイレクト)関数です。この記事では、パソコンにあまり詳しくない方でも理解できるよう、基本の使い方から、当サイトが実機で確かめた「つまずきポイント」までをやさしく解説します。数式のコピペだけでなく、なぜエラーになるのかまで分かるように整理しました。
INDIRECT関数とは
文字列でセルを参照する関数
INDIRECT関数は、文字列で指定したセルの値を取得する関数です。たとえばセルA1に文字列「B2」と入力しておき、別のセルに =INDIRECT(A1) と入力すると、そのセルにはセルB2の値が表示されます。これは、A1に入力された「B2」という文字列をセルの参照先として読み取り、その参照先の値を返す仕組みです。
普通の数式は =B2 のように「セルそのもの」を指しますが、INDIRECTは「B2という文字」を手がかりに参照を組み立てる点が大きな違いです。この違いが、あとで説明するエラーの原因にもつながります。
基本的な構文
INDIRECT関数の基本的な書き方は次のとおりです。
=INDIRECT(参照文字列, [参照形式])
- 参照文字列 … 参照したいセルの位置を文字列で指定します(例「B2」「Sheet1!A1」)。
- 参照形式 … 省略できます。省略またはTRUEでA1形式、FALSEでR1C1形式として解釈します。
通常はA1形式を使うため、第2引数は省略して問題ありません。Microsoft公式の「INDIRECT 関数」ページでも、INDIRECTを使うと数式そのものを書き換えずに参照先を変えられること、第2引数でA1形式とR1C1形式を切り替えられることが説明されています(出典は記事末尾)。
公式の仕様を実機で直接参照と対比して確かめた
ここからは、Microsoft公式に書かれている仕様を、当サイトがExcel 2019(買い切り版・バージョン16.0.19127)で実際に操作し、普通のセル参照(直接参照)と並べて確かめた結果を紹介します。数式の結果は、当サイトの実機で表示された値をそのまま記載しています。
- 公式は『参照文字列に適切なセル参照を指定していない場合、エラー値 #REF! が返されます』と定めています。R1C1形式の文字列・引用符なしのスペース入りシート名・改名後の古い名前は、いずれもこの「不正な参照」に当てはまり#REF!になります。以下はそれを条件別に実機で再現したものです。
シートを改名すると直接参照は追従しINDIRECTだけ壊れる

同じセル(SrcシートのセルA1、値は999)を、直接参照 =Src!A1 と =INDIRECT("Src!A1") の両方で参照した状態を用意し、シート名を「Src」から「Source」に変更してみました。当サイトの実機で試したところ、直接参照のほうは数式が自動的に =Source!A1 へ書き換わり、999をそのまま表示し続けました。一方でINDIRECTのほうは数式が =INDIRECT("Src!A1") のままで、文字列の「Src」は書き換わらず、存在しないシートを指してしまい結果は#REF!エラーになりました。
つまりINDIRECTの中の参照は「ただの文字」なので、シート名を変えてもExcelが面倒を見てくれません。改名後に古い名前を指してしまうのは、公式が言う「不正な参照は#REF!」の一例です。ただし直接参照は自動で追従するのにINDIRECTだけが取り残されるという違いに注意してください。シート名を変える可能性がある表では、この点が思わぬエラーの原因になります。
セルを挿入しても直接参照は追いINDIRECTは追わない

次に、セルA1に10を入れ、C1に =A1、D1に =INDIRECT("A1") を入力しました。ここでA1の位置に空のセルを挿入して、列Aの中身を1つ下(A2)へずらしてみます。当サイトの実機では、元の10はA2へ移動し、直接参照のC1は数式が =A1 から =A2 へ自動調整されて10を表示し続けました。ところがINDIRECTのD1は =INDIRECT("A1") のままで、今は空になったA1を指すため結果は0になりました。
ここで一番こわいのは、#REF!のようなエラーすら出さず、静かに0を返してしまう点です。#REF!なら間違いに気づけますが、0は正しい計算結果に見えてしまい、集計の合計がいつの間にか狂う原因になります。直接参照はデータを追いかけるのにINDIRECTは追わない、というこの対比も公式では説明されていません。行や列の挿入・削除が多い表では、INDIRECTが思わぬ場所を指していないか必ず確認しましょう。
第2引数を省略するとA1形式になりR1C1文字列はエラー
セルA2に555を入れ、参照形式の指定を変えて3通り試しました。当サイトの実機での結果は次のとおりです。
=INDIRECT("R2C1",FALSE)は555。第2引数FALSEでR1C1形式として解釈され、R2C1(2行1列=A2)を正しく参照しました。=INDIRECT("R2C1")は#REF!。第2引数を省略すると既定のA1形式で解釈され、「R2C1」はA1形式として不正なためエラーになりました。=INDIRECT("A2")は555。省略時はA1形式なので、そのまま素直に参照できました。
ここから、第2引数を省略すると既定でA1形式になることが実機で確認できます。R1C1形式の文字列を渡したいときは、第2引数にFALSEを付け忘れないようにしてください。
シート名にスペースがあるときは単一引用符で囲む

「My Data」のようにスペースを含むシート名(セルA1に777)を参照するとどうなるかも試しました。当サイトの実機では、=INDIRECT("My Data!A1") のように引用符で囲まないと#REF!になり、=INDIRECT("'My Data'!A1") のようにシート名を単一引用符(’)で囲むと777が正しく表示されました。
これは、スペースや記号を含むシート名は単一引用符で囲むというExcel共通のルールにINDIRECTも従うためです。スペース入りのシート名は単一引用符で囲む、と覚えておくと安心です。
セルの数字だけで参照する行を動的に切り替える

INDIRECTの便利さが一番伝わるのがこの動きです。M1に100、M2に200、M3に300を入れ、別のセルに =INDIRECT("M"&K1) と入力します。当サイトの実機で、K1の値を3→2→1と変えたところ、結果は300→200→100と切り替わりました。数式そのものは一切変えず、K1の数字を変えるだけで参照する行が動くのです。
このように「文字列を組み立てて参照を作る」ことで、あとから紹介する集計やリスト連動といった便利な使い方につながります。
INDIRECT関数の活用例
ここからは実務でよく使う3つの場面を、当サイトが実機で試した結果とあわせて紹介します。
シート名をセルから参照する
各店舗の売上が「東京」「大阪」などのシートに分かれているとき、集計シートのセルA1にシート名を入力し、隣のセルに =INDIRECT(A1&"!B2") と入力します。当サイトの実機で試したところ、A1が「東京」のときは東京シートのB2(111)、A1を「大阪」に変えると大阪シートのB2(222)が取得できました。シート名をセルから差し替えるだけで参照先が切り替わるので、複数シートの集計がぐっとラクになります。
VLOOKUP関数と組み合わせる
会員種別ごとに料金表が分かれているケースでは、VLOOKUPの検索範囲をINDIRECTで切り替えられます。料金表の範囲に「Gold」などの名前を定義しておき、次のように書きます。
=VLOOKUP(検索値, INDIRECT("Gold"), 2, FALSE)
当サイトの実機では、INDIRECT(“Gold”)が名前「Gold」の範囲を返し、その表から検索値に対応する価格を取り出せました。名前の部分をセル参照にすれば、会員種別に応じて数式を書き換えずに料金表を切り替えられます。
ドロップダウンリストと連動させる(落とし穴に注意)
「A1で選んだ値に対応するリストをB1に出す」という連動もINDIRECTで作れますが、ここには実機で確かめた落とし穴があります。あらかじめ各グループ名で「名前の定義」をしておき、B1の入力規則の元の値に =INDIRECT(A1) と設定します。当サイトの実機での結果は次のとおりです。
- A1の値が定義した名前とぴったり一致するときだけ、その範囲が返り連動が成功しました。
- A1の値が定義名と1文字でも違うと#REF!になり、リストが出ませんでした。全角と半角、余分な空白にも要注意です。
- そもそも名前にスペースを含めようとすると、Excelが名前の定義自体を受け付けませんでした。グループ名にスペースを使う設計は避ける必要があります。
「=INDIRECT(A1) と書けば必ず表示される」わけではなく、選択値と定義名を完全に一致させることが連動成功の条件です。
公式ドキュメントで仕様を確認する

参照形式(A1形式・R1C1形式)や引数の詳しい仕様は、Microsoftの公式ページで確認できます。上の画像をクリックすると公式ページが開きます。実機での挙動と公式の説明を突き合わせると、理解が確かなものになります(リンクは記事末尾の出典欄にも掲載しています)。
よくある質問や疑問
INDIRECTを使うとエラーが出るのはなぜですか
公式ページには『参照文字列に適切なセル参照を指定していない場合、エラー値 #REF! が返されます』とあり、参照先が正しく指定できていないことが主な原因です。たとえばシート名を「Sheet1」と指定しているのに実際のシート名が違っていたり、あとから改名していたりすると =INDIRECT(A1&"!B2") は#REF!になります。この記事の前半で紹介したR1C1形式の文字列・引用符なしのスペース入りシート名・改名後の古い名前も、すべてこの1つのルールから説明できます。INDIRECTは文字列を書き換えてくれないので、参照先の名前が今も正しいかを確認しましょう。
INDIRECTは他のブックでも使えますか
この点は公式の仕様に明記があります。Microsoft公式ページには『参照文字列で他のブックを参照している場合 (外部参照)、そのブックを開いておく必要があります。参照先のブックを開いていない場合、エラー値 #REF! が返されます』と記載されています。他のブックを参照するときは、そのブックを開いた状態で使ってください(外部ブックの参照は当サイトでは未検証のため、公式仕様としてご案内しています)。
まとめ
INDIRECT関数は、文字列でセルやシートを動的に参照できる便利な関数です。一方で、当サイトが実機で確かめたとおり、シートの改名やセルの挿入では中の文字が書き換わらず#REF!や意図しない値になることがあります。動的に切り替えられる強みと、追従してくれない弱みの両方を押さえておけば、集計やリスト連動でしっかり使いこなせます。まずは小さな表で実際に試してみてください。
Excelの関数でつまずいたり、「自分の表だとどう書けばいい?」と迷ったりしたら、画面を見ながら一緒に解決できます。お気軽にご相談ください。
出典・引用サイト
最終確認日 2026年7月16日(Excel 2019 買い切り版・バージョン16.0.19127で動作確認)/文責 uri uri



コメント