想定読者:投資銀行・PE・FAS などで、自社管理表と外部データの証券コードや勘定科目コードを突き合わせる若手・アナリストの方
前提知識:MATCH・COUNTIF・INDEX の基本(整形の全般は既存記事に委ねます)

結論:見た​目でなく​文字数と​文字番号で​比べる

外部データを管理表に突き合わせると、同じに見えるのに一致しない行が残ることがあります。TRIM でも直らない行は、次の順に調べます。

  1. LEN で文字数を比べる。差があれば見えない文字が混じっています。
  2. EXACT で英大小・全角半角まで区別して比べる。MATCH が「同じ」とする行にも違いが出ます。
  3. UNICODE で1文字ずつ文字番号(Unicode のコードポイント。文字に1つずつ振られた番号)を取り出し、最初に番号が違う位置を見つける。

原因が分かれば直す式は1行で足り、直した後は一致件数を前後で比べます。数式の動作は日本語版 Windows の Excel(16.0、ビルド 20430)で確かめた結果です。この環境では XLOOKUP と SEQUENCE が使えないため、照合は MATCH と COUNTIF で確かめています。

設例:30件中8件に​見えない差

以下は学習用の架空事例です。自社管理表(左)の証券コード30件を、外部データ(右)の同じ30社のコードと突き合わせます。左を正とし、右の8件に差を仕込みます。コードの割り当ては架空で、同じ番号の実在銘柄があっても本記事とは関係ありません。

コードに英字を使うのは、証券コードの形式が変わったためです。証券コード協議会は、2024年1月1日以降に設定する株式固有名コード(4けた)から、2けた目と4けた目のいずれか、または両方に英大文字を使うと公表しました1。使う文字は、B・E・I・O・Q・V・Z を除く19文字です2。既存のコードは変わらないため3、数字だけのコードと英字入りのコードが混在し、大小や全角半角の揺れが入り込みます(制度の説明は2022年公表の資料に基づきます)。

8件とも画面では左と同じに見えます。No.16 は末尾のノーブレークスペース(改行されない空白。Web からのコピーで混じりやすい)、No.18 は末尾の全角スペース、No.20 は末尾の改行、No.23 は途中のゼロ幅スペース(幅のない空白)、No.24 は全角英数、No.26 は英小文字、No.7 は 0 が英字の O、No.12 は数値として入ったコードです。

Excel は​何を​「同じ」と​みなすのか

各関数が何を同じとみなすかを整理します(「実測」は上記環境での結果)。

  • 英大小:MATCH は英字の大文字と小文字を区別しません4。COUNTIF も同じです5。実測でも ="130A"="130a" は TRUE でした。一方 EXACT は大小を区別し、完全に一致すれば TRUE を返します6。
  • 全角と半角:別の文字です。実測で ="130A"="130A" は FALSE、MATCH は #N/A でした。
  • 数値と文字列:実測では、文字列の 2820 を数値の 2820 の範囲から探すと MATCH は #N/A でした。一方 COUNTIF は1件と数え、EXACT(2820,"2820") も TRUE でした。
  • ワイルドカード:COUNTIF の条件や MATCH(照合の型0)では ? と * が特別な文字で、文字そのものを探すには前に ~ を付けます7。実測では A*B が AxxB にも一致しました。

したがって英小文字の行(No.26)は MATCH で見つかりますが、EXACT は FALSE です。逆に型違いの行(No.12)は、COUNTIF を信じると見逃します。

手順1:LEN の​差で​隠れた​文字を​探す

左を B 列、右を C 列に置き、行ごとに文字数を比べます。

文字数の差
=LEN(C2)-LEN(B2)(0 以外なら、どちらかに余分な文字がある)

設例では No.16・18・20・23 の4行が +1 で、見えない文字が1つ増えています。残りの4行(No.7・12・24・26)は左右とも4文字で、全角半角、英大小、似た別の文字、型違いのいずれかです。LEN は数値も文字として数えるので、型違い(No.12)も 4 です。

見えない文字には TRIM で消えないものがあります。TRIM は文字番号32の空白が対象で、160のノーブレークスペースは除かれません8。CLEAN が除くのは文字番号0〜31の印刷できない文字で、ゼロ幅スペースは対象外です9。全角スペースは実測では先頭と末尾だけ TRIM で消えましたが、説明にない挙動なので SUBSTITUTE で明示的に除きます。

手順2:​最初に​違う​文字を UNICODE で​特定

次に EXACT が FALSE の行で、最初に違う位置とその文字番号を取り出します。SEQUENCE の代わりに配列定数 {1,2,3,4,5,6} を使います。

差の位置(G列)
=IFERROR(MATCH(FALSE,INDEX(EXACT(MID(B2&REPT(" ",6),{1,2,3,4,5,6},1),MID(C2&REPT(" ",6),{1,2,3,4,5,6},1)),0),0),"なし")
文字番号(H列、左→右)
=IFERROR(UNICODE(MID(B2,G2,1)),"なし")&"→"&IFERROR(UNICODE(MID(C2,G2,1)),"なし")

MID で1文字ずつ取り出して EXACT で位置ごとに比べ、最初の FALSE の位置を MATCH で探します。REPT(" ",6) は短い側が尽きた位置も差として拾うため、EXACT は英小文字の違いを見逃さないために使います。設例の結果が図表1です。

図表1:不一致8件の診断表(LEN・EXACT・文字番号)
図表1:不一致8件の診断表(LEN・EXACT・文字番号)
No.左コードLEN 左/右EXACT差の位置文字番号 左→右特定した原因
750714/4FALSE248→79数字 0 と英字 O
1277704/4TRUEなしなし→なし数値(型違い)
16201C4/5FALSE5なし→160ノーブレークスペース
18317D4/5FALSE5なし→12288全角スペース
20408F4/5FALSE5なし→10改行(LF)
23559G4/5FALSE357→8203ゼロ幅スペース
24603H4/4FALSE154→65302全角英数
26722J4/4FALSE474→106英小文字(j)
単位:LEN は文字数、文字番号は10進数。対象:架空の照合表30件のうち不一致の8行。出所:学習用の仮定に基づき大手町プレップ作成。文字番号は UNICODE の実測値。(スマートフォンでは表を横にスクロールできます)

図表1のとおり、LEN が 4/5 の4行は、右の文字番号から 160(ノーブレークスペース)、12288(全角スペース)、10(改行)、8203(ゼロ幅スペース)と分かります。4/4 の行は、No.24 が 65302(全角の数字)、No.26 が 74 と 106(J の大文字と小文字)、No.7 が 48(数字の 0)と 79(英字の O)です。No.12 だけは EXACT が TRUE です。

No.23 を1文字ずつ分解したのが図表2です。

図表2:コード 559G を1文字ずつ分解する(架空) 位置1 位置2 位置3 位置4 位置5 自社管理表 LEN=4 5 53 5 53 9 57 G 71 なし 外部データ LEN=5 5 53 5 53 見えない 8203 9 57 G 71 ≠ ≠ ≠ ▲最初の差 ▲以降は1つずつずれる 赤の実線枠=最初に番号が違う位置(EXACT が FALSE になる原因)。金の破線枠=ずれの結果。 画面では両方とも「559G」に見える。違いは文字番号 8203(ゼロ幅スペース)だけ。
単位:文字番号​(Unicode の​コードポイント、​10進数)。​対象:架空の​コード 559G の​左右2表記。​出所:学習用の​仮定に​基づき大手町​プレップ​作成。​(スマートフォンでは​図を​横に​スクロールできます)

先頭の2文字は左右とも 53 ですが、3文字目が左は 57、右は 8203 で、以降は1つずつずれます。最初に違う位置を見れば、原因の文字が1つに絞れます。

CODE は文字セットに基づく番号を返すので代用できません10。UNICODE は先頭文字の Unicode のコードポイントを返します11。実測では全角の「A」が UNICODE で 65313、CODE で 9025、ゼロ幅スペースは CODE だと「?」と同じ 63 になり区別できませんでした。

型違いは ISTEXT で​見つける

コードが数値で入っている No.12 は、文字数も EXACT も差を示さず、MATCH だけが #N/A を返します(検索値が見つからないことを示すエラー値)。この場合は =ISTEXT(C13) で右が文字列かを調べ、FALSE なら数値です。コード列は左右とも文字列にそろえます(数値と文字列の一般論はExcelの​財務​データクリーニング​実務)。

原因の​5分類と​直し方

8件の原因を5つに分類し、見え方・見つけ方・直し方を並べたのが図表3です。

図表3:不一致の5分類(見え方・見つけ方・直し方)
図表3:不一致の5分類(見え方・見つけ方・直し方)
分類見え方見つけ方直し方
A 隠れた文字(160・12288・10・8203)同じに見えるLEN の差、UNICODESUBSTITUTE、CLEAN
B 全角・半角字幅が違うEXACT、UNICODE が 65000 台ASC
C 英大小大小の違い(MATCH では外れない)EXACT だけが FALSEUPPER、LOWER
D 似た別の文字O と 0、ハイフン類UNICODE の番号規則を決めて置換
E 数値と文字列同じに見えるISTEXT、MATCH と COUNTIF の差文字列へそろえる
単位:文字番号は​10進数。​出所:上記環境での​実測と Microsoft サポートの​関数の​説明を​基に​大手町​プレップ​作成。​(スマートフォンでは​表を​横に​スクロールできます)

分類Dの「ハイフン類」は社名や科目名のキーで起きます。実測では半角の「-」が 45、「‐」が 8208、「−」が 8722、全角の「-」が 65293、長音「ー」が 12540 で、見た目が近くても番号は違います。置換の規則はキーの種類ごとに決めるもので、設例には現れないため番号を示すにとどめます。

整えた​前後の​一致件数を​比べる

元のデータは変えず、照合キー列を別に作り、原因別に1段ずつ整えます。右コードは C 列、整える列は N〜Q 列(手順1〜4。それぞれ前の列を参照)です。

  • 手順1(隠れた文字を除く):=TRIM(CLEAN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(C2,UNICHAR(160),""),UNICHAR(8203),""),UNICHAR(12288),"")))。UNICHAR は文字番号から文字を返します。SUBSTITUTE を通すと数値も文字列になり、型違いも直ります。
  • 手順2(全角を半角に):=ASC(N2)
  • 手順3(英字を大文字に):=UPPER(O2)
  • 手順4(O を 0 に):=SUBSTITUTE(P2,"O","0")

手順4は性質が違います。証券コードに使う英大文字は、O を含む7文字を除いた19文字です12。そのため4けたのコード列に限り、O は 0 の入力ミスとみなして置換できます。これは編集部の判断で、社名や他の列には使えません。

確認セルは次の3つで、補助として K 列に =IFERROR(MATCH(B2,$Q$2:$Q$31,0),0)、M 列に =IF(K2>0,EXACT(B2,INDEX($Q$2:$Q$31,K2)),"") を置きます。

  • MATCH で一致した件数:=SUMPRODUCT(--ISNUMBER(MATCH($B$2:$B$31,$Q$2:$Q$31,0)))
  • COUNTIF で一致した件数:=SUMPRODUCT(--(COUNTIF($Q$2:$Q$31,$B$2:$B$31)>0))
  • 英大小まで一致した件数:=COUNTIF($M$2:$M$31,TRUE)

Q 列を C・N・O・P 列に差し替えて数えた各段階の件数が図表4です。

図表4:正規化前後の一致件数(全30件中、単位:件)
図表4:正規化前後の一致件数(全30件中、単位:件)
段階MATCHCOUNTIFEXACT まで一致MATCH で外れた行
そのまま2324227
手順1 隠れた文字2828272
手順2 全角→半角2929281
手順3 大文字化2929291
手順4 O→03030300
対象:架空の​照合表30件。​各段階は​前の​手順を​含む累積。​出所:学習用の​仮定に​基づき大手町​プレップ​作成。​件数は​実測値。​(スマートフォンでは​表を​横に​スクロールできます)

図表4のとおり、そのままでは MATCH で23件、COUNTIF で24件で、差の1件は型違いの No.12 です。手順1で5件(隠れた文字4件と型違い1件)が直って28件、手順2で全角英数が直って29件です。手順3で英大小まで一致した件数が29件になり、手順4で No.7 が直って30件がそろいます。

3つの件数の食い違いも異常の合図です。複数の確認を1つに集める考え方は、用語集のモデルチェックサムの​設計が説明しています。

使い分けと​限界

分解式は数万行に入れると重いので、外れた行だけに使い、全件には正規化列を使います。診断列の式は全行で同じ形にします(一行一式の​原則)。

正規化列は既知の原因にしか効きません。IFERROR で #N/A を隠さず、外れた行を残して同じ手順で調べます。使いどころはIFERROR​関数の​使い方と用語集のIFERROR​関数に委ねます。入力段階で防ぐ方法はExcelの​データ検証​(入力規則)と用語集のデータの​入力規則が扱っています。

原因が重なる行は、手順1から1段ずつ直し、どの段で消えるかを見ます。結果は確かめた環境と設例の範囲のもので、別のバージョンや他のツールで同じとは限りません。

実務​チェックリスト

  • 外れた行は、まず LEN の左右差を確認する。
  • 差がない行は EXACT で比べ、MATCH の判定と食い違う行を拾う。
  • FALSE の行は、最初に違う位置の文字番号を左右とも取り出し、図表3に当てはめる。
  • 文字に差がなく MATCH だけが #N/A なら、ISTEXT で左右の型をそろえる。
  • 整えた列は元の列を残して別に作り、3つの一致件数を前後で比べる。
  • 置換の規則はキーごとの根拠(例:コードに使わない文字)で決め、他の列に流用しない。
  • キーに *・?・~ があれば件数のずれを疑う。

よく​ある​質問​(FAQ)

英大小の​違いは、​照合に​失敗しないなら​直さなくて​よいですか。

Excel 内の MATCH や COUNTIF で完結するなら一致します。ただし EXACT で検算する場合や、大小を区別する別のツールへキーを渡す場合は差になります。

社名の​照合でも​同じ​手順が​使えますか。

使えます。​ただし​「(株)」と​「株式会社」のような​表記の​違いは​文字の​混入ではないため、​この​手順の​対象外です。

まとめ

見た目が同じなのに外れるキーは、LEN・EXACT・UNICODE の順に調べると原因の文字が絞れます。設例では4段で整えて23件が30件になりました。MATCH と COUNTIF で一致の意味が違い、英大小は MATCH では外れない点を押さえると、診断を読み違えません。

脚注

  1. 証券コード協議会のリーフレット「2024年1月から証券コードに英文字が入ります!」p.2「英文字組入れの概要」1・3。2024年1月1日以降に設定する株式固有名コードから、2けた目と4けた目のいずれか、もしくは両方に英文字を使用(参考文献 R1)。↩
  2. 同リーフレット p.2「2. 使用する英文字」。「英大文字のうち、『B』、『E』、『I』、『O』、『Q』、『V』、『Z』を除く19文字を使用します。」(参考文献 R1)↩
  3. 同リーフレット p.1 は、既に設定されているコードは変更されない(数字のみのまま)と記しています。東京証券取引所の2022年5月31日付文書は、証券コード協議会が2024年1月1日以降に新たに設定するコードから英文字を組み入れると公表したことを伝えています(参考文献 R1・R2)。↩
  4. Microsoft サポート「MATCH 関数」:MATCH 関数では英字の大文字と小文字は区別されない(参考文献 R5)。↩
  5. Microsoft サポート「COUNTIF 関数」:条件で大文字と小文字は区別されない(参考文献 R6)。↩
  6. Microsoft サポート「EXACT 関数」:2つの文字列がまったく同じなら TRUE、そうでなければ FALSE を返し、大文字と小文字は区別する。Wall Street Oasis の同関数のページも大小を区別する比較と説明(一般的な概念の参考。参考文献 R3・R4)。↩
  7. Microsoft サポート「COUNTIF 関数」「MATCH 関数」:? は任意の1文字、* は任意の文字列を表し、文字そのものを探すには ~ を前に付ける(参考文献 R5・R6)。↩
  8. Microsoft サポート「TRIM 関数」:TRIM は 7 ビット ASCII のスペース(10進値32)を対象とし、10進値160の改行しないスペースは削除しない(参考文献 R7)。↩
  9. Microsoft サポート「CLEAN 関数」:7 ビット ASCII の印刷できない先頭32文字(値0〜31)を削除するよう設計されている(参考文献 R8)。↩
  10. Microsoft サポート「CODE 関数」:先頭文字の数値コードを返し、コードはコンピューターの文字セット(Windows は ANSI)に対応する(参考文献 R9)。↩
  11. Microsoft サポート「UNICODE 関数」:文字列の最初の文字に対応する番号(コードポイント)を返す(参考文献 R10)。↩
  12. 脚注2と同じ記述(リーフレット p.2)に基づき、O を 0 の誤入力とみなす置換は編集部が導いた判断です(参考文献 R1)。↩

参考文献​(2026年10月確認)

※本記事は教育目的の一般的な解説であり、法務・税務・投資助言ではありません。設例は理解のための学習用の架空事例であり、実在の企業・案件とは関係ありません。