COBOL固定長データの切り出しと整形(MIDB+TRIM 基本編)

エクセルでCOBOL帳票や固定長データを整形したい方向けに、Excel関数・Power Query・MIDBなどを使って列分割、不要行除去、帳票データ変換を進める実務手順を扱います。

💡 やりたいこと

COBOL等の基幹システムから出力された固定長テキストデータを、Excelの標準関数だけで「使えるデータ」に変換します。

基本は MIDB で切り出して、TRIM で余白を取る だけです。数値や日付が必要なときだけ VALUE・DATE・DATEVALUE を追加します。

【処理前】A1セルの固定長データ 1234567株式会社エクセル商事0000150000 3-531215 20260318 【処理後】 B1: 1234567 C1: 株式会社エクセル商事 D1: 150000(数値) E1: 1978/12/15(和暦→日付) F1: 2026/03/18(西暦→日付)

【2】レイアウト定義(サンプル)

この記事では以下の固定長レイアウト(1行=57バイト)を使います。和暦・西暦の両方の日付フィールドが含まれています。

項目 開始バイト バイト数 内容
顧客番号17半角数字
会社名820全角文字+半角スペース埋め
売上金額2810半角数字(ゼロ埋め)
(空き)382半角スペース
和暦日付408N-YYMMDD(元号コード+年月日)
(空き)482半角スペース
西暦日付508YYYYMMDD
MID と MIDB の違い
MID は「文字数」で数えますが、MIDB は「バイト数」で数えます(全角=2バイト、半角=1バイト)。固定長データのレイアウトはバイト単位で定義されているため、必ず MIDB を使います。

【3】サンプルデータ

コピーボタンを押して、Excelの A1 セルに貼り付けてください。3行が A1:A3 に入ります。1つのデータに和暦・西暦の両方が入っているので、すべての数式をこのデータで試せます。

サンプルデータ(A1:A3 に貼り付け)

1234567株式会社エクセル商事0000150000 3-531215 20260318 9876543山田商店 0000085000 4-100115 19980115 0012345鈴木電機工業 0003200000 5-070401 20251201

【4】STEP 1:文字列の切り出しと余白除去(MIDB+TRIM)

固定長データは指定バイト数に満たない部分を半角スペースで埋めています。MIDB で切り出した後 TRIM で包めば、この余白がきれいに消えます。

数式(B1〜D1 に入力し、下方向へコピー)

B1:顧客番号

=TRIM(MIDB(A1,1,7))

C1:会社名

=TRIM(MIDB(A1,8,20))

D1:売上金額(数値に変換)

=VALUE(TRIM(MIDB(A1,28,10)))
VALUE の付け忘れに注意
VALUE を付けると "0000150000" → 数値 150000 に変換されます。顧客番号のように先頭ゼロを残したい項目には VALUE を付けないでください。

結果イメージ

B(顧客番号)C(会社名)D(売上金額)
1234567株式会社エクセル商事150000
9876543山田商店85000
0012345鈴木電機工業3200000

【5】STEP 2:和暦日付の変換(元号コード+YYMMDD)

「3-531215」のように元号コード(1桁)+ハイフン+年月日(6桁)=8バイトの日付を変換します。元号コードから元号名を組み立て、DATEVALUE で日付に変換します。

元号コード対応表

コード元号データ例意味西暦
1明治1-450101明治45年1月1日1912/01/01
2大正2-010730大正1年7月30日1912/07/30
3昭和3-531215昭和53年12月15日1978/12/15
4平成4-100115平成10年1月15日1998/01/15
5令和5-070401令和7年4月1日2025/04/01
元号コードはシステム依存
元号コードの割り当てはシステムによって異なります。実際のデータに合わせて SWITCH や IF の中身を変更してください。

バイト位置の確認

和暦日付フィールドは40バイト目から8バイトです。すべて MIDB で直接切り出します。

部品数式例(1行目)
元号コード(1バイト)MIDB(A1,40,1)3
ハイフン(1バイト)—(スキップ)-
年(2バイト)MIDB(A1,42,2)53
月(2バイト)MIDB(A1,44,2)12
日(2バイト)MIDB(A1,46,2)15

数式① SWITCH版(Excel 2021 / Microsoft 365 以降)

E1:取引日(和暦→日付)

=DATEVALUE(SWITCH(MIDB(A1,40,1),"1","明治","2","大正","3","昭和","4","平成","5","令和")&MIDB(A1,42,2)&"年"&MIDB(A1,44,2)&"月"&MIDB(A1,46,2)&"日")
SWITCH のメリット
SWITCH は MIDB が返す文字列 "3" をそのまま比較できるため、*1 で数値に変換する必要がありません。コードが連番でも自由にマッピングできます。

数式② IF版(Excel 2019 以前でも使える)

SWITCH が使えない環境では、IF のネストで同じことができます。

E1:取引日(和暦→日付)IF版

=DATEVALUE(IF(MIDB(A1,40,1)="1","明治",IF(MIDB(A1,40,1)="2","大正",IF(MIDB(A1,40,1)="3","昭和",IF(MIDB(A1,40,1)="4","平成",IF(MIDB(A1,40,1)="5","令和","")))))&MIDB(A1,42,2)&"年"&MIDB(A1,44,2)&"月"&MIDB(A1,46,2)&"日")

数式の動きを順番に見てみる(1行目の場合)

順番処理結果
MIDB(A1,40,1) → 元号コードを取得 "3"
SWITCH("3", "1","明治", "2","大正", "3","昭和", …) → 元号名を選択 昭和
"昭和" & "53" & "年" & "12" & "月" & "15" & "日" → 和暦文字列を組み立て 昭和53年12月15日
DATEVALUE("昭和53年12月15日") → シリアル値に変換 28839
表示形式を「日付」にする 1978/12/15

結果イメージ(E列)

和暦データE(変換後)
3-531215(昭和53年12月15日)1978/12/15
4-100115(平成10年1月15日)1998/01/15
5-070401(令和7年4月1日)2025/04/01
日本語版Excel限定
DATEVALUE が「昭和53年12月15日」のような和暦文字列を認識するのは日本語版 Excel です。英語版では #VALUE! エラーになります。

【6】STEP 3:西暦日付の変換(YYYYMMDD)

西暦8桁(例: 20260318)の変換はシンプルです。MIDB で年・月・日を直接取り出して DATE 関数に渡します。

バイト位置の確認

部品数式例(1行目)
年(4バイト)MIDB(A1,50,4)2026
月(2バイト)MIDB(A1,54,2)03
日(2バイト)MIDB(A1,56,2)18

数式

F1:取引日(西暦→日付)

=DATE(MIDB(A1,50,4),MIDB(A1,54,2),MIDB(A1,56,2))

結果イメージ(F列)

西暦データF(変換後)
202603182026/03/18
199801151998/01/15
202512012025/12/01
シリアル値が表示される場合
E列・F列に数値(シリアル値)が表示される場合は、セルの表示形式を「日付」に変更してください。セルを右クリック → セルの書式設定 → 表示形式 → 日付。

【7】全体の結果イメージ

B1〜F1 に数式を入れて下方向へコピーすると、以下のようになります。

B(顧客番号) C(会社名) D(売上金額) E(和暦→日付) F(西暦→日付)
1234567 株式会社エクセル商事 150000 1978/12/15 2026/03/18
9876543 山田商店 85000 1998/01/15 1998/01/15
0012345 鈴木電機工業 3200000 2025/04/01 2025/12/01

📝 まとめ:数式の使い分け

項目の種類数式
文字列(会社名・コード等) =TRIM(MIDB(A1, 開始, バイト数))
数値(金額・数量等) =VALUE(TRIM(MIDB(A1, 開始, バイト数)))
西暦日付(YYYYMMDD) =DATE(MIDB(A1,開始,4), MIDB(A1,開始+4,2), MIDB(A1,開始+6,2))
和暦日付(N-YYMMDD)Excel 2021〜 =DATEVALUE(SWITCH(MIDB(…),"コード","元号",…)&MIDB(…)&"年"&MIDB(…)&"月"&MIDB(…)&"日")
和暦日付(N-YYMMDD)Excel 2019以前 =DATEVALUE(IF(MIDB(…)="コード","元号",IF(…))&MIDB(…)&"年"&MIDB(…)&"月"&MIDB(…)&"日")

【9】補足

CLEAN 関数は必要?

通常は不要です。CLEAN は印刷できない制御文字(改行コード・NULL等)を除去する関数ですが、一般的な固定長データに制御文字が混入していることはまれです。FTP転送やターミナルからのコピーで文字化けが起きた場合にだけ =TRIM(CLEAN(MIDB(...))) としてください。まずは TRIM だけで試して、問題があれば追加する方針で十分です。

TRIM で消えない空白がある場合

TRIM が除去するのは半角スペース(文字コード 32)だけです。全角スペースが混ざっている場合は SUBSTITUTE で先に置換してください。

全角スペースを除去してからTRIM

=TRIM(SUBSTITUTE(MIDB(A1,8,20)," ",""))

数式をもっと見やすくしたい場合

同じ MIDB を何度も書くのが気になる場合は、LET 関数を使って一度変数に入れる方法があります。詳しくは LET関数で固定長データの数式を整理する を参照してください。