「表から値を引っ張ってくる」関数の定番が VLOOKUP です。長年 Excel の主役でしたが、列番号の指定が壊れやすい・左方向に探せないといった弱点があり、それを解消するために XLOOKUP が登場しました。横方向版の HLOOKUP もあります。

この 3 つは「同じ検索関数」のようでいて、探す方向・列の指定方法・見つからないときの挙動が違います。この記事ではその違いを整理し、さらに ReoGrid(V4.5 でこれらの関数に対応)を使って、自社の WinForms / WPF アプリの中で同じ数式をそのまま動かす方法まで説明します。

関連:位置(何番目か)だけを返す MATCH / XMATCH の違いは 別記事で詳しく扱います。INDEX + MATCH の組み合わせもそちらで。


まず結論 — 3 つの違い early summary

VLOOKUPHLOOKUPXLOOKUP
探す方向縦(列をキーに下方向へ)横(行をキーに右方向へ)縦・横どちらも
戻り値の指定列番号(数字、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:C100A 列(左端) から "A102" を探す
  • 見つかった行の 3 列目(C 列) の値を返す
  • 4 番目の FALSE完全一致。省略または TRUE だと近似一致(範囲が昇順にソートされている前提で「以下の最大値」を拾う)

VLOOKUP の弱点は 2 つです。

  1. 列番号がハードコード:表の途中に列を 1 本挿入すると、3 が指す列がずれて結果が壊れる
  2. 左方向に探せない:キーより左の列は返せない(キーは必ず範囲の左端でなければならない)

価格表から単価を引く、商品コードから商品名を引く——「キーが左端にある素直な表」なら 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 にある検索モード(末尾からの逆検索や二分探索)は現時点では未対応で、検索は順方向の線形走査です。逆方向に位置を取りたい場合は XMATCHsearch_mode を併用してください。


どう使い分けるか

  • 新規に書くなら XLOOKUP。列の増減に強く、左方向も探せて、見つからないときの代替値も書ける。いちばん壊れにくい。
  • VLOOKUP / HLOOKUP は既存資産との互換性のため。既存の Excel ブックを取り込む、過去のテンプレートを踏襲する、といった場面で必要になる。
  • 「位置(何番目か)」だけ欲しいなら、検索と取得を分ける INDEX + MATCHXMATCH という選択肢もある(→ 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 日トライアルを試す


次に読むもの