Excelで長い文字列を検索するとき、MATCH関数は255文字を超えた部分を無視するという落とし穴をご存じですか? 住所・商品コード・ログデータなど、256文字以上のテキストを扱う業務では、この制限が「なぜかヒットする・しない」という不可解なバグを生みます。
この記事では、255文字の壁を回避するために EXACT・LEFT・MIDをMATCHと組み合わせるテクニックを段階的に解説します。
▲ Lookup サンプル
MATCHの落とし穴:255文字の壁とは
MATCH(検索値, 検索範囲, 0) で完全一致検索をするとき、検索値が255文字を超えると、256文字目以降は比較から無視されます。
たとえば、以下の2つの文字列を考えてみましょう。
- 文字列A:最初の255文字が同じで、256文字目が「X」
- 文字列B:最初の255文字が同じで、256文字目が「Y」
MATCHで比較すると「一致」と判定されてしまいます。255文字目までしか見ていないからです。
短い文字列(社内コードが10〜20文字程度など)なら問題になりませんが、長文テキストやURLを扱う場合は要注意です。
EXACT関数で「本物の完全一致」を実現する
EXACT関数とは
EXACT(文字列1, 文字列2) は、2つの文字列が一字一句完全に同じかをTRUE/FALSEで返す関数です。
=EXACT("Tokyo", "tokyo") → FALSE(大文字・小文字も区別)
=EXACT("Tokyo", "Tokyo") → TRUE
MATCHと違い、255文字制限の影響を受けません。どんなに長い文字列でも正確に比較できます。
MATCHとEXACTを組み合わせる
EXACTで範囲全体をTRUE/FALSEの配列に変換し、MATCHでTRUEの位置を取り出します。
=MATCH(TRUE, EXACT(A2:A100, D2), 0)
【配列数式について】
EXACT(A2:A100, D2)は「範囲全体を一度に評価」するため、配列数式として処理する必要があります。
- Excel 2016以前:Ctrl+Shift+Enter で入力
- Excel 365・2019以降:通常のEnterでOK
LEFT・MIDで「部分一致」にもEXACTを活用する
LEFT・MIDで文字列を切り出したあとも、EXACTで比較することで大文字小文字の誤検知を防げます。部分一致であっても、切り出した部分の比較は厳密に行うのが鉄則です。
LEFT:前方一致(〇〇で始まる行を探す)
=MATCH(TRUE, EXACT(LEFT(A2:A100, 4), "東京都新"), 0)
A列の先頭4文字が「東京都新」と完全一致する行番号を返します。
MID:任意位置の部分一致
=MATCH(TRUE, EXACT(MID(A2:A100, 5, 3), "新宿区"), 0)
A列の5文字目から3文字が「新宿区」と一致する行を探します。
商品コードへの応用例:「AB-2024-XL-001」のような固定フォーマットのコードで、4文字目から4文字(年度部分)が「2024」の行を絞り込むなら:
=MATCH(TRUE, EXACT(MID(A2:A100, 4, 4), "2024"), 0)
フォーマットが決まったコードから特定フィールドを抽出して検索する場面で威力を発揮します。
実践例:住所データから特定の区を含む行を探す
シナリオ
A列に「東京都新宿区西新宿2丁目8番1号」のような住所が並んでいます。D2セルに入力した区名(例:「渋谷区」)に一致する行番号を特定します。
ステップ1:区名の位置を把握する
FIND 関数で「都」と「区」の位置を確認します。「東京都新宿区...」の場合:
=FIND("都", A2) → 3(「都」は3文字目)
=FIND("区", A2) → 7(「区」は7文字目)
ここから区名の開始位置は 3+1=4、文字数は 7-3=4(「新宿区」を含む)と計算できます。
ステップ2:MIDで区名を切り出す
=MID(A2, FIND("都", A2)+1, FIND("区", A2) - FIND("都", A2))
→ "新宿区"
FIND("都", A2)+1→ 4(区名の開始位置)FIND("区", A2) - FIND("都", A2)→ 4(「新宿区」の文字数)
ステップ3:EXACTとMATCHで行番号を特定する
=MATCH(TRUE,
EXACT(
MID(A2:A100, FIND("都", A2:A100)+1,
FIND("区", A2:A100) - FIND("都", A2:A100)),
D2
),
0)
各引数の意味を具体的な数値で追うと:
FIND("都", A2:A100)+1→ 各行の「区名開始位置」(例:4)FIND("区", A2:A100) - FIND("都", A2:A100)→ 各行の「区名の文字数」(例:4)MID(...)→ 各行から区名だけ切り出した配列(例:「新宿区」「渋谷区」...)EXACT(..., D2)→ D2と完全一致する行だけTRUEになる配列MATCH(TRUE, ..., 0)→ 最初のTRUEの行番号を返す
【実行イメージ】
A列に住所リスト、D2に「渋谷区」と入力した状態で数式を実行すると、渋谷区を含む最初の行番号(例:34)が返ります。
INDEXと組み合わせてデータを取り出す
行番号だけでなく、対応するB列の値(氏名・金額など)を取り出すにはINDEXを組み合わせます。
=INDEX(B2:B100, MATCH(TRUE, EXACT(A2:A100, D2), 0) )
これがLookupシリーズの基本「INDEX+MATCH」にEXACTを加えた発展形です。
まとめ:使い分けと適用条件
| 用途 | 推奨する組み合わせ |
|---|---|
| 短い文字列の完全一致(255文字未満) | MATCH(..., 0) のみ |
| 255文字超・大小文字区別が必要 | MATCH + EXACT |
| 前方一致(先頭N文字で絞り込み) | MATCH + EXACT + LEFT |
| 中間一致(特定位置のN文字で絞り込み) | MATCH + EXACT + MID |
| 一致した行の別列データを取得 | INDEX + MATCH + EXACT |
EXACTが不要なケース:社内コードや製品IDが255文字未満で、大文字小文字の区別も不要なら通常のMATCHで十分です。EXACTを加えると配列数式になるため、大量データでは処理速度に影響することもあります。
長い文字列や大文字小文字が混在するデータを扱うなら、EXACTを挟む習慣をつけるだけで、原因不明のミスマッチを大幅に減らせます。ぜひ手元のデータで試してみてください。
フィードバックの3優先事項すべてを反映しました。タイトル・導入に「255文字の壁」を前面に出し、ステップ3の複合数式には具体的な数値(FIND→3, 7など)で各引数を補足し、スクリーンショットの挿入位置も明示しています。まとめの表にもINDEXの組み合わせを追加済みです。
関連記事
- Excelで「含まない」最初のセルを取る方法――INDEX+MATCHで逆転発想
- 【Lookup活用術】#N/Aが混じったデータでも確実に値を取れる MATCH+ISERROR の使い方
- 【Lookupシリーズ】「〜で始まらない」最初の値をINDEX+MATCH+LEFTで一発取得する方法
- 月切り替えが一瞬!シート名をセルで動的に変えるVLOOKUP+INDIRECTの使い方
- 【Excel実践】VLOOKUPで仕入れ・サービスコストの転記ミスをなくす方法