doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

ExcelのMATCHに潜む「255文字の壁」をEXACT・LEFT・MIDで突破する完全照合術【Lookupシリーズ】

スポンサーリンク

Excelで長い文字列を検索するとき、MATCH関数は255文字を超えた部分を無視するという落とし穴をご存じですか? 住所・商品コード・ログデータなど、256文字以上のテキストを扱う業務では、この制限が「なぜかヒットする・しない」という不可解なバグを生みます。

この記事では、255文字の壁を回避するために EXACT・LEFT・MIDをMATCHと組み合わせるテクニックを段階的に解説します。


ExcelのMATCHに潜む「255文字の壁」をEXACT・LEFT・MIDで突破する完全照合術【Lookupシリーズ】のサンプル ▲ 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)+14(区名の開始位置)
  • 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)

各引数の意味を具体的な数値で追うと:

  1. FIND("都", A2:A100)+1 → 各行の「区名開始位置」(例:4)
  2. FIND("区", A2:A100) - FIND("都", A2:A100) → 各行の「区名の文字数」(例:4)
  3. MID(...) → 各行から区名だけ切り出した配列(例:「新宿区」「渋谷区」...)
  4. EXACT(..., D2) → D2と完全一致する行だけTRUEになる配列
  5. 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の組み合わせを追加済みです。


関連記事

あわせてチェック