概要
INDEX関数は「指定した“行番号 × 列番号”の交点の値を取り出す」ための関数です。
イメージとしては「表の中から、“何行目・何列目”のマスをピンポイントで抜き出す」感じです。
VLOOKUPのように「左端からしか取れない」といった制約がなく、
MATCH関数と組み合わせることで「見出し名で行・列を探して値を取る」という、柔軟で壊れにくい参照が作れます。
基本の使い方(行番号+列番号で指定)
書式
=INDEX(範囲, 行番号, [列番号])
- 範囲:値を取り出したい表(1行×複数列、複数行×1列でもOK)
- 行番号:範囲の“上から何行目”か(1が先頭)
- 列番号:範囲の“左から何列目”か(1が先頭)。省略可(縦一列の範囲なら省略することが多い)
単純な例
A2:C5 の表があるとして、「2行目3列目の値」を取りたいとき:
=INDEX(A2:C5, 2, 3)
- A2:C5 の中で
- 上から2行目 → 実際の行としては「3行目」(A3:C3)
- 左から3列目 → C列
つまり「C3 の値」を返します。
行または列だけのINDEX
縦一列から行番号だけで取る
A2:A10 から「上から5番目」の値を取りたいとき:
=INDEX(A2:A10, 5)
これは実際には「A6」の値です(A2から数えて5番目 → A6)。
列番号は不要なので省略しています。
横一行から列番号だけで取る
A1:F1 から「左から4番目」の値を取りたいとき:
=INDEX(A1:F1, 4)
範囲が1行だけなら「行番号」ではなく「列番号」で解釈されます(A1:F1 の4番目 → D1)。
MATCHと組み合わせて“見出しベース”で値を取る
本領発揮はここです。
「何行目・何列目か」を、固定の数字ではなく MATCHで自動で探させる と、列の挿入・順番変更に強い式になります。
行は固定、列を見出し名で動的に指定
1行目にヘッダー、2行目以降にデータが並んでいる表を考えます。
- A1:Z1 … 見出し(項目名)
- A2:Z2 … 1件目のデータ
「”売上”という見出しの列の、2行目の値」を取りたいとき:
=INDEX(A2:Z2, MATCH("売上", A1:Z1, 0))
- MATCH(“売上”, A1:Z1, 0) で、「売上」がヘッダー行の何列目かを取得
- その列番号を INDEX の第2引数に渡しているイメージです
行も列も両方を見出しから指定(2次元INDEX)
- A1:Z1 … 横方向の見出し(項目名)
- A2:A100 … 縦方向の見出し(顧客名など)
- A2:Z100 … データ本体
「顧客名がH2、項目名がH3 に入っているとして、その交点の値」を取りたい式はこう書けます。
=INDEX(A2:Z100,
MATCH(H2, A2:A100, 0),
MATCH(H3, A1:Z1, 0))
- MATCH(H2, A2:A100, 0) で「顧客が何行目か」
- MATCH(H3, A1:Z1, 0) で「項目が何列目か」
- INDEX がその交点を返す
これが「行列指定で値取得」の典型パターンです。
よくあるつまずきと対策
1. INDEXの行・列番号は「範囲内での位置」
A2:C5 を範囲にしたときの 行番号=1 はシート全体の1行目ではなく、A2:C5 の中の一番上(=2行目) です。
=INDEX(A2:C5, 1, 1)→ A2=INDEX(A2:C5, 2, 1)→ A3
というイメージで、「範囲の中で何番目か」を指定していることを忘れないようにしてください。
2. 行番号や列番号に0は使えない(基本形)
通常の使い方では、行番号・列番号は1以上の整数です。
(範囲の全部を返す配列形INDEXはありますが、まずは「1〜」だと覚えてOK)
3. MATCHの結果と組み合わせるときは“範囲を揃える”
たとえば、
- MATCHの範囲:A1:Z1
- INDEXの範囲:B2:Z100
のように“片側だけ1列ずれている”と、列番号と実際の列が合わなくなります。
MATCHで使う範囲と、INDEXの範囲の「行・列の開始位置」を揃える癖をつけると安全です。
4. VLOOKUPより壊れにくい
VLOOKUP は「列番号」を固定の数字で持つので、列の挿入で簡単にズレます。
INDEX+MATCHなら、
- MATCHが見出しを探して列番号を返す
- INDEXは「何番目の列か」だけを見ている
ので、列を挿入・削除しても“見出しさえ残っていれば”正しく追従してくれます。
例題
問題1: A2:C5 の表から、2行目3列目の値を D2 に表示してください。
=INDEX(A2:C5, 2, 3)
問題2: A2:A10 から「上から5番目」の値を B2 に表示してください。
=INDEX(A2:A10, 5)
問題3: A1:Z1 に見出し、A2:Z2 にデータがあるとき、「売上」という見出しの2行目の値を B5 に表示してください(MATCHと組み合わせて)。
=INDEX(A2:Z2, MATCH("売上", A1:Z1, 0))
問題4: A1:Z1 に見出し、A2:A100 に顧客名、A2:Z100 にデータがあります。H2 に顧客名、H3 に項目名が入っているとき、交点の値を H4 に表示してください。
=INDEX(A2:Z100,
MATCH(H2, A2:A100, 0),
MATCH(H3, A1:Z1, 0))
問題5: A1:E1 に「日付, 担当者, 商品, 数量, 売上」、A2:E100 にデータがあります。G1 に項目名、G2 に行番号(2〜100)が入っているとき、「G1で指定した項目の、G2行目の値」を G3 に表示してください。
=INDEX(A2:E100, G2-1, MATCH(G1, A1:E1, 0))
※範囲がA2から始まるので「行番号」は「G2-1」です(A2が1行目扱い)。
まとめ
INDEXは「表の中から、行番号×列番号で値を抜き出す」関数です。
単体では「位置指定」、MATCHと組み合わせると「見出し名ベースで柔軟に値を取得」できるようになります。
=INDEX(範囲, 行番号, 列番号)の形をまず覚える- 行番号・列番号は“範囲内での位置”
- MATCHで行・列番号を動的に求めると、列の挿入・並び替えに強い式になる
この3点を押さえれば、「壊れにくい検索・参照」が作れるようになります。
