VLOOKUP や XLOOKUP が「探して値を返す」関数なのに対し、MATCH と XMATCH は「探して**位置(何番目か)**を返す」関数です。値そのものではなく「何行目にあるか」が分かるので、INDEX と組み合わせると検索を自在に組み立てられます。
この 2 つも一見そっくりですが、既定の一致モード・逆方向の検索・ワイルドカードの扱いが違います。この記事ではその違いを整理し、ReoGrid(V4.5 で対応)を使って C# アプリの中で同じ数式をそのまま動かす方法まで説明します。
この記事は VLOOKUP / HLOOKUP / XLOOKUP の違いの続編です。「値を引く」関数を先に読むと、なぜ「位置を返す」関数が必要なのかが分かります。
まず結論 — MATCH と XMATCH の違い
| MATCH | XMATCH | |
|---|---|---|
| 返すもの | 一致した要素の位置(1 起算) | 同じ(1 起算) |
| 既定の一致 | 近似一致(1=以下の最大値) | 完全一致(0) |
| 一致モード | 1 / 0 / -1 | 0 / -1 / 1 / 2(ワイルドカード) |
| 逆方向の検索 | できない | できる(search_mode = -1) |
| ソート前提 | 近似一致はソート必須 | 完全一致はソート不要 |
ひとことで言うと、XMATCH は MATCH の上位互換です。既定が完全一致なので直感的で、ワイルドカードや末尾からの逆検索もできます。XLOOKUP が VLOOKUP を置き換えたのと、まったく同じ関係です。
MATCH — 値の「位置」を返す
MATCH(検索値, 検索範囲, [一致の型])。一次元の範囲(1 行または 1 列)から検索値を探し、先頭から数えて何番目にあるかを返します。
=MATCH("みかん", A2:A100, 0) → 2 (A3 にあれば 2 番目)
ポイントは 3 番目の引数(一致の型)で、省略すると 1(近似一致)になることです。ここが落とし穴です。
| 一致の型 | 意味 | 前提 |
|---|---|---|
1(既定) | 検索値以下の最大値 | 範囲が昇順にソート済み |
0 | 完全一致 | ソート不要・順不同でよい |
-1 | 検索値以上の最小値 | 範囲が降順にソート済み |
業務でよく使うのは「ぴったり一致を探す」0 です。省略すると近似一致になって誤った位置を返すことがあるので、完全一致したいときは必ず 0 を明示します。
XMATCH — 既定が完全一致で、逆方向も探せる
XMATCH(検索値, 検索範囲, [一致モード], [検索モード])。返すものは MATCH と同じ「位置」ですが、既定が完全一致なので素直です。
=XMATCH("みかん", A2:A100) → 完全一致で位置を返す(既定が 0)
=XMATCH("A1*", A2:A100, 2) → ワイルドカードで "A1" 始まりを探す
=XMATCH("みかん", A2:A100, 0, -1) → 末尾から逆方向に探す
一致モード(3 番目)と検索モード(4 番目)はこう使い分けます。
| 一致モード | 意味 |
|---|---|
0 | 完全一致(既定) |
-1 | なければ次に小さい値 |
1 | なければ次に大きい値 |
2 | ワイルドカード(* と ?) |
| 検索モード | 意味 |
|---|---|
1 | 先頭から(既定) |
-1 | 末尾から(重複時に「最後の一致」を取りたいとき) |
「同じ値が複数あって、最後に出てくるものの位置が欲しい」——これは MATCH では書けず、XMATCH の search_mode = -1 がぴったりです。
ReoGrid 実装メモ:ReoGrid の XMATCH は一致モード
0 / -1 / 1 / 2、検索モード1 / -1(順方向・逆方向の線形走査)に対応します。Excel にある二分探索(search_mode = 2 / -2)は現時点では未対応です。完全一致・ワイルドカード・逆方向はそのまま使えます。
なぜ「位置」が要るのか — INDEX との組み合わせ
MATCH / XMATCH 単体より、INDEX と組み合わせたときに真価が出ます。INDEX(範囲, 行番号) は「範囲の N 番目」を返す関数。「位置を MATCH で求めて、その位置の値を INDEX で取る」——これが定番の INDEX + MATCH です。
=INDEX(C2:C100, MATCH("A102", A2:A100, 0))
MATCH("A102", A2:A100, 0)で A 列の中の位置(たとえば 2)を求めるINDEX(C2:C100, 2)で C 列の同じ位置の値を返す
これは VLOOKUP と同じ「コードから単価を引く」ですが、VLOOKUP より柔軟です。
- 左方向にも引ける:検索列(A)と取得列(C)を独立に指定できるので、取得列がキーより左でもよい
- 列挿入に強い:列番号ではなく範囲で指定するため、途中に列を足してもずれない
XLOOKUP が登場した今は XLOOKUP 一本でも足りますが、INDEX + MATCH は古い Excel でも動くため、互換性が要る環境では今も現役です。
C# アプリの中で動かす — ReoGrid V4.5
これらも Excel の関数ですが、Office をインストールせずに、ReoGrid V4.5 ならアプリの中でそのまま計算できます。セルに数式文字列を入れるだけです。
using unvell.ReoGrid;
var sheet = grid.CurrentWorksheet;
// A:商品コード, C:単価
sheet.SetRangeData("A2:C4", new object[,]
{
{ "A101", "りんご", 120 },
{ "A102", "みかん", 80 },
{ "A103", "ぶどう", 300 },
});
// XMATCH:コードの「位置」を返す(完全一致が既定)
sheet["E2"] = "=XMATCH(\"A102\", A2:A4)"; // → 2
// INDEX + MATCH:位置を求めて値を引く(VLOOKUP より柔軟)
sheet["E3"] = "=INDEX(C2:C4, MATCH(\"A102\", A2:A4, 0))"; // → 80
var pos = sheet.GetCellData<double>("E2"); // 2
var price = sheet.GetCellData<double>("E3"); // 80
ユーザーが画面のセルに =INDEX(...) や =XMATCH(...) を直接打ち込んでも、同じように再計算されます。**「Excel と同じ数式が書ける表計算 UI」**を、自社の .NET アプリにそのまま載せられます。
まとめ
MATCH/XMATCHはどちらも**位置(何番目か)**を返す。値そのものは返さない- MATCH は既定が近似一致(
1)。完全一致したいなら 3 番目に0を必ず付ける - XMATCH は既定が完全一致で素直。ワイルドカード(
2)も末尾からの逆検索(search_mode = -1)もできる INDEX + MATCHは VLOOKUP より柔軟(左方向に引ける・列挿入に強い)。互換性が要る環境で今も現役- ReoGrid V4.5 はこれらに対応。Office 不要で、WinForms / WPF アプリ内で同じ数式をそのまま計算できる
「値を返す関数」と「位置を返す関数」を両方押さえれば、表計算の検索はほぼ自在に組み立てられます。値を引く側の VLOOKUP / HLOOKUP / XLOOKUP と合わせてどうぞ。
ReoGrid 4.5 の新機能を見る / 30 日トライアルを試す