「商品リストの中で特定の商品が何番目にあるか知りたい」
「VLOOKUPでは左側の列で検索できないのが不便」
「もっと柔軟で自由度の高い検索方法はないの?」
このような課題を解決するのが、ExcelのMATCH関数です。
MATCH関数は指定した値がリストの中で何番目の位置にあるかを返す関数で、INDEX関数と組み合わせることで、VLOOKUPよりも柔軟で強力な検索システムを構築できます。
この記事では、MATCH関数の基本的な使い方から、INDEX関数との組み合わせ、実用的な活用例まで、初心者の方にもわかりやすく詳しく解説します。
MATCH関数の基本概念と特徴

MATCH関数とは
MATCH関数は、指定した検索値が検索範囲の中で何番目の位置にあるかを返すExcelの検索関数です。
値そのものではなく、相対的な位置(番号)を返すのが特徴です。
MATCH関数の役割
- 位置の特定:データがリストの何番目にあるかを調べる
- INDEX関数との連携:特定した位置を使って値を取得
- 動的な参照:位置が変わっても自動で対応
- 柔軟な検索:縦・横どちらの方向でも検索可能
MATCH関数が返すもの
# 例:果物リスト
A1: りんご
A2: バナナ
A3: オレンジ
A4: ぶどう
=MATCH("オレンジ", A1:A4, 0)
# 結果: 3(オレンジはリストの3番目)
MATCH関数は「オレンジ」という値ではなく、その位置である「3」を返します。
MATCH関数の基本構文と概要
基本構文
=MATCH(検索値, 検索範囲, [照合の型])
パラメータの詳細
パラメータ | 説明 | 例 |
---|---|---|
検索値 | 探したい値・条件 | 「商品A」、100、TODAY() |
検索範囲 | 検索対象となる1列または1行 | A1:A100、B2:F2 |
照合の型 | 一致方法の指定 | 0:完全一致、1:以下最大、-1:以上最小 |
照合の型の詳細
照合の型 | 意味 | 前提条件 | 用途 |
---|---|---|---|
0 | 完全一致 | なし | 一般的な検索(推奨) |
1 | 検索値以下の最大値 | 昇順ソート必須 | 範囲検索、グレード判定 |
-1 | 検索値以上の最小値 | 降順ソート必須 | 逆順での範囲検索 |
基本的な使用例
完全一致での位置検索
# 社員リストでの位置検索
A
1 田中
2 佐藤
3 鈴木
4 高橋
5 山田
# 鈴木さんが何番目にいるか
=MATCH("鈴木", A1:A5, 0)
# 結果: 3
# 高橋さんが何番目にいるか
=MATCH("高橋", A1:A5, 0)
# 結果: 4
横方向での位置検索
# 月別データでの位置検索
A B C D E
1 1月 2月 3月 4月 5月
# 3月が何列目にあるか
=MATCH("3月", A1:E1, 0)
# 結果: 3
# 5月が何列目にあるか
=MATCH("5月", A1:E1, 0)
# 結果: 5
数値での位置検索
# 点数リストでの位置検索
B
1 85
2 92
3 78
4 96
5 88
# 点数96がリストの何番目にあるか
=MATCH(96, B1:B5, 0)
# 結果: 4
# 点数78がリストの何番目にあるか
=MATCH(78, B1:B5, 0)
# 結果: 3
INDEX関数とMATCH関数の組み合わせ

INDEX+MATCHの基本構文
=INDEX(取得範囲, MATCH(検索値, 検索範囲, 0))
VLOOKUPとの比較
VLOOKUPの制限
# VLOOKUPは左側の列で検索し、右側の列から値を取得
A B C
1 ID 名前 点数
2 001 田中 85
3 002 佐藤 92
4 003 鈴木 78
# IDで検索して名前を取得(可能)
=VLOOKUP("002", A2:C4, 2, FALSE) # 結果: 佐藤
# 名前で検索してIDを取得(不可能 - 左側に検索できない)
# =VLOOKUP("佐藤", B2:A4, 1, FALSE) # エラー
INDEX+MATCHの柔軟性
# どちらの方向でも検索可能
# IDで検索して名前を取得
=INDEX(B2:B4, MATCH("002", A2:A4, 0)) # 結果: 佐藤
# 名前で検索してIDを取得(左側でも可能)
=INDEX(A2:A4, MATCH("佐藤", B2:B4, 0)) # 結果: 002
# 名前で検索して点数を取得
=INDEX(C2:C4, MATCH("佐藤", B2:B4, 0)) # 結果: 92
実用的な組み合わせ例
商品管理での活用
# 商品マスター
A B C D
1 商品コード 商品名 価格 在庫
2 P001 りんご 150 50
3 P002 バナナ 120 30
4 P003 オレンジ 200 25
# 商品名から価格を取得
=INDEX(C2:C4, MATCH("バナナ", B2:B4, 0))
# 結果: 120
# 商品名から在庫を取得
=INDEX(D2:D4, MATCH("オレンジ", B2:B4, 0))
# 結果: 25
# 商品コードから商品名を取得
=INDEX(B2:B4, MATCH("P002", A2:A4, 0))
# 結果: バナナ
売上データでの活用
# 月別売上データ
A B C D E F
1 項目 1月 2月 3月 4月 5月
2 売上 1200 1350 1100 1450 1600
3 利益 240 270 220 290 320
# 指定月の売上を取得
G1: 検索月
G2: 3月
H1: 売上
H2: =INDEX(B2:F2, MATCH(G2, B1:F1, 0)) # 結果: 1100
# 指定月の利益を取得
I1: 利益
I2: =INDEX(B3:F3, MATCH(G2, B1:F1, 0)) # 結果: 220
照合の型を活用した高度な検索
昇順データでの範囲検索(照合の型:1)
# 成績評価表(昇順ソート済み)
A B
1 60 D
2 70 C
3 80 B
4 90 A
# 85点の評価を求める(80以上90未満なのでB)
=INDEX(B1:B4, MATCH(85, A1:A4, 1))
# 結果: B(85以下の最大値80に対応する評価)
# 75点の評価を求める
=INDEX(B1:B4, MATCH(75, A1:A4, 1))
# 結果: C(75以下の最大値70に対応する評価)
降順データでの範囲検索(照合の型:-1)
# 割引率表(降順ソート済み)
A B
1 100000 10%
2 50000 5%
3 10000 2%
4 0 0%
# 購入金額75000円の割引率を求める
=INDEX(B1:B4, MATCH(75000, A1:A4, -1))
# 結果: 5%(75000以上の最小値100000に対応する割引率)
# 購入金額30000円の割引率を求める
=INDEX(B1:B4, MATCH(30000, A1:A4, -1))
# 結果: 2%(30000以上の最小値50000に対応する割引率)
よくあるエラーとその対処法

#N/Aエラー:値が見つからない
# エラーの例
=MATCH("メロン", A1:A5, 0) # メロンがリストにない
# 結果: #N/A
# 対処法1: IFERROR関数との組み合わせ
=IFERROR(MATCH("メロン", A1:A5, 0), "見つかりません")
# 結果: 見つかりません
# 対処法2: IF関数とISNA関数の組み合わせ
=IF(ISNA(MATCH("メロン", A1:A5, 0)), 0, MATCH("メロン", A1:A5, 0))
# 結果: 0
#REF!エラー:INDEX範囲とMATCH結果の不一致
# エラーの例
=INDEX(B1:B3, MATCH("商品D", A1:A5, 0))
# MATCHが4を返すが、INDEXの範囲がB1:B3(3行まで)
# 対処法: 範囲を統一
=INDEX(B1:B5, MATCH("商品D", A1:A5, 0)) # 範囲を合わせる
データ型の不一致による検索失敗
# 数値として保存されているデータを文字列で検索
=MATCH("100", A1:A5, 0) # A列の100が数値の場合は見つからない
# 対処法1: データ型を合わせる
=MATCH(100, A1:A5, 0) # 数値として検索
# 対処法2: VALUE関数で変換
=MATCH(VALUE("100"), A1:A5, 0)
実用的なビジネス活用例
動的な検索システム
# 検索インターフェース
G H
1 検索項目 検索値
2 商品名 バナナ
3
4 結果項目 結果値
5 価格 =INDEX(価格範囲, MATCH(H2, 商品名範囲, 0))
6 在庫 =INDEX(在庫範囲, MATCH(H2, 商品名範囲, 0))
7 評価 =INDEX(評価範囲, MATCH(H2, 商品名範囲, 0))
# H2の値を変更すると、すべての結果が自動更新
複数条件での検索
# 配列数式を使った複数条件検索
=INDEX(C1:C10, MATCH(1, (A1:A10="営業")*(B1:B10="田中"), 0))
# A列が「営業」かつB列が「田中」の行のC列の値を取得
# SUMPRODUCT関数を使った方法
=INDEX(C1:C10, MATCH(TRUE, (A1:A10="営業")*(B1:B10="田中"), 0))
最終行・最終列の特定
# 最終行の取得
=MATCH(TRUE, A:A<>"", -1) # A列の最終行番号
# 最終列の取得(1行目で)
=MATCH(TRUE, 1:1<>"", -1) # 1行目の最終列番号
# 最終データの取得
=INDEX(A:A, MATCH(TRUE, A:A<>"", -1)) # A列の最終データ
双方向検索(行と列の両方で検索)
# 交差テーブルでの検索
A B C D
1 項目 商品A 商品B 商品C
2 価格 150 200 180
3 在庫 50 30 25
4 評価 4.5 4.2 4.8
# 商品Bの在庫を取得
=INDEX(B2:D4, MATCH("在庫", A2:A4, 0), MATCH("商品B", B1:D1, 0))
# 結果: 30
# 商品Cの評価を取得
=INDEX(B2:D4, MATCH("評価", A2:A4, 0), MATCH("商品C", B1:D1, 0))
# 結果: 4.8
高度な活用テクニック
ワイルドカードを使った検索
# 部分一致での検索
=MATCH("*田中*", A1:A10, 0) # 「田中」を含む最初のセル位置
# 前方一致での検索
=MATCH("営業*", A1:A10, 0) # 「営業」で始まる最初のセル位置
# 後方一致での検索
=MATCH("*部", A1:A10, 0) # 「部」で終わる最初のセル位置
INDIRECT関数との組み合わせ
# 動的な範囲参照
=MATCH("検索値", INDIRECT("A1:A"&ROW()-1), 0)
# シート名を動的に変更
=MATCH("検索値", INDIRECT(シート名セル&"!A1:A100"), 0)
配列数式での高度な検索
# 複数の検索値に対する位置を一度に取得
{=MATCH(検索値配列, 検索範囲, 0)}
# 条件を満たす最初の位置
=MATCH(TRUE, (A1:A10>100)*(B1:B10="営業"), 0)
パフォーマンスの最適化

効率的なMATCH関数の使い方
# 非効率な例(列全体を参照)
=MATCH("検索値", A:A, 0)
# 効率的な例(必要な範囲のみ参照)
=MATCH("検索値", A1:A1000, 0)
# 動的範囲での最適化
=MATCH("検索値", A1:INDEX(A:A, COUNTA(A:A)), 0)
大量データでの考慮事項
- 検索範囲をできるだけ限定する
- ソート済みデータでは照合の型1または-1を活用
- 複雑な配列数式は必要最小限に抑える
よくある質問と解決方法
Q: MATCHで重複値がある場合はどうなる?
A: 最初に見つかった位置を返します。
# リスト: りんご、バナナ、りんご、オレンジ
=MATCH("りんご", A1:A4, 0) # 結果: 1(最初のりんごの位置)
# すべての位置を取得したい場合
=SMALL(IF(A1:A4="りんご", ROW(A1:A4), ""), 1) # 1番目の位置
=SMALL(IF(A1:A4="りんご", ROW(A1:A4), ""), 2) # 2番目の位置
Q: MATCHで大文字小文字を区別したい場合は?
A: EXACT関数と組み合わせます。
# 大文字小文字を区別しない(標準)
=MATCH("apple", A1:A10, 0) # "Apple"も一致
# 大文字小文字を区別する
=MATCH(TRUE, EXACT("apple", A1:A10), 0) # "apple"のみ一致
Q: 数値の近似一致で最も近い値を見つけたい場合は?
A: 配列数式と組み合わせます。
# 目標値に最も近い値の位置
=MATCH(MIN(ABS(A1:A10-目標値)), ABS(A1:A10-目標値), 0)
まとめ
MATCH関数は、Excelでの柔軟な検索処理を実現する基盤となる重要な関数です。INDEX関数と組み合わせることで、VLOOKUPの制限を克服し、より自由度の高い検索システムを構築できます。
重要なポイント
- 基本機能:指定した値の位置(何番目か)を返す
- 基本構文:
=MATCH(検索値, 検索範囲, 0)
- 照合の型:完全一致には「0」を使用
- INDEX連携:
=INDEX(取得範囲, MATCH(検索値, 検索範囲, 0))
VLOOKUPとの比較
特徴 | VLOOKUP | INDEX+MATCH |
---|---|---|
検索方向 | 左から右のみ | 任意の方向 |
列の挿入・削除 | 影響あり | 影響なし |
複数条件 | 不可 | 可能 |
パフォーマンス | 標準 | 高速 |
活用のベストプラクティス
場面 | 推奨方法 | メリット |
---|---|---|
基本検索 | INDEX+MATCH | 柔軟性が高い |
範囲検索 | MATCH(…, 1) | 効率的な判定 |
エラー対策 | IFERROR包含 | 安全性の向上 |
複数条件 | 配列数式 | 高度な検索 |
コメント