スプレッドシートで基幹システムの固定長データを扱っていると、「文字列の途中の◯バイト目から◯バイトだけ取り出したい」という場面、ありませんか。CSVじゃなくて全角半角混在の固定長テキストで、真ん中あたりの氏名フィールドを抜き出す、なんてケースもよくありますよね。
MID関数だと「文字数」で切るので、全角が混ざると想定位置からズレてしまうんですよね。そんなときにピッタリ使えるのが、スプレッドシートのMIDB関数です。全角2バイト・半角1バイトでカウントしながら、任意の位置から必要なバイト数ぶんだけサクッと取り出せますよ。
この記事では、スプレッドシートのMIDB関数の構文から、MID関数との違い、固定長ファイルの中間フィールド抽出など実務パターンまで紹介します。LEFTB/RIGHTBと組み合わせた「フィールド分解」のテンプレートも置いておきますね。
スプレッドシートのMIDB関数とは?
スプレッドシートのMIDB関数は、文字列の指定したバイト位置から、指定したバイト数ぶんの文字を取り出す文字列関数です。読み方は「ミッド・ビー」で、MID(中間)と Byte(バイト)を組み合わせた名前ですよ。
全角文字は2バイト、半角文字は1バイトとしてカウントします。日本語と英数字が入り混じる固定長データから、中間フィールドをバイト単位で正確に抜き出したいときに便利ですよ。
関数の基本構文と引数
基本構文はシンプルで、引数は3つです。
=MIDB(文字列, 開始バイト, バイト数)
引数の意味を整理しておきましょう。
| 引数 | 意味 | 注意点 |
|---|---|---|
| 文字列 | 対象となるテキスト | 省略不可 |
| 開始バイト | 取り出しを始める位置(1以上の整数) | 1バイト目から数え始める |
| バイト数 | 取り出すバイト数(0以上の整数) | 省略不可 |
開始バイトに小数を指定した場合は、整数部分に切り捨てられます。0以下を入れると #VALUE! エラーになるので、気をつけてくださいね。
MID関数との違い(文字数 vs バイト数)
MID関数とMIDB関数は、切り出す単位が違います。ここを押さえておくと、使い分けで迷いません。
- MID: 指定した文字位置から「文字数」ぶんを取り出す。全角・半角を区別しない
- MIDB: 指定したバイト位置から「バイト数」ぶんを取り出す。全角=2バイト、半角=1バイトで計算
たとえば「商品A-100」という文字列で、3つ目から4つぶん取り出したい場合はこうなります。
| 数式 | 結果 | 解説 |
|---|---|---|
=MID("商品A-100", 3, 4) | A-10 | 3文字目から4文字(全角半角を問わず) |
=MIDB("商品A-100", 3, 4) | 品A- | 3バイト目から4バイト(全角1+半角2=4バイト) |
「レイアウト定義書で5バイト目から10バイトが氏名フィールド」のような固定長仕様のときは、MIDBの出番ですよ。
MIDB関数の基本的な使い方
それでは実際に使ってみましょう。開始バイトとバイト数の両方をイメージできると、結果が読みやすくなります。
全角・半角が混在する文字列での挙動
代表的なパターンをいくつか並べてみますね。
| 数式 | 結果 | バイトの内訳 |
|---|---|---|
=MIDB("あいうえお", 3, 4) | いう | 3バイト目から4バイト(全角2文字=4バイト) |
=MIDB("ABCDE", 2, 3) | BCD | 2バイト目から3バイト(半角3文字=3バイト) |
=MIDB("Excel関数", 6, 2) | 関 | 6バイト目から2バイト(全角1文字=2バイト) |
=MIDB("商品コード", 2, 4) | 品コ | 2バイト目から4バイト(開始が全角の途中になるため先頭1バイト分が欠ける) |
注目してほしいのは最後の行です。開始バイトが全角文字の途中に来る場合や、バイト数が全角文字の途中で切れる場合、スプレッドシートではそのバイトは切り捨てられます。文字が半分になって文字化けする、といった心配は不要ですよ。
開始バイトとバイト数の関係
MIDBはLEFTB/RIGHTBと違って、位置の指定が2つあります。ここでつまずきやすいので整理しておきますね。
- 開始バイトは「何バイト目から読み始めるか」(1始まり)
- バイト数は「そこから何バイトぶん取るか」
- 開始バイト + バイト数 − 1 が「読み終わるバイト位置」
たとえば =MIDB(A2, 5, 10) なら、5バイト目から14バイト目までの10バイトが対象です。レイアウト定義書の「開始位置」と「長さ」をそのまま引数に入れればOKですよ。
実務で使えるMIDB関数の活用パターン
MIDB関数が本領を発揮するのは、固定長レイアウトの中間フィールドを抜き出す場面です。よく出てくる3パターンを紹介しますね。
固定長ファイルの中間フィールド切り出し
古い基幹システムからダウンロードしたテキストで、「先頭8バイトが顧客コード、9バイト目から20バイトが氏名、29バイト目から8バイトが受付日」のような固定長レイアウトはよくあります。MIDB関数なら、中間の氏名フィールドもバイト単位でスッと取れますよ。
顧客コード: =LEFTB(A2, 8)
氏名: =MIDB(A2, 9, 20)
受付日: =MIDB(A2, 29, 8)
MIDだと全角が混ざったときに位置がズレますが、MIDBならレイアウト定義書どおりにサクッと取り出せます。3つのフィールドを別列に展開するだけで、後続の集計がぐっと楽になりますよ。
取引先コードの中間区分抽出
業務系の取引先コードには、「先頭2桁が地域、次の3桁が業種、末尾4桁が連番」のような区分が埋め込まれているフォーマットがよくあります。中間の業種部分だけ抜き出して集計したいときにMIDBが効きますよ。
=MIDB(A2, 3, 3)
A列に「JP-WHL-0012」のような半角コードがあれば、3バイト目から3バイト(-WH)の位置を狙って取れます。コードの仕様が半角固定なら、MIDとMIDBの結果は同じですが、後から全角が混ざるケースに備えるならMIDBのほうが安全ですよ。
電文ログからのタイムスタンプ抽出
システム連携のログで、「先頭10バイトが日付、11バイト目から8バイトが時刻、19バイト目以降が本文」のような決まったフォーマットを扱うこともありますよね。MIDBを使うと、中間のタイムスタンプ部分だけきれいに取り出せますよ。
日付: =LEFTB(A2, 10)
時刻: =MIDB(A2, 11, 8)
本文: =MIDB(A2, 19, LENB(A2)-18)
LENB(文字列全体のバイト数を返す関数)を組み合わせて、本文部分は「総バイト数から先頭18バイトを引いた残り全部」として指定しています。末尾の長さが可変のときに便利な書き方ですよ。
MIDBとLEFTB/RIGHTBを組み合わせたフィールド分解
MIDBの真価は、LEFTB/RIGHTB/LENBと組み合わせたときに発揮されます。固定長データの分解や、区切り位置が動くデータの整形にすっきり対応できますよ。
3フィールド分解のテンプレート
A列に固定長データ、B列に1つ目のバイト数、C列に2つ目のバイト数を入れている想定です。先頭・中間・末尾の3つに分けましょう。
先頭フィールド: =LEFTB(A2, B2)
中間フィールド: =MIDB(A2, B2+1, C2)
末尾フィールド: =MIDB(A2, B2+C2+1, LENB(A2)-B2-C2)
B列とC列の数字を変えるだけで、レイアウトの変更に追従できます。中間フィールドの開始位置は「先頭ぶんのバイト数 + 1」、末尾は「総バイト数 − 先頭 − 中間」で計算するのがコツですよ。
先頭と末尾を除外して中間だけ取るテンプレート
「先頭4バイトのヘッダと末尾2バイトのフッタを除いた本体部分だけ抜き出したい」という電文整形のシーンでは、開始位置を固定してバイト数だけLENBから計算します。
=MIDB(A2, 5, LENB(A2)-4-2)
開始バイトは固定(ヘッダ4バイトの次)、バイト数は「全体 − ヘッダ − フッタ」で動的に決めます。データ長が行ごとに違っても1本の数式で整形できるので、ログ解析の前処理で重宝しますよ。
コピペで使えるセット数式
よく使う組み合わせを一式テンプレートにしておきますね。A2にデータ、B2に開始バイト、C2にバイト数という前提です。
対象文字列: =A2
全体バイト数: =LENB(A2)
切り出し結果: =MIDB(A2, B2, C2)
切り出し後バイト数: =LENB(MIDB(A2, B2, C2))
切り出し前の部分: =LEFTB(A2, B2-1)
切り出し後の部分: =MIDB(A2, B2+C2, LENB(A2)-(B2+C2)+1)
データ整形用のワークシートに丸ごと貼り付けて、A列と開始バイト・バイト数を差し替えるだけで使えます。切り出し前後の部分も一緒に出すと、結果のバイト位置が合っているか目視確認しやすくなりますよ。
LEFT系・RIGHT系関数との使い分け
スプレッドシートには似た名前の文字列関数がいくつもあります。ここで全体像を整理しておきましょう。
LEFT・LEFTB・RIGHT・RIGHTB・MID・MIDBの比較
| 関数 | 切り出し位置 | 単位 | 典型用途 |
|---|---|---|---|
| LEFT | 左から | 文字数 | 商品コードの頭3桁抽出 |
| LEFTB | 左から | バイト数 | 基幹システム用の項目整形 |
| RIGHT | 右から | 文字数 | ファイル拡張子の抽出 |
| RIGHTB | 右から | バイト数 | 末尾の固定長フィールド切り出し |
| MID | 任意位置から | 文字数 | 郵便番号の後半3桁抽出 |
| MIDB | 任意位置から | バイト数 | 固定長ファイルの中間フィールド |
左・右の切り出しを組み合わせて使いたいときは、スプレッドシートのLEFTB関数の使い方とスプレッドシートのRIGHTB関数の使い方もあわせて参考にしてみてくださいね。
バイト系関数を使うべき判断ポイント
バイト系関数(LEFTB/RIGHTB/MIDB/LENB)を選ぶ基準は、次の3点で判断できます。
- 入出力のシステムがバイト単位で桁数を指定している
- 全角半角が混在するデータを扱っている
- 固定長フォーマットのファイルを読み書きする必要がある
逆に、社内の集計シートやダッシュボードのように「文字数で区切れれば十分」という場面は、MID系のほうがシンプルで読みやすいですよ。
よくあるエラーと対処法
MIDB関数でハマりやすいポイントを3つまとめました。エラーの原因と対策をセットで覚えておくと、現場で詰まりにくくなりますよ。
“#VALUE!” エラー
開始バイトに0以下を指定したときや、バイト数に負の数を指定したときに出ます。たとえば =MIDB("ABCDE", 0, 3) や =MIDB("ABCDE", 2, -1) のようなケースですね。計算式の結果がマイナスになっていた、というミスがよくあります。MAX関数で下限を固定するのがおすすめです。
=MIDB(A2, MAX(B2, 1), MAX(C2, 0))
これで、B2やC2が想定外の値になっても安全に動きますよ。
想定より短い結果が返る
「10バイトのつもりで指定したのに9文字しか返ってこない」というときは、開始位置が全角の途中か、末尾が全角の途中で切れているケースが多いです。先ほど解説したとおり、全角の途中にバイト境界が来ると、そのバイトぶんは切り捨てられます。
制限いっぱいまで詰めたい場合は、LENB(対象文字列の総バイト数を返す関数)と組み合わせて、切り捨てが発生していないかを確認しておきましょう。
=LENB(MIDB(A2, 3, 10)) → 9 なら、開始か末尾のどちらかが全角の途中だった
結果が空になる
=MIDB("あいうえお", 2, 1) のように、開始バイトが全角の途中で、バイト数も1だけのときは、結果が空(空文字)になります。「数式は合っているのに何も返ってこない」ときは、開始位置とバイト数が全角のバイト境界にきれいに乗っているかを確認してみてくださいね。
レイアウトが全角中心なら、開始バイトを奇数(全角の先頭バイト)に、バイト数を偶数にそろえると安定しますよ。
まとめ
スプレッドシートのMIDB関数は、バイト数を基準に文字列の任意位置から切り出せる、固定長データの中間フィールド抽出にピッタリの関数です。最後に要点を整理しておきましょう。
- 構文は
=MIDB(文字列, 開始バイト, バイト数)の3引数。開始バイトは1始まり - 全角=2バイト、半角=1バイトとしてカウントする
- 全角文字の途中に開始位置や終端が来る場合、そのバイトは切り捨てられる
- MIDは文字数、MIDBはバイト数。固定長ファイルの中間フィールドはMIDB一択
- LEFTB/RIGHTB/LENBと組み合わせると、フィールド分解が一発で決まる
- #VALUE! は開始バイト0以下や負のバイト数指定、結果が空になるのは全角境界で指定がずれたパターン
まずは手元の固定長テキストを、=MIDB(A2, 9, 20) のような形でレイアウト定義書どおりに分解してみてください。基幹システムからのデータ取り込みや電文解析の前処理が、一段ラクになりますよ。
