【パワークエリ編】COBOL帳票データの不要行除去と一括結合
エクセルでCOBOL帳票や固定長データを整形したい方向けに、Excel関数・Power Query・MIDBなどを使って列分割、不要行除去、帳票データ変換を進める実務手順を扱います。VBAが使えない、マクロが禁止されている会社では、定期的なCOBOL帳票整形の代替手段としてPower Queryを検討できます。
💡 パワークエリが得意なこと・苦手なこと
本シリーズの完全版から不規則明細編までは、Excel関数(MIDB・INDEX・SMALL等)を使ったパイプライン方式でCOBOL帳票を正規化してきました。
「同じことをパワークエリでやればもっと簡単では?」と思う方もいるかもしれません。実際、パワークエリには関数では難しい強力な機能があります。しかし一方で、COBOL帳票の処理においてパワークエリには1つだけ決定的な壁が存在します。
この記事では、その壁の正体と越え方、そしてパワークエリが本当に威力を発揮する場面を整理します。
パワークエリにはMIDBに相当する関数がなく、これが最大の壁になります。ただし、自作関数で一度この壁を越えてしまえば、不要行の除去・ヘッダー紐付け・ファイル結合まで含めた全工程を関数パイプラインよりはるかに簡潔に処理できます。
⚠ 最初にして最大の壁:パワークエリにMIDBがない
COBOL帳票の整形で最も重要な処理は「固定長データからバイト位置を指定して切り出す」ことです。Excel関数ではMIDBがこの役割を担いますが、パワークエリ(M言語)にはバイト単位で文字列を切り出す関数が標準では存在しません。
M言語の Text.Middle は文字数ベースであり、「半角=1バイト、全角=2バイト」というCOBOL帳票の固定長ルールに対応していません。全角文字が含まれている帳票では、切り出し位置がずれてしまいます。
COBOL帳票の整形は、突き詰めると「どこからどこまでがどの項目か」をバイト位置で特定する作業です。この根幹の処理ができないということは、帳票を取り込んでも項目に分解できないことを意味します。パワークエリの他の機能がいくら優秀でも、ここが詰まるとすべてが止まります。
壁の越え方:M言語でMIDB相当の自作関数を作る
この壁は、M言語でバイト数を計算するカスタム関数を自作することで越えられます。1文字ずつバイト数を判定して位置を特定するロジックを一度書いてしまえば、以降はExcelのMIDBと同じ感覚で使えるようになります。
・M言語自体がExcel関数やVBAと比べて情報が少なく、学習コストが高い。
・バイト数の計算にはエンコーディング(Shift_JIS等)の知識が必要になる。
・パワークエリの「ノーコード・ローコード」という利点は、この部分では失われる。
ただし、この関数は一度作れば使い回しが効きます。最初の1回だけコードを書く必要がありますが、以降の帳票処理ではその関数を呼び出すだけで済みます。
💡 壁を越えた後:関数パイプラインより簡潔に処理できる
MIDB相当の自作関数を一度用意してしまえば、パワークエリはCOBOL帳票の整形において関数パイプラインよりもはるかに簡潔で効率的な手段になります。その理由を具体的に見ていきます。
1. 不要行の除去が一瞬で終わる
関数パイプラインでは、各行にフラグを立てて明細行を判定し、抽出シートで取り出す ― という複数ステップが必要でした。パワークエリなら、列のフィルター(▼)で不要行のパターンを除外するだけです。「===」で始まる行、「---」で始まる行、空白行…チェックを外すだけで、何万行のゴミ行も一瞬で消えます。
関数版では「貼付シートにフラグ列を作る → 抽出シートでSMALL+INDEXで明細行だけを取り出す」という工程が必要でしたが、パワークエリではフィルター操作だけで同じ結果が得られます。
2. ヘッダー紐付け(フィルダウン)が標準機能で完結する
関数パイプラインで最も難易度が高かった「親情報のフィルダウン」も、パワークエリなら標準の「フィル」→「下方向」機能で一発です。
ヘッダー行の値が入っている列を選択し、[変換] → [フィル] → [下方向] を押すだけで、空白セルに直上の値が自動的に埋まります。関数版で =IF(MIDB(B2,1,2)="■", B2, C1) と書いていた処理が、クリック操作だけで完了します。
3. MIDB分解がカスタム列の追加だけで済む
自作したMIDB関数をパワークエリの「カスタム列の追加」で呼び出せば、バイト位置指定の切り出しも1ステップで完了します。しかも、関数版のように「貼付シート」と「抽出シート」を分ける必要がなく、1つのクエリの中で不要行除去 → フィルダウン → MIDB分解 → 型変換までを一気通貫で処理できます。
4. 複数ファイルのフォルダ一括結合が可能
これは関数では絶対にできないパワークエリ独自の強みです。[データ] → [データの取得] → [フォルダーから] でフォルダを指定すると、何十個・何百個のテキストファイルが縦に結合された状態で取り込まれます。
上記の不要行除去・フィルダウン・MIDB分解をクエリに設定しておけば、来月新しいファイルをフォルダに入れて「更新」ボタンを押すだけで、すべての整形処理が全自動で完了します。
関数版では「貼付シート(フラグ+フィルダウン)→ 抽出シート(SMALL+INDEX)→ 分解列(MIDB)」と複数シートに数式を配置する設計が必要でした。パワークエリなら、1つのクエリ内で上から順にステップを積むだけで同じ結果が得られます。シート設計の手間がなくなり、処理の流れも視覚的に追いやすくなります。
パワークエリ版のパイプライン
関数版のパイプラインと比べると、フラグ列の設計や抽出シートの構築が不要になり、全体の工程がシンプルになっていることがわかります。さらにフォルダ一括取込により、複数ファイルの処理も同じクエリ内で完結します。
⚠ ただし「最初の壁」を越えるハードルは高い
ここまでの説明で、壁を越えた後のパワークエリの優位性は明らかです。しかし、正直に言えばその最初の壁を越えること自体が簡単ではありません。
M言語でMIDB相当の関数を自作するには、M言語の文法、文字列操作関数、エンコーディングの仕組みについての理解が必要です。Excel関数やVBAの経験がある人でも、M言語は記法が独特で情報も少ないため、最初は戸惑うことが多いでしょう。
また、自作関数の処理速度は標準関数より遅くなる傾向があり、数十万行の帳票ではパフォーマンスに注意が必要です。
・単発の帳票処理(1回きり、または年に数回) → 関数パイプラインの方が手早い。自作関数を作るコストに見合わない。
・定期的な帳票処理(毎月・毎週、複数ファイル) → パワークエリの自動化の恩恵が大きい。自作関数を一度作る投資に十分見合う。
・M言語に不慣れ → まず関数パイプラインで処理を確立し、余裕があればパワークエリへの移行を検討する。
🎯 結論:関数とパワークエリの使い分け
パワークエリにはMIDBに相当するバイト単位の切り出し関数がなく、これがCOBOL帳票処理における最大の壁です。しかし、M言語で自作関数を一度作ってしまえば、不要行除去・フィルダウン・MIDB分解・複数ファイル結合までを1つのクエリ内で完結でき、関数パイプラインよりはるかに簡潔な処理が可能になります。
最初の壁を越えるコストをかけるかどうかは、処理の頻度と規模で判断してください。定期的に大量の帳票を処理する業務であれば、パワークエリへの移行は十分に元が取れます。単発の処理であれば、本シリーズの関数パイプラインで対応するのが現実的です。マクロ禁止で困ったときも、まず処理の頻度とファイル数から代替手段を選ぶと判断しやすくなります。
パワークエリが有利な場面
定期的・反復的な帳票処理 ― 「更新」ボタンで全自動化できる。
複数ファイルの一括結合 ― フォルダ指定だけで数百ファイルを統合。関数では不可能。
不要行の除去 ― フィルター操作だけで完了。フラグ列の設計が不要。
フィルダウン ― 標準機能でクリック一発。数式を書く必要がない。
関数パイプラインが有利な場面
単発・少頻度の帳票処理 ― 自作関数を作るコストをかけずにすぐ処理できる。
MIDBをそのまま使える安心感 ― バイト位置の切り出しが標準関数で確実に動く。
M言語の学習コストを避けたい場合 ― Excel関数の知識だけで完結する。
M言語に慣れていない方は、まず本シリーズの関数パイプライン(COBOL固定長データの切り出しと整形~不規則明細編)で処理の考え方を身につけることをお勧めします。パイプラインの設計思想(フラグ → フィルダウン → 抽出 → 分解)は、パワークエリに移行しても全く同じ考え方が使えます。関数で処理の流れを理解してからパワークエリに移行すると、何をどの順序で処理すべきかが明確なため、M言語の習得もスムーズになります。
【完全版】MIDB切り出し・浄化・型変換 … 固定長データの基本的な切り出しと型変換。
【応用編】不要行の除外と横展開 … ROWフラグによる行フィルタリング。
【超絶技巧編】ヘッダー紐付け・フィルダウン … 親情報のフィルダウンとMIDB分解パイプライン。
【不規則明細・完結編】行数バラバラの正規化 … 不規則明細とマルチラインレコード。
【パワークエリ編】不要行除去と一括結合(本ページ) … MIDBの壁と越えた後の優位性。関数との使い分け。