「左側が検索できない」で詰まったことはありませんか?
上司から急に渡されたExcelファイル。商品コードが右列(B列)、商品名が左列(A列)に入っている。VLOOKUPで検索しようとしたら、うまく動かない。締め切りまであと30分——そんな経験をした方は少なくないはずです。
VLOOKUPには「検索列より右側のデータしか取得できない」という制約があります。この記事では、VLOOKUPとCHOOSE関数を組み合わせることで、左の列のデータを取得する方法を数式のコピペですぐ使えるレベルで解説します。
「既存の数式をできるだけ触りたくない」「チーム内でVLOOKUPに統一している」——そういった状況でこそ、このテクニックが役に立ちます。
なぜVLOOKUPは左側を検索できないのか
VLOOKUPの構文は次のとおりです。
=VLOOKUP(検索値, 範囲, 列番号, 検索方法)
「範囲」の一番左の列で検索値を探し、そこから右方向に数えた列のデータを返す仕様です。左方向には移動できません。これは関数の設計上の制約であり、通常の使い方では回避できません。
この制約を突破するのが、CHOOSE関数を使って仮想テーブルを作るというアプローチです。
CHOOSE関数の役割:列の順番を入れ替える
CHOOSE関数の基本
CHOOSE関数は、インデックス番号に応じてリストから値を返す関数です。
=CHOOSE(インデックス番号, 値1, 値2, 値3, ...)
たとえば =CHOOSE(2, "A", "B", "C") は "B" を返します。
ここで重要なのが、引数に「列の範囲」を指定できるという点です。これを使うと、実際のシート上の列順序とは異なる「仮想テーブル」をメモリ上に生成できます。
実践:コピペで使えるVLOOKUP+CHOOSE数式
サンプルデータの構造
次のようなデータがA列〜C列に入力されているとします。
| 行 | A列(商品名) | B列(商品コード) | C列(価格) |
|---|---|---|---|
| 2行目 | りんご | A001 | 150 |
| 3行目 | バナナ | A002 | 80 |
| 4行目 | みかん | A003 | 100 |
目的:B列の商品コード「A002」をキーに、A列の商品名「バナナ」を取得する
通常のVLOOKUPではA列がB列より左にあるため、直接検索できません。
基本の数式(コピペ可)
=VLOOKUP("A002", CHOOSE({1,2}, B2:B4, A2:A4), 2, FALSE)
この数式を入力すると、「バナナ」 が返ってきます。
Excel 2016以前を使っている場合: 数式入力後に
Ctrl + Shift + Enterで確定してください。数式バーに{=VLOOKUP(...)}のように波括弧が付けば正しく動作しています。Excel 2019・Microsoft 365では通常のEnterで問題ありません。
数式の仕組みを分解する
CHOOSE({1,2}, B2:B4, A2:A4)
{1,2}:配列定数。「1番目と2番目を同時に処理する」という指示B2:B4:1番目の列として商品コード列を指定A2:A4:2番目の列として商品名列を指定
この記述により、「B列を左・A列を右」とした仮想テーブルがメモリ上に作られます。VLOOKUPはこの仮想テーブルに対して検索するため、実際のシート上の列順序に関係なく、左の列のデータを取得できます。
応用:複数の列を取得したい場合
商品コードをキーに、商品名と価格を別々のセルで取得したい場面では、CHOOSE内に列を3つ並べて列番号を切り替えます。
商品名を取得(2列目):
=VLOOKUP("A002", CHOOSE({1,2,3}, B2:B4, A2:A4, C2:C4), 2, FALSE)
価格を取得(3列目):
=VLOOKUP("A002", CHOOSE({1,2,3}, B2:B4, A2:A4, C2:C4), 3, FALSE)
CHOOSE({1,2,3}, B列, A列, C列) で仮想テーブルを作り、列番号の数字だけ変えれば複数の情報を柔軟に取り出せます。
エラー対策:検索値が見つからない場合
検索値が存在しない場合、数式は #N/A エラーを返します。IFERROR関数で囲むことで、エラーの代わりに任意のテキストを表示できます。
=IFERROR(VLOOKUP("A999", CHOOSE({1,2}, B2:B4, A2:A4), 2, FALSE), "該当なし")
また、CHOOSE内で指定する各列の範囲は必ず同じ行数にそろえてください。行数がずれると意図しない結果やエラーの原因になります。
INDEX・MATCHと使い分けるには
同じことはINDEX・MATCHでも実現できます。
=INDEX(A2:A4, MATCH("A002", B2:B4, 0))
どちらを使うべきか、目的に応じて選びましょう。
| 比較項目 | VLOOKUP+CHOOSE | INDEX+MATCH |
|---|---|---|
| 可読性 | やや低い | 高い |
| 処理速度 | やや遅い(配列処理) | 速い |
| 既存のVLOOKUP数式を維持したい | ✅ 向いている | ❌ 別構造になる |
| 新規作成・保守重視 | △ | ✅ 向いている |
VLOOKUP+CHOOSEが向いている場面:
- 既存の数式の修正を最小限に抑えたいとき
- チーム内でVLOOKUPに統一しているルールがあるとき
INDEX・MATCHが向いている場面:
- 新規に数式を作成するとき
- 長期的に保守しやすい数式を書きたいとき
なお、Excel 365・2021以降であれば XLOOKUP を使うとさらにシンプルに書けます。環境に制限がなければXLOOKUPも選択肢に入れてみてください。
まとめ:今日から使えるポイントを整理
- VLOOKUPは検索列より右側のデータしか取得できない制約がある
- CHOOSE関数で仮想テーブルを作ることで、左の列を検索対象にできる
- 基本の型は
CHOOSE({1,2}, 検索したい列, 返したい列) - Excel 2016以前では
Ctrl + Shift + Enterで配列数式として入力する - 柔軟性・保守性を重視するなら INDEX・MATCH や XLOOKUP も検討する
VLOOKUPしか使えない環境や、今すぐ数式を直したい場面で、このCHOOSEテクニックはすぐに役立ちます。まずは上のサンプル数式をそのままコピーして、手元のデータで動作を確かめてみてください。「仮想テーブルが作られている」イメージがつかめれば、応用の幅もぐっと広がります。
この記事は「Lookupシリーズ」の一部です。INDEX・MATCH徹底解説やXLOOKUP入門など関連記事もあわせてご覧ください。