「表から値を引っ張ってくる」関数の定番が VLOOKUP です。長年 Excel の主役でしたが、列番号の指定が壊れやすい・左方向に探せないといった弱点があり、それを解消するために XLOOKUP が登場しました。横方向版の HLOOKUP もあります。
この 3 つは「同じ検索関数」のようでいて、探す方向・列の指定方法・見つからないときの挙動が違います。この記事ではその違いを整理し、さらに ReoGrid(V4.5 でこれらの関数に対応)を使って、自社の WinForms / WPF アプリの中で同じ数式をそのまま動かす方法まで説明します。
関連:位置(何番目か)だけを返す
MATCH/XMATCHの違いは 別記事で詳しく扱います。INDEX + MATCHの組み合わせもそちらで。
まず結論 — 3 つの違い early summary
| VLOOKUP | HLOOKUP | XLOOKUP | |
|---|---|---|---|
| 探す方向 | 縦(列をキーに下方向へ) | 横(行をキーに右方向へ) | 縦・横どちらも |
| 戻り値の指定 | 列番号(数字、1 起算) | 行番号(数字、1 起算) | 戻り範囲そのものを渡す |
| 左/上方向の検索 | できない(キーは必ず左端) | できない(キーは必ず最上行) | できる |
| 既定の一致 | 近似一致(要 4 番目の引数で完全一致) | 同左 | 完全一致(既定) |
| 見つからないとき | #N/A | #N/A | #N/A、または任意の代替値を指定可 |
| 列追加への強さ | 弱い(列番号がずれる) | 弱い(行番号がずれる) | 強い(範囲で指定するため) |
ひとことで言うと、XLOOKUP は VLOOKUP / HLOOKUP の「使いにくさ」をまとめて直した上位互換です。新しく書くなら XLOOKUP が基本、既存資産との互換性のために VLOOKUP / HLOOKUP を知っておく、という整理になります。
VLOOKUP — 縦に探して、列番号で返す
VLOOKUP(検索値, 範囲, 列番号, [検索の型]) が基本形です。範囲の左端の列をキーにして縦に探し、見つかった行の「左から数えて N 列目」を返します。
=VLOOKUP("A102", A2:C100, 3, FALSE)
A2:C100の A 列(左端) から"A102"を探す- 見つかった行の 3 列目(C 列) の値を返す
- 4 番目の
FALSEは 完全一致。省略またはTRUEだと近似一致(範囲が昇順にソートされている前提で「以下の最大値」を拾う)
VLOOKUP の弱点は 2 つです。
- 列番号がハードコード:表の途中に列を 1 本挿入すると、
3が指す列がずれて結果が壊れる - 左方向に探せない:キーより左の列は返せない(キーは必ず範囲の左端でなければならない)
価格表から単価を引く、商品コードから商品名を引く——「キーが左端にある素直な表」なら VLOOKUP で十分です。
HLOOKUP — VLOOKUP の横版
HLOOKUP(検索値, 範囲, 行番号, [検索の型])。考え方は VLOOKUP と同じで、向きが 90 度違うだけです。範囲の最上行をキーにして横に探し、見つかった列の「上から N 行目」を返します。
=HLOOKUP("2026Q2", A1:F5, 4, FALSE)
四半期や年度が横に並んだ集計表(クロス集計の見出しが行方向)で使います。実務では縦持ちの表のほうが多いので登場頻度は低めですが、「横に並んだ見出しから引く」場面では HLOOKUP が素直です。
XLOOKUP — 方向も列番号も気にしない
XLOOKUP(検索値, 検索範囲, 戻り範囲, [見つからない値], [一致モード])。VLOOKUP との最大の違いは、「列番号」ではなく「戻り範囲そのもの」を渡すことです。
=XLOOKUP("A102", A2:A100, C2:C100, "該当なし", 0)
A2:A100(検索範囲)から"A102"を探す- 同じ位置の
C2:C100(戻り範囲)の値を返す - 見つからなければ
#N/Aではなく"該当なし"を返す - 最後の
0は完全一致(XLOOKUP は既定が完全一致なので省略可)
これで VLOOKUP の弱点が両方とも消えます。
- 列を挿入してもずれない:列番号ではなく範囲で指定しているため
- 左方向にも探せる:検索範囲と戻り範囲を別々に渡すので、戻り範囲がキーより左でも問題ない
一致モード(最後の引数)はこう使い分けます。
| 一致モード | 意味 |
|---|---|
0 | 完全一致(既定) |
-1 | 完全一致、なければ次に小さい値 |
1 | 完全一致、なければ次に大きい値 |
2 | ワイルドカード(* と ?) |
ReoGrid 実装メモ:ReoGrid の XLOOKUP は
検索値・検索範囲・戻り範囲・[見つからない値]・[一致モード]に対応します。Excel にある検索モード(末尾からの逆検索や二分探索)は現時点では未対応で、検索は順方向の線形走査です。逆方向に位置を取りたい場合は XMATCH のsearch_modeを併用してください。
どう使い分けるか
- 新規に書くなら XLOOKUP。列の増減に強く、左方向も探せて、見つからないときの代替値も書ける。いちばん壊れにくい。
- VLOOKUP / HLOOKUP は既存資産との互換性のため。既存の Excel ブックを取り込む、過去のテンプレートを踏襲する、といった場面で必要になる。
- 「位置(何番目か)」だけ欲しいなら、検索と取得を分ける
INDEX + MATCH/XMATCHという選択肢もある(→ MATCH / XMATCH の記事)。
C# アプリの中で動かす — ReoGrid V4.5
ここからが本題です。これらは Excel の関数ですが、Office や Excel をインストールしなくても、ReoGrid V4.5 ならアプリの中で同じ数式をそのまま計算できます。セルに数式文字列を入れるだけです。
using unvell.ReoGrid;
var sheet = grid.CurrentWorksheet;
// 検索元の表(A:商品コード, B:商品名, C:単価)を A2:C4 にまとめて流し込む
sheet.SetRangeData("A2:C4", new object[,]
{
{ "A101", "りんご", 120 },
{ "A102", "みかん", 80 },
{ "A103", "ぶどう", 300 },
});
// XLOOKUP:コードから単価を引く(見つからなければ "該当なし")
sheet["E2"] = "=XLOOKUP(\"A102\", A2:A4, C2:C4, \"該当なし\", 0)";
// VLOOKUP:同じことを列番号で(C 列 = 範囲の 3 列目)
sheet["E3"] = "=VLOOKUP(\"A102\", A2:C4, 3, FALSE)";
// 計算結果を取り出す
var price = sheet.GetCellData<double>("E2"); // 80
ユーザーが画面上のセルに =XLOOKUP(...) と打ち込んでも同じように再計算されます。**「Excel と同じ感覚で数式が書ける表計算 UI」**を、自社の .NET デスクトップアプリにそのまま載せられる、ということです。
数式に依存セルを混ぜれば(=XLOOKUP(G1, A2:A100, C2:C100) の G1 を入力欄にする等)、入力に応じて即座に再計算する検索フォームも数行で作れます。
おまけ:MATCH と XMATCH — 「位置」を返す仲間
ここまでの 3 つは「探して値を返す」関数でした。これとよく一緒に使われるのが、「探して**位置(何番目か)**を返す」MATCH / XMATCH です。
=MATCH("A102", A2:A100, 0) → 2 (A 列の中で 2 番目にある)
=XMATCH("A102", A2:A100) → 2 (既定が完全一致で素直)
- MATCH は位置を返す定番。ただし 3 番目の引数を省くと近似一致になるので、完全一致したいなら
0を明示する - XMATCH はその上位互換で、既定が完全一致・ワイルドカード・末尾からの逆検索に対応
- これらを
INDEXと組み合わせる(INDEX + MATCH)と、VLOOKUP より柔軟に値を引ける(左方向に引ける・列挿入に強い)
MATCH と XMATCH の違い、INDEX + MATCH の組み立て方は、続編の記事で詳しく解説しています。
👉 詳しくはこちら:MATCH と XMATCH の違いを整理する
まとめ
- VLOOKUP は縦に探して列番号で返す。素直だが列挿入に弱く、左方向に探せない
- HLOOKUP はその横版。横並びの見出しから引くとき用
- XLOOKUP は戻り範囲ごと渡すので列挿入に強く、左方向も探せ、見つからないときの代替値も書ける——新規はこれが基本
- ReoGrid V4.5 はこの 3 つに対応。Office 不要で、WinForms / WPF アプリの中で同じ数式をそのまま計算できる
数式が「文字列を入れるだけで動く」と、表計算らしい操作感をアプリに持ち込めます。次は、検索の心臓部である位置を返す関数 MATCH と XMATCH の違いを見ていきましょう。
ReoGrid 4.5 の新機能を見る / 30 日トライアルを試す