MID / MIDB 関数 完全ガイド ― 「文字数」と「バイト数」で文字列を自在に抽出する
📖 目次
1 MID と MIDB の決定的な違い
文字列の「途中」から指定した分だけテキストを抜き出す関数です。Excelには文字をカウントする基準が2つあります。
| 関数 | カウント基準 | 半角「A」 | 全角「あ」 | 主な用途 |
|---|---|---|---|---|
| MID | 文字数 | 1 | 1 | 通常の文字列操作 |
| MIDB | バイト数 | 1 | 2 | 固定長データの処理 |
「123456」のような半角データだけなら結果は同じですが、かなや漢字が混じると結果が大きく変わります。
2 MID関数:文字数で切り出す
私たちが目で見て「何文字目から何文字」と数える感覚で使えます。
具体例
対象文字列:ABあいう123
| 文字 | A | B | あ | い | う | 1 | 2 | 3 |
| 何文字目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
結果:あい ― 全角も半角も「1文字」として数えるため、3文字目から2文字で「あい」が返る。
=MID("ABC", 10, 3) のように開始位置が文字列長を超えると、エラーではなく空文字 "" が返ります。文字数が残りより多い場合は残り全部が返ります。
3 MIDB関数:バイト数で切り出す
文字コード(Shift-JIS)における情報サイズ(バイト)を基準に処理します。
バイト数の数え方
| 文字種別 | 例 | バイト数 |
|---|---|---|
| 半角英数・半角カナ・半角スペース | A, 1, ア | 1バイト |
| 全角ひらがな・漢字・全角英数 | あ, 漢, A | 2バイト |
具体例
対象文字列:ABあいう123
| 文字 | A | B | あ | い | う | 1 | 2 | 3 |
| バイト位置 | 1 | 2 | 3-4 | 5-6 | 7-8 | 9 | 10 | 11 |
結果:AB ― 1バイト目から2バイト分。半角「A」「B」はそれぞれ1バイトなので2文字が返る。
結果:あい ― 3バイト目から4バイト分。全角「あ」(2バイト)+「い」(2バイト)=4バイトで「あい」が返る。
4 全角文字の分断とExcelの挙動
結果: (半角スペース) ― 「あ」は3-4バイト目の2バイト文字。1バイトだけ抽出すると全角が分断される。
「あ」は3バイト目と4バイト目で構成される2バイトの文字です。「3バイト目から1バイトだけ」と指示すると全角文字が分断されてしまいます。Excelはこのような場合、文字化けを防ぐために自動的に半角スペースに変換して出力します。固定長データの処理で開始位置やバイト数を間違えると、結果にスペースが紛れ込むことで気づけます。
結果:あ (「あ」+半角スペース) ― 3バイトのうち「あ」で2バイト消費し、残り1バイトは「い」を分断するため半角スペースに。
MIDBの結果に意図しない半角スペースが含まれていたら、それは「全角文字の境界をまたいで切っている」サインです。レイアウト定義書の開始位置やバイト数を再確認してください。
5 関連関数ファミリー(LEFT/RIGHT/LEN のB付き)
MID / MIDB と同様に、LEFT / RIGHT / LEN にも「B付き」のバイト版が存在します。固定長データの処理ではこれらをセットで使います。
| 文字数ベース | バイト数ベース | 機能 |
|---|---|---|
| LEFT | LEFTB | 先頭からN文字(バイト)を抽出 |
| RIGHT | RIGHTB | 末尾からN文字(バイト)を抽出 |
| MID | MIDB | 途中のN文字(バイト)を抽出 |
| LEN | LENB | 文字数(バイト数)を返す |
LENB でバイト数を確認する
A1 のバイト数を返す。固定長データの1レコードが正しいバイト数かどうかの検証に使う。
A1 の文字数を返す。LENBとの差で全角文字の数を推定できる。
=LENB(A1)-LEN(A1) で全角文字の個数がわかります。全角は2バイト・半角は1バイトなので、バイト数と文字数の差がそのまま全角文字の数になります。
6 実務の核心:固定長データとMIDB
普段Excelの中だけで作業している場合、MIDB関数を使う機会はほとんどありません。文字数でカウントするMIDで十分だからです。
しかし、ホストコンピュータ(汎用機・COBOL)や古い業務システムから出力されたデータを処理する際に、MIDB関数が絶対に必要になります。
「固定長ファイル」とは?
CSVファイルは「田中,東京,1200」のようにカンマで区切られています。一方、固定長ファイルには区切り文字がありません。代わりに「1バイト目から6バイト目まではID」「7バイト目から22バイト目までは氏名」のように、情報の入る枠(バイト数)がガチガチに固定されています。
全角16バイトの枠に「田中」(4バイト)が入った場合、残り12バイトは自動的にスペースで埋められます。これにより各フィールドの位置が常に一定になり、プログラムで高速に処理できるのです。
固定長データの実例
789012ヤマダ ハナコ 000000085000
555555山田 太郎 000000300000
MIDでは正しく切り出せない理由
上のデータで氏名部分には半角カナ(1バイト)や全角漢字(2バイト)が混在しています。MID関数は全角も半角も「1文字」と数えるため、3行目の全角「山田 太郎」と1行目の半角カナ「タナカ タロウ」では同じ文字数でもバイト数が異なります。MIDで「7文字目から16文字」と指定すると、行によって抽出位置がズレて後続の「給与」フィールドが正しく取れません。
固定長データの仕様は「バイト数」で定義されています。「文字数」で切り出す MID を使うと、全角・半角が混在する行で必ず位置がズレます。固定長データには必ず MIDB を使ってください。
7 レイアウト定義書の読み方
固定長データには必ず「レイアウト定義書(フィールド仕様書)」が付属します。ここにバイト位置とバイト数が記載されており、これをそのまま MIDB の引数にします。
定義書の例
| 項目名 | 開始バイト | バイト数 | 型 | 備考 |
|---|---|---|---|---|
| 従業員ID | 1 | 6 | 半角英数 | |
| 氏名 | 7 | 16 | 混在 | 半角カナまたは全角。不足分はスペース埋め |
| 給与 | 23 | 12 | 半角数字 | 右詰めゼロ埋め |
定義書どおりに MIDB で切り出す
従業員ID:1バイト目から6バイト。
氏名:7バイト目から16バイト。TRIMで末尾のスペース埋めを除去。
給与:23バイト目から12バイト。VALUEで数値化("000001500000" → 1500000)。
レイアウト定義書を読むときは「開始バイト」と「バイト数」の2列だけ見れば、そのまま MIDB の第2引数・第3引数に転記できます。プログラミングの知識は不要です。
8 TRIM + MIDB:固定長処理の最強コンビ
固定長データはフィールドの長さが足りない分をスペースで埋めています。MIDBで切り出した直後の文字列は後ろに大量のスペースがくっついた状態です。
❌ TRIMなし:後ろにスペースが残るMIDBで正確なバイト位置から切り出し → TRIMで先頭・末尾のスペースと連続スペースを除去。
Excel の TRIM 関数は半角スペース(CHAR(32))だけを除去します。全角スペース「 」は残ります。ホスト系データには全角スペースが含まれることも多いため、必要に応じて SUBSTITUTE で除去してください。
全角スペースを半角に置換してからTRIMで整理。固定長+全角スペース混在データの定番パターン。
数値フィールドの処理:ゼロ埋めの解除
固定長データの数値は「000001500000」のように左ゼロ埋めされています。VALUE関数で数値化すれば先頭のゼロが自動的に消えます。
結果:1500000 ― 文字列"000001500000"が数値 1500000 に変換される。
COBOLの固定長データでは負の値が「00150}」のようにゾーン10進で表現されることがあります。末尾の文字が符号を兼ねているパターンです。この場合はVALUEだけでは変換できないため、別途変換ロジックが必要です。
9 MID + FIND:可変位置からの抽出
MID関数の開始位置を FIND(または SEARCH)で動的に決定することで、区切り文字がある文字列から特定の部分を抽出できます。
メールアドレスからドメインを抽出
「@」の次の文字から末尾まで。文字数にLEN(A1)を指定すれば、残り全部を確実に取得できる(多すぎても問題ない)。
ファイル名から拡張子を除去
最初の「.」の直前まで。MIDではなくLEFTを使うパターンだが、FIND で位置を動的に決める点は同じ。
2番目の区切り文字以降を抽出
FINDを2回ネストして「2番目のハイフン」の位置を特定。例:"ABC-DEF-GHI" → "GHI"
上記のような MID+FIND の組み合わせは、TEXTAFTER / TEXTBEFORE 関数でもっと簡潔に書けます。詳しくはセクション11で比較しています。
10 実務パターン集
パターン① 社員番号から部署コード・入社年・連番を分離
社員番号 SL20230015 が「部署(2桁)+入社年(4桁)+連番(4桁)」の構成。
部署コード → "SL"
入社年 → "2023"
連番 → 15(VALUE で数値化)
パターン② 固定長レコードから全フィールドを一括切り出し
レイアウト定義書に基づいて MIDB + TRIM / VALUE でフィールドを分離。
従業員ID(1〜6バイト)
氏名(7〜22バイト)。全角スペースも半角に統一してからTRIM。
給与(23〜34バイト)。ゼロ埋め文字列を数値に変換。
パターン③ 文字列を1文字ずつ分解(MID + ROW)
これを下方向にコピーすると、A1の文字列が1文字ずつ縦に展開される。文字種の判定やカウントに便利。
パターン④ 日付文字列の分離(YYYYMMDD → YYYY/MM/DD)
"20260408" → "2026/04/08"。日付として計算に使うならさらにDATEVALUEで変換。
パターン⑤ LENB で固定長レコードのバイト数を検証
レコードが定義書どおり34バイトかどうかをチェック。バイト数がズレていればデータ不備。
パターン⑥ 半角/全角が混在するデータの桁揃え確認
全角文字の個数を返す。「半角カナで統一されるべきフィールドに全角が混入していないか」の検証に使う。結果が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) |
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の結果に意図しないスペースが出たら、全角文字の境界をまたいで切っているサイン。