Excelを使って日々のデータ管理や分析を行っていると、こんな悩みに直面したことはありませんか?

新しいデータを追加するたびに数式を修正するのが手間だ…

月次データを複数シートで管理しているけど、参照先を毎回変更するのが大変!

作業を効率化して、分析や意思決定にもっと時間をかけたい!
そんな課題を解決するのが「INDIRECT関数」です。
この関数を使えば、セルやシートの参照を動的に設定できるため、データが追加されても数式を修正する必要がなくなり、作業がスムーズに進みます。
本記事では、INDIRECT関数の基本から具体的な活用例、さらに注意点や代替関数まで徹底解説します。初心者の方でもすぐに実践できるよう、わかりやすく解説しますね。

この記事のゴール
- INDIRECT関数の使い方がわかる
- INDIRECT関数と他の機能を組み合わせができる
- INDIRECT関数の注意点がわかる
INDIRECT関数とは?
関数の特徴
INDIRECT関数は、セル参照を文字列で指定することで、動的な参照を可能にする関数です。
例えば、「B2セルに入力された内容を参照先として活用する」ような操作ができます。
これにより、データ構造が変わったり、複数シートにまたがるデータを効率的に操作できる点が大きな特徴です。
関数の構造
INDIRECT関数の構造は以下の通りです。
INDIRECT=(参照先,参照形式)
参照先 : | 参照先のセルを文字列で指定します。(例)「A1」、「Sheet1!B2」 |
参照形式: | 参照形式を指定します(TRUEならA1形式、FALSEならR1C1形式)。 ※A1形式の場合は指定する必要はありません。 |
例:
セルB2に「B6」と入力されている場合、次の式でB6セルの値を取得します
=INDIRECT(B2,TRUE)

INDIRECT関数の活用例

それでは、INDIRECT関数を実際に使ってみましょう
今回は、架空の化粧品会社の顧客カルテを作ってみます。

販売実績を呼び出す/差を計算する
顧客の売上データが月別のシートに記録されているとします。
特定の月間の差を計算したい時、INDIRECT関数を使用すると簡単に実績データを出力したり、差を計算できます。

シート名を動的に参照しているので、月名を変更すれば参照先のシートが自動で変化します。

これで、F1セルの売上データを基準に、前月との差を自動計算できます。
COUNTA関数と組み合わせて最終登録日を出力する
顧客との最終面談日を出力する際には、COUNTA関数と組み合わせると効果的です。
顧客と面談を行うたびに行を追加していく形式の場合、最終行を特定することで最終面談日を出力できます。

これを応用すれば、最終登録された顧客名や日付を簡単に参照できます。
名前の定義と組み合わせて価格表を出力する

今度は、顧客特性に合わせた価格表を表示させてみましょう。
顧客の特性に応じた価格を出力したい場合は、「名前の定義」機能と「INDEX関数」を組み合わせることで効果を発揮します。
名前の定義の設定
- [数式]タブの「名前の定義」をクリックします。

- 任意の名前と参照範囲を設定し、OKを押下します。

- 「名前の管理」を押下して正しく設定されたことを確認しましょう。

INDEX関数の作成

続いて、INDEX関数で名前の定義を呼び出しましょう。
INDEX関数の構造は下記の通りで、指定した範囲内の、指定した行・列のセルを出力してくれます。
今回は、「指定した範囲」に名前の定義で登録した範囲を用いることで動的な参照を行っています。
=INDEX(範囲, 行番号, [列番号])
範囲 : | 参照するセル範囲や配列を指定します。 |
行番号: | 取得するデータがある行の番号を指定します。 |
列番号: | (省略可)取得するデータがある列の番号を指定します。 省略すると1列目が選択されます。 |
- 価格表を出力するセルに、以下の関数を入力します。
=INDEX(INDIRECT([名前の定義]),[行番号を指定するセル],[列番号を指定するセル])

- 参照した価格表の範囲をコピーし、任意の場所に「リンクされた図」として貼り付けます。

これにより、適用価格表の値が変わると、自動的に価格表が変更されるようになりました。
INDIRECT関数が使えない…そんなときの代替関数
INDEX関数・MATCH関数
INDIRECT関数ではなく、INDEX関数とMATCH関数を使って動的な参照を行う方法もあります。
=INDEX(範囲, 行番号, [列番号])
範囲 : | 参照するセル範囲や配列を指定します。 |
行番号: | 取得するデータがある行の番号を指定します。 |
列番号: | (省略可)取得するデータがある列の番号を指定します。 省略すると1列目が選択されます。 |
=MATCH(検索値, 検索範囲, [照合の種類])
検索値 : | 検索する値を指定します。 |
検索範囲 : | 検索対象となるセル範囲を指定します。 |
照合の種類: | (省略可)一致の方法を指定します。 -1:検索値以上の最小値を探す(検索範囲は降順に並べておく)。 1:検索値以下の最大値を探す(検索範囲は昇順に並べておく)。 0:検索値と完全一致する値を探す。 |
例:リストから特定の値を取得
商品名リストがA列、価格リストがB列がある場合:
=INDEX(B:B, MATCH("商品A", A:A, 0))
- MATCH関数で商品名の位置を検索。
- INDEX関数でその位置の価格を取得。
OFFSET関数
OFFSET関数は基準セルからの距離を指定してセルや範囲を参照します。
=OFFSET(基準セル, 移動行数, 移動列数, [高さ], [幅])
基準セル: | 検索する値を指定します。 |
移動行数: | 検索対象となるセル範囲を指定します。 |
移動列数: | (省略可)一致の方法を指定します。 -1:検索値以上の最小値を探す(検索範囲は降順に並べておく)。 1:検索値以下の最大値を探す(検索範囲は昇順に並べておく)。 0:検索値と完全一致する値を探す。 |
高さ : | (省略可)返す範囲の行数を指定します。 |
幅 : | (省略可)返す範囲の列数を指定します。 |
例:基準セル(A1)から3行下のセルを参照
=OFFSET(A1, 3, 0)
これにより、基準セル(A1)から3行下のセルを取得可能です。
まとめ
INDIRECT関数を活用すれば、動的なセル参照や範囲の指定が可能になり、日々のExcel作業を効率化できます。さらに、COUNTAや名前の定義と組み合わせれば、柔軟なデータ分析や管理が実現できます。
また、INDIRECT関数が使えない場合でも、INDEX関数やOFFSET関数といった代替手段を活用することで、似たような結果を得ることができます。

効率的なデータ処理で時間を作って、より重要な分析に集中しましょう!