開発eurekapu-nuxt4メモ

投資銀行スタイルのExcel書式設定をPythonで自動適用できるか検証した

キャッシュフローコンテンツのExcel生成パイプラインでIBフォーマットの色分けを走らせてみて、ふと気づいた。この処理、対象ファイルを選ばないのでは。手元で検証した結果と、そこから浮かんだExcel演習シートの構想を書き残す。


きっかけ: IBフォーマットの色分けルール

投資銀行スタイルの財務モデルでは、セルのフォント色で「データの出自」を一瞬で伝える:

フォント色意味
同一シート内で完結する計算式
他シートから参照している数式
ハードコード値(直接入力された数値)

CFWSパイプラインでこの色分けを自動適用していたが、「これ、既存のExcelファイルにも後付けで塗れないか?」という疑問が浮かんだ。


openpyxlで安全にフォント色だけ変える

結論: セルの値・数式・書式の大部分を壊さずに、フォント色だけ差し替えられる。

判定ロジックの骨格はこれだけ:

if '!' in cell.value:
    color = '008000'   # 緑: 他シート参照
elif isinstance(cell.value, (int, float)):
    color = '0000FF'   # 青: ハードコード数値
else:
    color = '000000'   # 黒: シート内計算

cell.font = cell.font.copy(color=Color(rgb=color))

cell.font.copy() で既存のフォント属性(サイズ、太字など)を保持したまま色だけ書き換える。数式文字列もリンクも値もそのまま残る。


IBモデルの設計思想が自動色分けと噛み合う理由

投資銀行のモデルは「セルをクリックすれば参照先が見える」という透明性を最優先する。だから以下のような機能を使わない:

  • INDIRECT関数 -- 参照先が文字列に隠れて追跡できない
  • 名前付き範囲 -- 定義を開かないと参照先がわからない
  • パワーピボット / 外部データ接続 -- セル上に数式が残らない
  • マクロ(VBA) -- コードを開かないと処理が見えない

つまり数式中の ! の有無だけで他シート参照を判定できるという前提が、IBモデルではほぼ成立する。判定ロジックが単純でも誤判定が起きにくい。

逆に言えば、INDIRECT経由で他シートを参照していたり、名前付き範囲で他シートのセルを指している場合は ! が数式文字列に現れないため黒に誤判定される。ただしIBの世界ではそもそもそういう設計をしない。


openpyxlの「開いて保存するだけで壊れるもの」

フォント色の変更自体は安全でも、openpyxlでファイルを開いて保存する行為自体に落とし穴がある:

  • ピボットテーブル
  • スパークライン
  • Power Query接続
  • 一部の条件付き書式
  • 配列数式(CSE)の扱いが不完全

自分たちのパイプラインで生成したExcelにはこれらが含まれないので問題ないが、他人が作った複雑なExcelに適用するならバックアップ必須


構想: IBフォーマット演習シート

この検証の延長で、フォント色・罫線・セルの色設定をショートカットで練習できるExcel演習シートを思いついた。

想定する中身:

  • 意図的に色がバラバラなセルを並べて、IBルールに沿って手動で塗り直す演習
  • ショートカットキーの一覧シート(Alt + H + FC でフォント色、Alt + H + H でセルの色など)
  • 正解シートを別タブに用意し、マクロなしで自己採点できる構成

IBフォーマットのルール自体は単純だが、手が覚えるまでは意外に時間がかかる。Excelを毎日触る人向けの反復練習教材として需要がありそう。


振り返り

CFWSパイプラインの色分け処理を眺めているうちに、「これは汎用ツールになる」と手が勝手にREPLを開いていた。IBモデルが「直接参照しか使わない」という制約を自らに課しているからこそ、機械的な判定が破綻しない。制約が自動化を可能にする、という構図が面白い。