VLOOKUPXLOOKUP が「探してを返す」関数なのに対し、MATCHXMATCH は「探して**位置(何番目か)**を返す」関数です。値そのものではなく「何行目にあるか」が分かるので、INDEX と組み合わせると検索を自在に組み立てられます。

この 2 つも一見そっくりですが、既定の一致モード・逆方向の検索・ワイルドカードの扱いが違います。この記事ではその違いを整理し、ReoGrid(V4.5 で対応)を使って C# アプリの中で同じ数式をそのまま動かす方法まで説明します。

この記事は VLOOKUP / HLOOKUP / XLOOKUP の違いの続編です。「値を引く」関数を先に読むと、なぜ「位置を返す」関数が必要なのかが分かります。


まず結論 — MATCH と XMATCH の違い

MATCHXMATCH
返すもの一致した要素の位置(1 起算)同じ(1 起算)
既定の一致近似一致(1=以下の最大値)完全一致(0
一致モード1 / 0 / -10 / -1 / 1 / 2(ワイルドカード)
逆方向の検索できないできるsearch_mode = -1
ソート前提近似一致はソート必須完全一致はソート不要

ひとことで言うと、XMATCH は MATCH の上位互換です。既定が完全一致なので直感的で、ワイルドカードや末尾からの逆検索もできます。XLOOKUPVLOOKUP を置き換えたのと、まったく同じ関係です。


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 日トライアルを試す


次に読むもの