「システムから出力したデータを、バイト数で区切って取り出したい」と思ったことはありませんか? 全角と半角が混在するデータを正確に分割するのは、手作業だとかなり大変ですよね。
位置を間違えると文字化けしたり、余分な文字が混じったりして、思うようにいきません。
そんなときに活躍するのがMIDB関数です。この記事では基本の書き方から固定長データの処理パターンまで、まとめて紹介します。
NOTE
MIDB関数はExcel 2007以降のすべてのバージョンで使用できます。
この記事は次のような人におすすめ
- バイト数を指定して文字列の途中を取り出したい
- 固定長データの分割やシステム連携データの処理をしたい
- MID関数との違いを知りたい
MIDB関数とは?
MIDB関数は、文字列の指定した位置から指定したバイト数分の文字を取り出す関数です。
読み方は「ミッド・ビー関数」です。MID関数の「B」はByte(バイト)を意味しています。文字列の中間部分をバイト単位で取り出すイメージです。
MID関数が文字数で数えるのに対して、MIDB関数はバイト数で数えるのが最大の違いです。全角文字は2バイト、半角文字は1バイトとしてカウントされます。
たとえばセルに「ABC商品」と入っている場合を考えます。4バイト目から4バイトを取り出すと「C商」が得られます。半角の「C」が1バイト、全角の「商」が2バイトです。4バイト指定なので「商」の次のバイトまで含まれます(後述する端数処理を参照)。
固定長データの処理やシステム連携データの分割など、バイト単位でデータを扱う場面で力を発揮します。
MIDB関数の書き方(構文と引数)
基本構文
=MIDB(文字列, 開始位置, バイト数)
引数の説明
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 文字列 | 必須 | 取り出し元の文字列またはセル参照 |
| 開始位置 | 必須 | 取り出しを始めるバイト位置(先頭が1) |
| バイト数 | 必須 | 取り出すバイト数 |
3つの引数はすべて必須です。省略するとエラーになります。
開始位置のカウント方法
開始位置はバイト単位で指定します。先頭の文字が「1」です。全角文字は2バイト分を占めるため、たとえば「東京都」の「京」の開始位置は3バイト目です。
TIP
開始位置が文字列の総バイト数を超えると、空文字(””)が返ります。エラーにはなりません。
バイト数のポイント
バイト数に指定した値が残りのバイト数より多い場合、末尾までの文字がそのまま返ります。エラーにはなりません。
全角文字の途中(端数)を指定した場合
全角文字は2バイトです。開始位置やバイト数が全角文字の途中にあたる場合、Excelは自動的にその文字全体を含めるように調整します。たとえば「東京都」に対して2バイト目から取り出すと、「東」の2バイト目からになりますが、結果は「東」全体が含まれます。
MIDB関数の基本的な使い方
半角文字だけの文字列から取り出す
=MIDB("ABCDE", 2, 3)
結果: BCD
半角文字だけの場合は、MID関数と同じ結果になります。1文字=1バイトなので指定方法も同じです。
全角文字を含む文字列から取り出す
A1セルに「ABC商品コード」が入っている場合を考えます。
=MIDB(A1, 4, 4)
結果: 商品
4バイト目は全角「商」の先頭です。4バイト分なので、全角2文字(4バイト)の「商品」が得られます。
MID関数と結果を比較する
「ましゅかぶろぐ」から「ぶろぐ」を取り出す場合を比べます。
=MID("ましゅかぶろぐ", 5, 3)
=MIDB("ましゅかぶろぐ", 9, 6)
どちらも結果は「ぶろぐ」です。MID関数は5文字目から3文字、MIDB関数は9バイト目から6バイトを指定しています。全角文字だけの文字列では、MIDB関数の開始位置とバイト数はMID関数の2倍になります。
TIP
全角と半角が混在しないデータならMID関数のほうがシンプルです。MIDB関数は「バイト数で区切る必要がある場面」に限定して使うのがおすすめです。
MIDB関数の実務活用パターン
パターン1: 固定長データから項目を分割する
基幹システムから出力された固定長テキストデータを分割する場面です。1行が「社員番号(半角6バイト)+氏名(全角10バイト)+部署(全角8バイト)」の構造になっているとします。
A列にデータ「A12345田中太郎 営業一部 」が入っている場合を考えます。
社員番号を取り出します。
=MIDB(A2, 1, 6)
結果: A12345
氏名を取り出します。
=MIDB(A2, 7, 10)
結果: 田中太郎 (末尾にスペースが含まれる場合はTRIM関数で除去)
部署を取り出します。
=MIDB(A2, 17, 8)
結果: 営業一部
このように、固定長データの仕様書にあるバイト位置をそのまま引数に指定できます。
パターン2: 半角カナ混在データから特定フィールドを取り出す
銀行振込データなどで半角カタカナが使われているケースです。A列に「タナカ タロウ 0012345」のようなデータがあるとします。口座名義が半角カナ12バイト、口座番号が半角7バイトの構造です。
口座番号を取り出します。
=MIDB(A2, 13, 7)
結果: 0012345
半角カタカナは1バイトとしてカウントされるため、バイト位置の計算が直感的です。
パターン3: LENB関数と組み合わせて途中から末尾まで取り出す
固定長データの先頭部分(ヘッダー)を除いて、残り全部を取り出したい場合です。A列にデータが入っているとします。
先頭10バイトを飛ばして残りを取り出します。
=MIDB(A2, 11, LENB(A2))
LENB関数で全体のバイト数を指定すると、11バイト目から末尾までを取り出せます。バイト数が実際の残りより多くてもエラーにはなりません。
パターン4: TRIM関数と組み合わせてスペースを除去する
固定長データでは項目の末尾に空白が詰められていることが多いです。取り出した後にTRIM関数で整形します。
=TRIM(MIDB(A2, 7, 10))
MIDB関数で取り出した結果の前後のスペースを除去できます。固定長データの処理では、MIDB + TRIMの組み合わせが定番です。
パターン5: VALUE関数と組み合わせて数値に変換する
固定長データから取り出した数字を計算に使いたい場合です。MIDB関数の結果は文字列なので、VALUE関数で数値に変換します。
=VALUE(MIDB(A2, 20, 8))
金額フィールド(20バイト目から8バイト)を数値として取り出せます。
よくあるエラーと対処法
| 症状 | 原因 | 対処法 |
|---|---|---|
| #VALUE! | 開始位置に0以下の値を指定した | 開始位置は1以上を指定する |
| #VALUE! | バイト数にマイナスの値を指定した | バイト数は0以上を指定する |
| 空文字が返る | 開始位置が文字列の総バイト数を超えている | 開始位置を確認する。LENB関数で総バイト数をチェック |
| 文字化けのような結果 | 全角文字の途中のバイトを指定した | 全角文字は2バイト単位で指定する。開始位置・バイト数を偶数で調整 |
| 数値にならない | MIDB関数の結果は常に文字列 | VALUE関数で数値に変換する: =VALUE(MIDB(A2,20,8)) |
| #VALUE! | 引数が不足している | 3つの引数(文字列、開始位置、バイト数)をすべて指定しているか確認 |
NOTE
MIDB関数の結果は常に文字列です。数字を取り出した場合でも文字列として返ります。合計や比較に使うときは
=VALUE(MIDB(...))で数値に変換してください。
似た関数との違い・使い分け
MIDB関数とMID関数の違い
MIDB関数はバイト数でカウントし、MID関数は文字数でカウントします。
| 入力値 | MID関数(文字数) | MIDB関数(バイト数) |
|---|---|---|
| 全角文字「あ」 | 1文字 | 2バイト |
| 半角文字「A」 | 1文字 | 1バイト |
| 半角カタカナ「ア」 | 1文字 | 1バイト |
| 全角スペース「 」 | 1文字 | 2バイト |
| 半角スペース「 」 | 1文字 | 1バイト |
同じデータから同じ部分を取り出す場合でも、指定する数値が変わります。
=MID("ABC商品", 4, 2)
結果: 商品(4文字目から2文字)
=MIDB("ABC商品", 4, 4)
結果: 商品(4バイト目から4バイト)
通常はMID関数を使えば十分です。MIDB関数は以下の場面に限定して使うのがおすすめです。
- 固定長データの仕様書にバイト数で桁数が定義されている
- システム連携で半角・全角混在データをバイト単位で分割する
- 銀行振込データなど半角カナ混在のデータを処理する
バイト系関数ファミリーの使い分け
| 関数 | 文字数版 | バイト数版 | 用途 |
|---|---|---|---|
| 先頭から取り出す | LEFT | LEFTB | 先頭Nバイトを取り出す |
| 末尾から取り出す | RIGHT | RIGHTB | 末尾Nバイトを取り出す |
| 途中から取り出す | MID | MIDB | 任意の位置からバイト数で取り出す |
| 文字列の長さ | LEN | LENB | バイト数での文字列長を取得する |
迷ったときは、仕様書に「バイト」と書いてあればB付き関数、「文字」と書いてあればB無し関数を使うと覚えておけばOKです。
文字列操作関数との組み合わせ
MIDB関数は他の文字列関数と組み合わせることで活用の幅が広がります。
| 組み合わせ | 用途 | 例 |
|---|---|---|
| MIDB + LENB | 途中から末尾まで取り出す | バイト数にLENB(A2)を指定 |
| MIDB + TRIM | 固定長データの末尾スペース除去 | =TRIM(MIDB(A2,7,10)) |
| MIDB + VALUE | 取り出した数字を数値に変換 | =VALUE(MIDB(A2,20,8)) |
| MIDB + SUBSTITUTE | 不要な文字を除去してから処理 | パディング文字の除去 |
文字列の「バイト数を測る」のがLENB関数、「途中をバイト単位で取り出す」のがMIDB関数です。固定長データの処理ではこの2つをセットで使うのが基本パターンです。
まとめ
MIDB関数は文字列の途中からバイト数を指定して文字を取り出す関数です。
- 構文は
=MIDB(文字列, 開始位置, バイト数)の3つの必須引数 - 全角文字は2バイト、半角文字は1バイトとしてカウント
- 固定長データの仕様書にあるバイト位置をそのまま引数に指定できる
- 結果は常に文字列。数値として使うときはVALUE関数で変換
- 全角・半角が混在しないデータならMID関数のほうがシンプル
固定長データの分割やシステム連携データの処理で、ぜひ活用してみてください。
