COBOL固定長データの切り出しと整形(MIDB+TRIM 基本編)
エクセルでCOBOL帳票や固定長データを整形したい方向けに、Excel関数・Power Query・MIDBなどを使って列分割、不要行除去、帳票データ変換を進める実務手順を扱います。
この記事の内容
💡 やりたいこと
COBOL等の基幹システムから出力された固定長テキストデータを、Excelの標準関数だけで「使えるデータ」に変換します。
基本は MIDB で切り出して、TRIM で余白を取る だけです。数値や日付が必要なときだけ VALUE・DATE・DATEVALUE を追加します。
【2】レイアウト定義(サンプル)
この記事では以下の固定長レイアウト(1行=57バイト)を使います。和暦・西暦の両方の日付フィールドが含まれています。
| 項目 | 開始バイト | バイト数 | 内容 |
|---|---|---|---|
| 顧客番号 | 1 | 7 | 半角数字 |
| 会社名 | 8 | 20 | 全角文字+半角スペース埋め |
| 売上金額 | 28 | 10 | 半角数字(ゼロ埋め) |
| (空き) | 38 | 2 | 半角スペース |
| 和暦日付 | 40 | 8 | N-YYMMDD(元号コード+年月日) |
| (空き) | 48 | 2 | 半角スペース |
| 西暦日付 | 50 | 8 | YYYYMMDD |
MID は「文字数」で数えますが、MIDB は「バイト数」で数えます(全角=2バイト、半角=1バイト)。固定長データのレイアウトはバイト単位で定義されているため、必ず MIDB を使います。
【3】サンプルデータ
コピーボタンを押して、Excelの A1 セルに貼り付けてください。3行が A1:A3 に入ります。1つのデータに和暦・西暦の両方が入っているので、すべての数式をこのデータで試せます。
サンプルデータ(A1:A3 に貼り付け)
【4】STEP 1:文字列の切り出しと余白除去(MIDB+TRIM)
固定長データは指定バイト数に満たない部分を半角スペースで埋めています。MIDB で切り出した後 TRIM で包めば、この余白がきれいに消えます。
数式(B1〜D1 に入力し、下方向へコピー)
B1:顧客番号
C1:会社名
D1:売上金額(数値に変換)
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:取引日(和暦→日付)
SWITCH は MIDB が返す文字列 "3" をそのまま比較できるため、*1 で数値に変換する必要がありません。コードが連番でも自由にマッピングできます。
数式② IF版(Excel 2019 以前でも使える)
SWITCH が使えない環境では、IF のネストで同じことができます。
E1:取引日(和暦→日付)IF版
数式の動きを順番に見てみる(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 |
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:取引日(西暦→日付)
結果イメージ(F列)
| 西暦データ | F(変換後) |
|---|---|
| 20260318 | 2026/03/18 |
| 19980115 | 1998/01/15 |
| 20251201 | 2025/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
数式をもっと見やすくしたい場合
同じ MIDB を何度も書くのが気になる場合は、LET 関数を使って一度変数に入れる方法があります。詳しくは LET関数で固定長データの数式を整理する を参照してください。