ExcelのINDEX・INDIRECT・ADDRESS関数で「動的セル参照」をマスターする【VLOOKUP不要】
行番号や列番号が変わるたびに、数式を手で書き直していませんか?
「集計表の特定セルを参照したいけど、毎回修正が面倒で…」――そんな作業、実は数式ひとつで自動化できます。INDEX・INDIRECT・ADDRESS関数を使った「動的セル参照」をマスターすれば、固定参照だらけのシートから卒業できます。
この記事で使う3関数の結論から先に言うと、まずINDEXを使うのが正解です。シートをまたぐ高度な参照が必要なときだけ、ADDRESS+INDIRECTの出番になります。読者が必要な関数だけ読めるよう、次のフローチャートを参考にしてください。
どの関数を使うべか?まず確認する
セルの値を取得したい
↓
範囲内の相対位置で指定できる?
YES → INDEX を使う(推奨・高速)
NO ↓
シート名を動的に切り替えたい?
YES → ADDRESS + INDIRECT を使う
NO → INDIRECT 単体で対処可能か検討
ほとんどのケースはINDEXで解決します。以下では用途別に詳しく解説します。
INDEX関数:まずこれを覚えれば十分
基本構文
=INDEX(範囲, 行番号, 列番号)
具体例で確認する
下のような商品売上表(A1:C5)があるとします。
| (A列)商品 | (B列)1月 | (C列)2月 |
|---|---|---|
| りんご | 10,000 | 12,000 |
| みかん | 8,000 | 9,500 |
| ぶどう | 15,000 | 13,000 |
=INDEX(A1:C5, 3, 2)
この数式は「A1:C5の範囲の3行目・2列目」= B3セルの値「15,000」 を返します。行番号・列番号を変えるだけで参照先を自由に変えられるのがポイントです。
MATCH関数と組み合わせて最強の参照を実現
単体でも使えますが、MATCHと組み合わせると「名前でセルを特定する」動的検索が可能になります。
=INDEX(B2:C4, MATCH(E2, A2:A4, 0), MATCH(F2, B1:C1, 0))
- E2に「ぶどう」、F2に「2月」と入力すると → 13,000 が返る
- E2を「りんご」に変えると → 12,000 に自動更新
VLOOKUPと違い、列方向・行方向どちらにも対応できる点が大きな強みです。VLOOKUP卒業の第一歩として、INDEX+MATCHの組み合わせを強くおすすめします。
ADDRESS+INDIRECT:シートをまたぐ動的参照に使う
この組み合わせが必要なシーン
「Sheet1・Sheet2・Sheet3…のような複数シートを、条件に応じて切り替えて参照したい」――このような場面ではINDEX単体では対応できません。ADDRESS関数とINDIRECT関数を組み合わせることで実現できます。
ADDRESS関数:セル番地を文字列で生成する
=ADDRESS(行番号, 列番号)
=ADDRESS(3, 2) → 結果:"$B$3"(文字列)
ADDRESS関数は「セルの住所(アドレス)を文字列として生成する」関数です。返ってくるのは文字列であり、セルの値ではありません。 単体では値の取得に使えないため、次のINDIRECTと必ずセットで使います。
INDIRECT関数:文字列をセル参照に変換する
=INDIRECT(参照文字列)
INDIRECTは「文字列として書かれたセル番地」を、実際のセル参照に変換して値を返す関数です。ADDRESSと組み合わせると次のようになります。
=INDIRECT(ADDRESS(3, 2)) → B3セルの値を取得
シートをまたいだ動的参照の実例
=INDIRECT("Sheet" & A1 & "!" & ADDRESS(B1, C1))
| セル | 入力値 | 意味 |
|---|---|---|
| A1 | 2 | 参照するシート番号 |
| B1 | 3 | 行番号 |
| C1 | 2 | 列番号 |
→ Sheet2のB3セルの値が返る。A1を「3」に変えるだけでSheet3のB3に切り替わります。
月次レポートを複数シートに分けて管理しているときや、部署別にシートが分かれているケースで特に役立ちます。
INDIRECTの注意点:揮発性関数である
INDIRECTは揮発性関数(Volatile Function)です。これは「シートが再計算されるたびに毎回評価される」という特性で、大量に使用するとファイルの動作が重くなる原因になります。
- ✅ 数十セル程度の使用:問題なし
- ⚠️ 数百〜数千セルへの使用:動作が重くなる可能性あり
- ❌ INDEX関数で代替できる場面でのINDIRECT使用:避けるべき
3関数の特性まとめ
| 関数 | 返すもの | セル値の取得 | 動的参照 | パフォーマンス |
|---|---|---|---|---|
| INDEX | セルの値 | ✅ 直接取得 | ✅ | ⭐⭐⭐ 高速 |
| ADDRESS | 文字列(番地) | ❌ 単体では不可 | △ | ⭐⭐⭐ 高速 |
| INDIRECT | 文字列→参照変換 | ✅(ADDRESS併用) | ✅ | ⭐ 揮発性に注意 |
まとめ:使い分けの3原則
まずINDEXを検討する:範囲内の行・列指定はINDEXで完結。MATCHとの組み合わせでVLOOKUP以上の柔軟な参照が可能。
シートをまたぐ動的参照はADDRESS+INDIRECT:シート名を変数として扱いたいときの専用構成。単体ではなく必ずセットで使う。
INDIRECTの多用は避ける:揮発性関数のため、大量使用はパフォーマンス劣化の原因になる。INDEXで代替できるなら迷わずINDEXを選ぶ。
固定参照だらけのスプレッドシートから脱却すると、数式の保守コストが大幅に下がります。まずはINDEX+MATCHの組み合わせから実際のシートで試してみてください。
次回は【Lookupシリーズ】として、OFFSET関数を使った動的範囲の指定について解説予定です。お楽しみに!