MID / MIDB 関数 完全ガイド ― 「文字数」と「バイト数」で文字列を自在に抽出する

1 MID と MIDB の決定的な違い

文字列の「途中」から指定した分だけテキストを抜き出す関数です。Excelには文字をカウントする基準が2つあります。

データテーブル
関数 カウント基準 半角「A」 全角「あ」 主な用途
MID 文字数 1 1 通常の文字列操作
MIDB バイト数 1 2 固定長データの処理

「123456」のような半角データだけなら結果は同じですが、かなや漢字が混じると結果が大きく変わります。

2 MID関数:文字数で切り出す

私たちが目で見て「何文字目から何文字」と数える感覚で使えます。

=MID(文字列, 開始位置, 文字数)

具体例

対象文字列:ABあいう123

データテーブル
文字AB123
何文字目12345678
=MID("ABあいう123", 3, 2)

結果:あい ― 全角も半角も「1文字」として数えるため、3文字目から2文字で「あい」が返る。

💡 開始位置が文字列の長さを超えた場合
=MID("ABC", 10, 3) のように開始位置が文字列長を超えると、エラーではなく空文字 "" が返ります。文字数が残りより多い場合は残り全部が返ります。

3 MIDB関数:バイト数で切り出す

文字コード(Shift-JIS)における情報サイズ(バイト)を基準に処理します。

=MIDB(文字列, 開始バイト位置, バイト数)

バイト数の数え方

データテーブル
文字種別バイト数
半角英数・半角カナ・半角スペースA, 1, ア1バイト
全角ひらがな・漢字・全角英数あ, 漢, A2バイト

具体例

対象文字列:ABあいう123

データテーブル
文字AB123
バイト位置123-45-67-891011
=MIDB("ABあいう123", 1, 2)

結果:AB ― 1バイト目から2バイト分。半角「A」「B」はそれぞれ1バイトなので2文字が返る。

=MIDB("ABあいう123", 3, 4)

結果:あい ― 3バイト目から4バイト分。全角「あ」(2バイト)+「い」(2バイト)=4バイトで「あい」が返る。

4 全角文字の分断とExcelの挙動

=MIDB("ABあいう123", 3, 1)

結果: (半角スペース) ― 「あ」は3-4バイト目の2バイト文字。1バイトだけ抽出すると全角が分断される。

⚠️ 全角文字を途中で切るとどうなるか
「あ」は3バイト目と4バイト目で構成される2バイトの文字です。「3バイト目から1バイトだけ」と指示すると全角文字が分断されてしまいます。Excelはこのような場合、文字化けを防ぐために自動的に半角スペースに変換して出力します。固定長データの処理で開始位置やバイト数を間違えると、結果にスペースが紛れ込むことで気づけます。
=MIDB("ABあいう123", 3, 3)

結果:(「あ」+半角スペース) ― 3バイトのうち「あ」で2バイト消費し、残り1バイトは「い」を分断するため半角スペースに。

💡 バイト数のズレを検知する方法
MIDBの結果に意図しない半角スペースが含まれていたら、それは「全角文字の境界をまたいで切っている」サインです。レイアウト定義書の開始位置やバイト数を再確認してください。

5 関連関数ファミリー(LEFT/RIGHT/LEN のB付き)

MID / MIDB と同様に、LEFT / RIGHT / LEN にも「B付き」のバイト版が存在します。固定長データの処理ではこれらをセットで使います。

データテーブル
文字数ベース バイト数ベース 機能
LEFTLEFTB先頭からN文字(バイト)を抽出
RIGHTRIGHTB末尾からN文字(バイト)を抽出
MIDMIDB途中のN文字(バイト)を抽出
LENLENB文字数(バイト数)を返す

LENB でバイト数を確認する

=LENB(A1)

A1 のバイト数を返す。固定長データの1レコードが正しいバイト数かどうかの検証に使う。

=LEN(A1)

A1 の文字数を返す。LENBとの差で全角文字の数を推定できる。

💡 全角文字の個数を数える公式
=LENB(A1)-LEN(A1) で全角文字の個数がわかります。全角は2バイト・半角は1バイトなので、バイト数と文字数の差がそのまま全角文字の数になります。
=LENB(A1)-LEN(A1)

6 実務の核心:固定長データとMIDB

普段Excelの中だけで作業している場合、MIDB関数を使う機会はほとんどありません。文字数でカウントするMIDで十分だからです。

しかし、ホストコンピュータ(汎用機・COBOL)や古い業務システムから出力されたデータを処理する際に、MIDB関数が絶対に必要になります。

「固定長ファイル」とは?

CSVファイルは「田中,東京,1200」のようにカンマで区切られています。一方、固定長ファイルには区切り文字がありません。代わりに「1バイト目から6バイト目まではID」「7バイト目から22バイト目までは氏名」のように、情報の入る枠(バイト数)がガチガチに固定されています。

全角16バイトの枠に「田中」(4バイト)が入った場合、残り12バイトは自動的にスペースで埋められます。これにより各フィールドの位置が常に一定になり、プログラムで高速に処理できるのです。

固定長データの実例

123456タナカ タロウ     000001500000
789012ヤマダ ハナコ    000000085000
555555山田 太郎       000000300000

MIDでは正しく切り出せない理由

上のデータで氏名部分には半角カナ(1バイト)や全角漢字(2バイト)が混在しています。MID関数は全角も半角も「1文字」と数えるため、3行目の全角「山田 太郎」と1行目の半角カナ「タナカ タロウ」では同じ文字数でもバイト数が異なります。MIDで「7文字目から16文字」と指定すると、行によって抽出位置がズレて後続の「給与」フィールドが正しく取れません。

🔴 固定長データに MID を使ってはいけない
固定長データの仕様は「バイト数」で定義されています。「文字数」で切り出す MID を使うと、全角・半角が混在する行で必ず位置がズレます。固定長データには必ず MIDB を使ってください。

7 レイアウト定義書の読み方

固定長データには必ず「レイアウト定義書(フィールド仕様書)」が付属します。ここにバイト位置とバイト数が記載されており、これをそのまま MIDB の引数にします。

定義書の例

データテーブル
項目名開始バイトバイト数備考
従業員ID16半角英数
氏名716混在半角カナまたは全角。不足分はスペース埋め
給与2312半角数字右詰めゼロ埋め

定義書どおりに MIDB で切り出す

=MIDB(A2, 1, 6)

従業員ID:1バイト目から6バイト。

=TRIM(MIDB(A2, 7, 16))

氏名:7バイト目から16バイト。TRIMで末尾のスペース埋めを除去。

=VALUE(MIDB(A2, 23, 12))

給与:23バイト目から12バイト。VALUEで数値化("000001500000" → 1500000)。

💡 定義書の「開始バイト」がそのまま第2引数になる
レイアウト定義書を読むときは「開始バイト」と「バイト数」の2列だけ見れば、そのまま MIDB の第2引数・第3引数に転記できます。プログラミングの知識は不要です。

8 TRIM + MIDB:固定長処理の最強コンビ

固定長データはフィールドの長さが足りない分をスペースで埋めています。MIDBで切り出した直後の文字列は後ろに大量のスペースがくっついた状態です。

❌ TRIMなし:後ろにスペースが残る
=MIDB(A2, 7, 16) → "タナカ タロウ " (末尾にスペース) このままVLOOKUPに使うと「一致しない」エラーに。 "タナカ タロウ " ≠ "タナカ タロウ" (別の文字列として扱われる)
✅ TRIMあり:クリーンな文字列
=TRIM(MIDB(A2, 7, 16))

MIDBで正確なバイト位置から切り出し → TRIMで先頭・末尾のスペースと連続スペースを除去。

⚠️ 全角スペースは TRIM では消えない
Excel の TRIM 関数は半角スペース(CHAR(32))だけを除去します。全角スペース「 」は残ります。ホスト系データには全角スペースが含まれることも多いため、必要に応じて SUBSTITUTE で除去してください。
=TRIM(SUBSTITUTE(MIDB(A2, 7, 16), " ", " "))

全角スペースを半角に置換してからTRIMで整理。固定長+全角スペース混在データの定番パターン。

数値フィールドの処理:ゼロ埋めの解除

固定長データの数値は「000001500000」のように左ゼロ埋めされています。VALUE関数で数値化すれば先頭のゼロが自動的に消えます。

=VALUE(MIDB(A2, 23, 12))

結果:1500000 ― 文字列"000001500000"が数値 1500000 に変換される。

💡 符号付き数値(末尾が符号)の処理
COBOLの固定長データでは負の値が「00150}」のようにゾーン10進で表現されることがあります。末尾の文字が符号を兼ねているパターンです。この場合はVALUEだけでは変換できないため、別途変換ロジックが必要です。

9 MID + FIND:可変位置からの抽出

MID関数の開始位置を FIND(または SEARCH)で動的に決定することで、区切り文字がある文字列から特定の部分を抽出できます。

メールアドレスからドメインを抽出

=MID(A1, FIND("@", A1)+1, LEN(A1))

「@」の次の文字から末尾まで。文字数にLEN(A1)を指定すれば、残り全部を確実に取得できる(多すぎても問題ない)。

ファイル名から拡張子を除去

=LEFT(A1, FIND(".", A1)-1)

最初の「.」の直前まで。MIDではなくLEFTを使うパターンだが、FIND で位置を動的に決める点は同じ。

2番目の区切り文字以降を抽出

=MID(A1, FIND("-", A1, FIND("-", A1)+1)+1, LEN(A1))

FINDを2回ネストして「2番目のハイフン」の位置を特定。例:"ABC-DEF-GHI" → "GHI"

✅ TEXTAFTER / TEXTBEFORE が使えるなら
上記のような MID+FIND の組み合わせは、TEXTAFTER / TEXTBEFORE 関数でもっと簡潔に書けます。詳しくはセクション11で比較しています。

10 実務パターン集

パターン① 社員番号から部署コード・入社年・連番を分離

社員番号 SL20230015 が「部署(2桁)+入社年(4桁)+連番(4桁)」の構成。

=MID(A1, 1, 2)

部署コード → "SL"

=MID(A1, 3, 4)

入社年 → "2023"

=VALUE(MID(A1, 7, 4))

連番 → 15(VALUE で数値化)

パターン② 固定長レコードから全フィールドを一括切り出し

レイアウト定義書に基づいて MIDB + TRIM / VALUE でフィールドを分離。

=TRIM(MIDB($A2, 1, 6))

従業員ID(1〜6バイト)

=TRIM(SUBSTITUTE(MIDB($A2, 7, 16), " ", " "))

氏名(7〜22バイト)。全角スペースも半角に統一してからTRIM。

=VALUE(MIDB($A2, 23, 12))

給与(23〜34バイト)。ゼロ埋め文字列を数値に変換。

パターン③ 文字列を1文字ずつ分解(MID + ROW)

=MID($A$1, ROW(A1), 1)

これを下方向にコピーすると、A1の文字列が1文字ずつ縦に展開される。文字種の判定やカウントに便利。

パターン④ 日付文字列の分離(YYYYMMDD → YYYY/MM/DD)

=MID(A1,1,4)&"/"&MID(A1,5,2)&"/"&MID(A1,7,2)

"20260408" → "2026/04/08"。日付として計算に使うならさらにDATEVALUEで変換。

パターン⑤ LENB で固定長レコードのバイト数を検証

=IF(LENB(A2)=34, "OK", "NG: "&LENB(A2)&"バイト")

レコードが定義書どおり34バイトかどうかをチェック。バイト数がズレていればデータ不備。

パターン⑥ 半角/全角が混在するデータの桁揃え確認

=LENB(A1)-LEN(A1)

全角文字の個数を返す。「半角カナで統一されるべきフィールドに全角が混入していないか」の検証に使う。結果が0なら全て半角。

11 TEXTBEFORE / TEXTAFTER との比較

区切り文字で文字列を分割する用途では、MID+FIND の組み合わせよりも TEXTBEFORE / TEXTAFTER のほうが圧倒的に簡潔です。

データテーブル
やりたいこと MID + FIND TEXTBEFORE / TEXTAFTER
「@」より後ろ =MID(A1,FIND("@",A1)+1,LEN(A1)) =TEXTAFTER(A1,"@")
「@」より前 =LEFT(A1,FIND("@",A1)-1) =TEXTBEFORE(A1,"@")
2番目の「-」より後ろ =MID(A1,FIND("-",A1,FIND("-",A1)+1)+1,LEN(A1)) =TEXTAFTER(A1,"-",2)
💡 MID は不要にならない
TEXTBEFORE / TEXTAFTER は「区切り文字ベース」の分割に最適です。一方、MID は「固定位置・固定文字数」での切り出しに使います。社員番号の分離や固定フォーマットの解析では依然として MID が主役です。MIDB については固定長データ処理の唯一の手段であり、代替関数は存在しません。

12 まとめ

データテーブル
場面最適な関数
固定フォーマット(半角のみ)の切り出しMID
区切り文字での分割MID + FIND(または TEXTAFTER/TEXTBEFORE)
固定長データ(COBOL・ホスト系)の処理MIDB + TRIM(+SUBSTITUTE+VALUE)
バイト数の検証LENB
全角文字の個数カウントLENB - LEN
✅ 覚えておくべきポイント
MID は文字数、MIDB はバイト数。半角だけなら同じ結果だが、全角混在で差が出る。
固定長データには必ず MIDB。MID を使うとバイト位置がズレて正しく切り出せない。
MIDB + TRIM は固定長処理の最強コンビ。さらに全角スペースがあれば SUBSTITUTE を追加。
LENB でバイト数を検証。レコード長のチェックや全角文字の混入検知に使える。
⑤ MIDBの結果に意図しないスペースが出たら、全角文字の境界をまたいで切っているサイン

🔗 関連記事