【Excel】VLOOKUP結果のセルアドレスを取得したい?CELL+INDEXで解決
「VLOOKUPで値は取れたのに、そのセルの場所(アドレス)がわからない…」と詰まった経験はありませんか?
実は VLOOKUP単体ではセルアドレスを取得できません。しかし CELL関数 + INDEX+MATCH を組み合わせれば、たった1行の数式でアドレスを文字列として取得できます。
=CELL("address", INDEX(C2:C4, MATCH(102, A2:A4, 0)))
→ "$C$3"
この記事では、上記の数式の仕組みから、HYPERLINK関数を使った応用まで、実務ですぐ使えるレベルで解説します。
なぜセルアドレスが必要になるのか?
通常のLOOKUP系関数は「値」を返します。しかし以下のような場面では、値がどこにあるかという位置情報が必要になります。
- HYPERLINK関数と組み合わせて、検索結果セルへのジャンプリンクを動的生成したい
- ダッシュボードで「この値は〇〇シートの△△番地にあります」と表示したい
- INDIRECT関数を使って間接参照をしたい
- デバッグ目的で、どのセルが参照されているか確認したい
こうした用途に、これから紹介する CELL + INDEX + MATCH の組み合わせが活躍します。
CELL関数とINDEX+MATCHを最初から組み合わせて理解する
CELL関数の役割
CELL関数 は、指定したセルに関する情報を文字列で返す関数です。
=CELL(情報の種類, 参照)
情報の種類 に "address" を指定すると、そのセルの絶対参照アドレス(例:$B$5)を返します。
ただし、CELL関数に渡す「参照」はセル参照そのものでなければなりません。ここがポイントです。
VLOOKUPではなくINDEXを使う理由
| 関数 | 返すもの | CELLと組み合わせ |
|---|---|---|
| VLOOKUP | 値(数値・文字列) | ❌ 不可 |
| INDEX | セル参照 | ✅ 可能 |
| XLOOKUP | セル参照 | ✅ 可能 |
VLOOKUPは「値」しか返さないため、CELL("address", VLOOKUP(...)) は正しく機能しません。一方、INDEX関数はセル参照そのものを返すという特性があるため、CELLと組み合わせることができます。
基本の数式パターン
=CELL("address", INDEX(返す範囲, MATCH(検索値, 検索範囲, 0)))
具体例:商品IDから価格セルのアドレスを取得する
以下のようなデータがあるとします。
| A列(商品ID) | B列(商品名) | C列(価格) |
|---|---|---|
| 101 | りんご | 150 |
| 102 | みかん | 80 |
| 103 | ぶどう | 300 |
商品ID 102 の価格セル(C3)のアドレスを取得したい場合:
=CELL("address", INDEX(C2:C4, MATCH(102, A2:A4, 0)))
→ "$C$3"
数式の読み方:
1. MATCH(102, A2:A4, 0) → A列で102を検索し、行番号 2(範囲内2番目)を返す
2. INDEX(C2:C4, 2) → C列の2番目のセル(C3)へのセル参照を返す
3. CELL("address", C3) → "$C$3" という文字列を返す
Excel 365/2021以降ならXLOOKUPも使える
Excel 365やExcel 2021以降では XLOOKUP でも同様のことができます。記述がシンプルになるうえ、左方向の検索にも対応しています。
=CELL("address", XLOOKUP(102, A2:A4, C2:C4))
→ "$C$3"
新しい環境であれば積極的に活用しましょう。古いバージョンとの互換性が必要な場合はINDEX+MATCHを選んでください。
応用①:HYPERLINK関数でジャンプリンクを作る
取得したアドレスをHYPERLINK関数に渡すと、クリックで該当セルに飛ぶリンクを動的に生成できます。
同一シート内へのジャンプ:
=HYPERLINK(
"#"&CELL("address", XLOOKUP(A1, A2:A4, C2:C4)),
"結果セルへジャンプ"
)
先頭に "#" を付けることで、同一ブック内のセルへのリンクになります。
別シートへのジャンプ:
=HYPERLINK(
"#Sheet2!"&CELL("address", INDEX(Sheet2!C:C, MATCH(A1, Sheet2!A:A, 0))),
"Sheet2の結果セルへジャンプ"
)
別シートの場合は "#シート名!" をアドレスの前に結合します。ダッシュボードや検索UIを作る際に非常に便利です。
応用②:シート名付きのフルアドレスを取得する ★上級
慣れてきたら挑戦してみてください。別シートのセルを参照する際に、シート名も含めた完全なアドレスを文字列として取得できます。
=MID(CELL("filename", Sheet2!A1), FIND("]", CELL("filename", Sheet2!A1))+1, 100)
& "!" &
CELL("address", INDEX(Sheet2!C:C, MATCH(A1, Sheet2!A:A, 0)))
結果例: Sheet2!$C$3
CELL("filename", ...) でブックのフルパスを取得し、] 以降のシート名部分だけをMIDで切り出して結合しています。
よくあるミスと注意点
① VLOOKUPと組み合わせても動かない
前述の通り、VLOOKUPは値しか返しません。CELL("address", VLOOKUP(...)) は期待通りに動作しないため、必ずINDEX+MATCHかXLOOKUPを使いましょう。
② CELL関数の結果が更新されないことがある
CELL関数は揮発性関数ではないため、別のセルの値を変更しても自動で再計算されない場合があります。結果が古いと感じたら F9 キーで強制再計算してください。
③ 複数行ヒットした場合は最初の行を返す
MATCHは最初にマッチした行番号を返します。検索値が複数存在するデータでは、意図した行のアドレスが返っているか必ず確認しましょう。
まとめ
| 方法 | アドレス取得 | 対応バージョン |
|---|---|---|
| VLOOKUP + CELL | ❌ 不可 | ― |
| INDEX + MATCH + CELL | ✅ 可能 | 全バージョン |
| XLOOKUP + CELL | ✅ 可能 | 365 / 2021以降 |
LOOKUP結果のセルアドレスを取得する場面は限られていますが、知っておくとダッシュボード作成・動的リンク生成・デバッグなど応用の幅が大きく広がります。
まずは以下の基本パターンを自分のシートで試してみてください。
=CELL("address", INDEX(返す範囲, MATCH(検索値, 検索範囲, 0)))
一度動作を確認できると、応用アイデアがどんどん広がっていきます!