CF精算表ワークフロー構築 --- 取引モジュールと精算表のパイプライン
朝、手元に散らばったスクリプト群を眺めていた。返済予定表を作るスクリプト、仕訳を生成するスクリプト、年次推移表を読み取るスクリプト、CF精算表を書き出すスクリプト。それぞれ単体では動くが、つながっていない。口頭のヒアリングから最終的なCF精算表に至るまで、人間が手動でファイルを渡してリレーしている。このリレーを1本のパイプラインに溶接する --- それが今日の仕事だった。
全体像: 口頭からCF精算表までの5ステップ
まずMermaidでワークフロー全体を図にした。パイプラインは5段のバケツリレーになっている。
- 口頭 / 書籍 --- 取引の事実関係を聞き取るか、実務書から論点を抽出する
- 取引モジュール --- Google Sheetsに返済予定表や出資タイムラインを組む
- 仕訳生成 --- モジュールから会計ソフトA向けの仕訳CSVを吐く
- 年次推移表 --- 会計ソフトAのTBデータ4年度分をシートに並べる
- CF精算表 --- 年次推移表を食わせて、TB+CFWSシートを一括生成する
ポイントは、全ステップでGoogle Sheets版とExcel版の両方を出力する方針を固めたこと。スプレッドシートは共有と閲覧に便利だが、数式の検証やピボットはExcelのほうが手早い。どちらか片方に寄せると、もう片方が必要になった瞬間に手戻りが走る。
CF精算表の複数年度一括生成
最初の設計: 年度別TBシート
当初は年度ごとにTBシートを分けていた。FY2022、FY2023、FY2024、FY2025の4枚。しかしユーザーから「年度ごとにシートを切り替えるのが面倒。1枚の年次推移表として横に並べたい」と要望が出た。
TBシートを4枚削除して、年次推移表シートを1枚追加した。列方向に年度が並ぶので、前年比較が視線の横移動だけで済む。CF精算表側の参照式も、シート間参照からシート内参照に変わって短くなった。
返済予定表データのシートコピー
返済予定表の数式をCF精算表ブックにコピーする必要があった。値貼り付けだと数式が消える。openpyxlの copy_worksheet で数式を保持したままシートごとコピーした。
ただし copy_worksheet はシート内の名前付き範囲までは複製しない。返済予定表側で名前付き範囲を使っていた箇所は、コピー後にセル参照で書き直した。
中間テーブルの転置: 横持ちから縦持ちへ
CF精算表の調整列を組むとき、中間テーブルが必要になった。年次推移表は横持ち(列=年度)だが、調整列のSUMIFS関数は縦持ち(行=年度)のほうが書きやすい。
最初は横持ちのまま力技でINDEX/MATCHを組んでいた。列番号を動的に計算する部分が複雑になり、式が横に長くなって画面に収まらなくなった。途中で「転置してしまえばSUMIFSだけで済む」と気づき、中間テーブルを縦持ちレイアウトに作り直した。
調整列の数式設計
調整列の数式は二転三転した。
第1案: SUMPRODUCT
=SUMPRODUCT((中間!$A:$A=B$3)*(中間!$B:$B=$A5)*中間!$C:$C)
動くが、列全体を参照しているのでシートが大きくなると再計算が遅い。
第2案: SUMIFS + YEAR関数
=SUMIFS(中間!C:C, 中間!A:A, YEAR(B$3), 中間!B:B, $A5)
YEAR関数で年度を整数に変換することで、日付型と文字列型の不一致を回避した。SUMIFSはSUMPRODUCTより再計算が速い。最終的にこちらを採用した。
S列(合計列)の設計
合計列はSUMのみで構成し、INDEX/MATCHは入れなかった。合計列に複雑な関数が混ざると、行を追加したときに壊れやすい。調整列側にINDEX/MATCHを集約して、合計列は単純な足し算に徹する設計にした。
支払利息の2重表現
CF精算表には支払利息が2箇所に登場する。
- PL損益調整セクション --- 税引前当期純利益に加算(間接法の調整項目)
- 小計外の利息支払額 --- 利息の実際の現金支出
これは間接法CFの仕様どおりだが、初見では「同じ金額が2回出ている。二重計上では?」と見える。精算表上でコメントを付けて、なぜ2箇所に出るのかを注記した。
取引ライフサイクルモジュールの拡張
貸付金ライフサイクル
借入金の返済予定表モジュールが動いていたので、これを反転させて貸付金モジュールを作った。仕訳の借方と貸方をひっくり返す。
- 借入金: Dr 普通預金 / Cr 長期借入金 → 返済時 Dr 長期借入金・支払利息 / Cr 普通預金
- 貸付金: Dr 長期貸付金 / Cr 普通預金 → 回収時 Dr 普通預金 / Cr 長期貸付金・受取利息
会社名はクチヒゲ商事株式会社、貸付先はアゴヒゲ商事株式会社。テストデータだが名前が楽しいので作業が捗った。
資本政策(Cap Table)
出資タイムラインと持株比率を管理するモジュールを新規で組んだ。設立時の出資、増資、株式譲渡の3イベントに対応する。各イベントで持株比率を自動再計算するシートを作った。
ここでもExcel版とスプレッドシート版の両方を出力するスクリプトを書いた。gen_cap_table_ss.sh と gen_cap_table_xlsx.py の2本。
シート並び順とタブ色
並び順: アウトプットを左、インプットを右
シートの並び順で迷った。最初はインプット(年次推移表)を左に、アウトプット(CF精算表)を右に並べていた。しかし参照を追いかけるときに「右から左」へ視線が逆走するのが気持ち悪い。
投資銀行のモデリング規約では「Output → Input」の順(左から右)が標準だと思い出し、並び順を反転した。CF精算表(アウトプット)を左端に置き、年次推移表・返済予定表(インプット)を右側に並べた。数式の参照方向が左から右に揃い、Ctrl+[で参照元を追うときに自然な方向に飛ぶようになった。
タブ色
全シートのタブ色をネイビーブルー(#333399)に統一した。CF精算表ブック内のシートが一目で区別できる。openpyxlでは ws.sheet_properties.tabColor にカラーコードを渡すだけで済んだ。
スキルとワークフローの整理
cf-lifecycle-journal スキル
パイプライン全体を1つのスキルとして文書化した。cf-lifecycle-journal という名前で、口頭ヒアリングからCF精算表出力までの手順をステップバイステップで記述している。
各ステップの末尾に /ib-format スキルの実行を必須化した。投資銀行カラーコーディング(青=ハードコード、黒=数式、緑=他シート参照)を全ステップの出力に適用する。色が統一されていると、後から他人がファイルを開いたときに「この数字は変えてよいのか」が一瞬で判る。
cf-multi-year-worksheet スラッシュコマンド
複数年度のCF精算表を一括生成するコマンドを /cf-multi-year-worksheet として切り出した。年次推移表スプレッドシートのIDを渡すと、4年度分のTB+CFWSシートを生成してExcelとスプレッドシートの両方に書き出す。
Google Sheets版の出力スクリプト gen_cfws_multi_year_ss.sh / gen_cfws_multi_year_ss.py を新規で作った。Excel版は既存の gen_cfws_multi_year.py をそのまま使う。
出力先と命名規則
出力先はDropboxの 01_キャッシュフロー計算書関連/ 配下に統一した。
01_キャッシュフロー計算書関連/
├── ライフサイクル_借入金/
├── ライフサイクル_貸付金/
├── ライフサイクル_借入金_貸付金/ ← 複合パターン
└── ...
スプレッドシートの命名は CF_精算表_{ライフサイクル名}。Google Drive上の「01_キャッシュフロー計算書関連」フォルダにもSSを整理した。
試行錯誤の記録
今日の作業で一番時間を食ったのは中間テーブルの設計だった。横持ちのまま無理にINDEX/MATCHを組んでいた時間が約1時間。縦持ちに転置した瞬間にSUMIFSで一発になり、「最初からやれ」と自分に言いたくなった。
調整列のSUMPRODUCTからSUMIFSへの変更も、動いているものを壊すのが怖くて後回しにしていた。しかしシートが30行を超えたあたりで再計算のもたつきが目に見えて出始め、覚悟を決めて書き換えた。結果、体感で2秒ほど速くなった。
スキル分離の議論では、「1つの巨大なスキルにまとめるか、ステップごとに小さなスキルに分けるか」で迷った。最終的には、パイプライン全体を俯瞰する cf-lifecycle-journal と、個別ステップを実行する小さなスラッシュコマンド群に分離する構成にした。全体図を持つスキルがオーケストレーターとして機能し、各コマンドは単体でも呼べる。
今日の成果物
| 種類 | ファイル | 用途 |
|---|---|---|
| スキル | cf-lifecycle-journal | パイプライン全体の手順書 |
| コマンド | /cf-multi-year-worksheet | 複数年度CF精算表の一括生成 |
| スクリプト | gen_cfws_multi_year_ss.sh / .py | SS版CF精算表出力 |
| スクリプト | gen_cap_table_ss.sh / .py | SS版Cap Table出力 |
| モジュール | 貸付金ライフサイクル | 借入金の反転パターン |
| モジュール | 資本政策(Cap Table) | 出資タイムライン + 持株比率 |
振り返り
パイプラインの各ステップが独立したスクリプトとして存在していた状態から、1本の流れとしてつなぎ直した。手で渡していたファイルのリレーが消えて、コマンド1つで口頭メモからCF精算表まで到達できるようになった。
中間テーブルの横持ち→縦持ちの判断を1時間ためらったのは反省点だ。「動いている数式を壊したくない」という心理が判断を鈍らせた。動いていても読めない数式は、動いていないのと同じだと改めて思い知った。