投資銀行モデル書式の自動適用とCF精算表生成スキル
朝、財務モデルのExcelを開いて手作業でセルの色を塗り分けている自分に気づいた。青はハードコード値、黒は数式、緑は他シート参照。毎回同じ作業を繰り返している。これをClaude Codeのスキルにしてしまえば二度と手で塗らなくて済む。そこから一日が始まった。
/ib-format スキル: 投資銀行カラーコーディングの自動適用
書式ルール
投資銀行の財務モデルには暗黙の書式ルールがある。
| セルの中身 | フォント色 | 意味 |
|---|---|---|
| ハードコード値(手入力) | 青 | 前提条件。変えてよい数字 |
| 数式(同一シート内参照) | 黒 | 計算ロジック |
| 他シート参照の数式 | 緑 | 外部依存。参照先を追う必要あり |
これをExcelとGoogle Sheetsの両方に自動適用するスキルを作った。
数値書式の [Red] 除去
既存のExcelファイルに #,##0;[Red](#,##0) のような数値書式が設定されていた。マイナス値が強制的に赤になる書式だ。投資銀行モデルではフォント色に意味があるので、数値書式側で色を上書きされると困る。
修正内容は2つ。
[Red]を除去して#,##0;(#,##0)に変更(フォント色に従うようになる)- マイナス表記を
△から▲に変更(視認性向上)
Google Sheets API での書式適用
Excel側はopenpyxlで素直に実装できた。問題はGoogle Sheets API側だった。
batchUpdate の repeatCell リクエストでセル範囲にフォント色を適用する方式を採った。ここでバッチサイズの壁にぶつかった。
最初は全セルを1リクエストにまとめて送った。シートが大きいとAPIがタイムアウトする。セルごとに1リクエストにすると、今度はAPI呼び出し回数の上限に引っかかる。結局、100セルずつにチャンクして送る方式に落ち着いた。
# セルをチャンクに分割してbatchUpdate
BATCH_SIZE = 100
for i in range(0, len(requests), BATCH_SIZE):
chunk = requests[i:i + BATCH_SIZE]
service.spreadsheets().batchUpdate(
spreadsheetId=sheet_id,
body={"requests": chunk}
).execute()
gws認証の問題
Google Sheets APIへのアクセスには自前のCLIツール gws を使っている。Pythonスクリプトから直接Google APIを叩くのではなく、gws 経由でOAuth認証済みトークンを取得してAPIに渡す方式にした。認証フローを二重に持たなくて済む。
/cf-worksheet スキル: CF精算表の自動生成
何を作ったか
会計ソフトAから出力した合計残高試算表(TB)のExcelを入力として、間接法のキャッシュフロー精算表(CFWS)をopenpyxlで自動生成するスキル。
決算のたびにExcelで手作業していたCF精算表を、コマンド一発で生成できるようにした。
v1からv13まで13回のイテレーション
一発で完成したわけではない。v1で基本構造を組んでから、v13まで13回書き直した。主な改善の流れを振り返る。
構造の整理(v1-v5)
- I列(不要だった中間計算列)を削除
- P列(予備列)を削除
- J列の幅を18に統一
- 各CF区分の列範囲を制限した
- 営業CF: J-M列
- 投資CF: N列のみ
- 財務CF: O列のみ
列範囲の制限が地味に効いた。全区分が全列に値を持てる状態だと、どの列がどの区分か一目で判別できない。列を絞ることで、シートを開いた瞬間に構造が目に入るようになった。
見た目の調整(v6-v10)
- 合計行にグレー濃淡を適用しボールドに
- ズーム85%に設定(全体が一画面に収まる)
- H列にPL計上額チェックを移動
CFラベルマッピング(v11-v13)
cf-labels.json を作成した。BS科目からCFラベルへの対応表だ。
{
"売掛金": { "cf_label": "売上債権の増減額", "cf_category": "operating" },
"建物": { "cf_label": "有形固定資産の取得", "cf_category": "investing" },
"借入金": { "cf_label": "借入れによる収入", "cf_category": "financing" }
}
このマッピングがあると、TBの科目名を読んだ時点でCF精算表のどの行・どの列に値を配置するかが自動で決まる。手動で科目を分類する必要がなくなった。
TBシート特定ルール
会計ソフトAからエクスポートしたExcelファイルには複数シートが含まれることがある。TBシートを自動特定するルールを追加した。シート名に「残高試算表」「TB」「合計残高」のいずれかが含まれるシートを探す。見つからなければ最初のシートをTBとして扱う。
出力先の固定
生成したCF精算表の出力先をDropbox配下に固定した。ファイル名にはタイムスタンプを付与する。
~/Dropbox/会計/CFWS_2026-04-01_143022.xlsx
同じTBから何度生成しても上書きされない。過去の生成結果を比較できるようにした。
bashのクォーティング問題
開発中、Claude Codeからbashコマンドでスキルを呼び出す際にクォーティングが壊れる問題に何度かぶつかった。JSONの中にダブルクォートがあると、bash側のクォートと干渉する。ヒアドキュメントで回避した。
python cf_worksheet.py <<'EOF'
{"input": "path/to/tb.xlsx", "output_dir": "~/Dropbox/会計/"}
EOF
振り返り
朝の「手作業が面倒だ」から始めて、2つのスキルが形になった。/ib-formatは書式適用の5分を0秒にし、/cf-worksheetはCF精算表の2時間を10秒に縮めた。
13回のイテレーションは多いように見えるが、実際にシートを開いて「ここが見づらい」「この列は要らない」と気づくたびに直した結果だ。最初から完成形を設計しようとするより、生成結果を眺めながら削り込むほうが速かった。