[{"data":1,"prerenderedAt":614},["ShallowReactive",2],{"content-/ib-format-excel-automation":3,"all-pages-for-dir":612,"og-image-/ib-format-excel-automation":613},{"id":4,"title":5,"body":6,"category":592,"description":593,"extension":594,"meta":595,"navigation":596,"path":597,"project_name":598,"published":599,"publishedAt":600,"seo":601,"stem":602,"tags":603,"todo":609,"unpublished":599,"updatedAt":610,"__hash__":611},"pages/2026-04/2026-04-19/ib-format-excel-automation.md","ExcelにIB（投資銀行）モデル書式を自動適用する方法",{"type":7,"value":8,"toc":579},"minimark",[9,14,18,21,26,29,103,110,112,115,120,127,131,138,161,164,385,391,395,398,464,467,471,479,481,484,487,515,521,523,526,529,543,546,548,551,567,569,572,575],[10,11,13],"h1",{"id":12},"excelにib投資銀行モデル書式を自動適用する","ExcelにIB（投資銀行）モデル書式を自動適用する",[15,16,17],"p",{},"朝、Googleタスクを開いたら昨日の積み残しが1件だけ残っていた。eurekapu-nuxt4のExcelファイルにIBフォーマットを適用する作業。ib-formatコマンドを叩いて、全シートの色が塗り変わるのを眺めていたら15分で終わった。",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"ibフォーマットの色分けルール","IBフォーマットの色分けルール",[15,27,28],{},"投資銀行の財務モデルでは、セルの中身が何者かをフォント色で即座に伝える。モデルを渡されたアナリストが数式バーを覗かなくても、色を見た瞬間にセルの性質を掴める。",[30,31,32,48],"table",{},[33,34,35],"thead",{},[36,37,38,42,45],"tr",{},[39,40,41],"th",{},"フォント色",[39,43,44],{},"意味",[39,46,47],{},"具体例",[49,50,51,63,77,90],"tbody",{},[36,52,53,57,60],{},[54,55,56],"td",{},"青",[54,58,59],{},"ハードコード値（直接入力された数値）",[54,61,62],{},"売上高の前提値、成長率",[36,64,65,68,71],{},[54,66,67],{},"黒",[54,69,70],{},"同一シート内で完結する計算式",[54,72,73],{},[74,75,76],"code",{},"=B5*C5",[36,78,79,82,85],{},[54,80,81],{},"緑",[54,83,84],{},"他シートから参照している数式",[54,86,87],{},[74,88,89],{},"=IS!B10",[36,91,92,95,98],{},[54,93,94],{},"赤",[54,96,97],{},"外部ファイルへの参照",[54,99,100],{},[74,101,102],{},"=[外部.xlsx]Sheet1!A1",[15,104,105,106,109],{},"この4色ルールは、IBモデルが「セルをクリックすれば参照先が追える」という透明性を最優先する設計思想から来ている。INDIRECT関数や名前付き範囲を避けるため、数式文字列中の ",[74,107,108],{},"!"," の有無だけで他シート参照を機械的に判定できる。",[19,111],{},[22,113,114],{"id":114},"作業の流れ",[116,117,119],"h3",{"id":118},"_1-積み残しタスクの確認","1. 積み残しタスクの確認",[15,121,122,123,126],{},"Googleタスクに「IBフォーマット適用」が1件残っていた。前日のCFWS差分レビュー作業の延長で、手修正済みの",[74,124,125],{},"_KK","サフィックス付きExcelにIBスタイルを当てる作業。",[116,128,130],{"id":129},"_2-ib-formatコマンドの実行","2. ib-formatコマンドの実行",[15,132,133,134,137],{},"Claude Codeの",[74,135,136],{},"/ib-format","コマンドにExcelファイルを渡す。コマンドは以下の手順で動く:",[139,140,141,145,148,151],"ol",{},[142,143,144],"li",{},"ファイルの存在確認とシート構成の把握",[142,146,147],{},"各シートの全セルを走査し、値の種類を判定",[142,149,150],{},"判定結果に応じてフォント色を差し替え",[142,152,153,154,156,157,160],{},"ファイル名の",[74,155,125],{},"を",[74,158,159],{},"_ib","に変更して保存",[15,162,163],{},"判定ロジックの要所:",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-python shiki shiki-themes vitesse-light vitesse-light","if cell.value and isinstance(cell.value, str) and cell.value.startswith('='):\n    if '[' in cell.value:\n        color = 'FF0000'   # 赤: 外部参照\n    elif '!' in cell.value:\n        color = '008000'   # 緑: 他シート参照\n    else:\n        color = '000000'   # 黒: シート内計算\nelse:\n    color = '0000FF'       # 青: ハードコード値\n","python","",[74,172,173,250,276,295,317,334,342,359,367],{"__ignoreMap":170},[174,175,178,182,186,190,193,197,201,204,207,209,212,215,218,221,224,226,228,230,232,235,237,241,245,247],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sHkkW","if",[174,183,185],{"class":184},"sG7-3"," cell",[174,187,189],{"class":188},"shFtX",".",[174,191,192],{"class":184},"value ",[174,194,196],{"class":195},"stQ0i","and",[174,198,200],{"class":199},"sz8Xr"," isinstance",[174,202,203],{"class":188},"(",[174,205,206],{"class":184},"cell",[174,208,189],{"class":188},[174,210,211],{"class":184},"value",[174,213,214],{"class":188},",",[174,216,217],{"class":199}," str",[174,219,220],{"class":188},")",[174,222,223],{"class":195}," and",[174,225,185],{"class":184},[174,227,189],{"class":188},[174,229,211],{"class":184},[174,231,189],{"class":188},[174,233,234],{"class":184},"startswith",[174,236,203],{"class":188},[174,238,240],{"class":239},"sMJiu","'",[174,242,244],{"class":243},"sdGka","=",[174,246,240],{"class":239},[174,248,249],{"class":188},"):\n",[174,251,253,256,259,262,264,267,269,271,273],{"class":176,"line":252},2,[174,254,255],{"class":180},"    if",[174,257,258],{"class":239}," '",[174,260,261],{"class":243},"[",[174,263,240],{"class":239},[174,265,266],{"class":195}," in",[174,268,185],{"class":184},[174,270,189],{"class":188},[174,272,211],{"class":184},[174,274,275],{"class":188},":\n",[174,277,279,282,284,286,289,291],{"class":176,"line":278},3,[174,280,281],{"class":184},"        color ",[174,283,244],{"class":188},[174,285,258],{"class":239},[174,287,288],{"class":243},"FF0000",[174,290,240],{"class":239},[174,292,294],{"class":293},"sxvE3","   # 赤: 外部参照\n",[174,296,298,301,303,305,307,309,311,313,315],{"class":176,"line":297},4,[174,299,300],{"class":180},"    elif",[174,302,258],{"class":239},[174,304,108],{"class":243},[174,306,240],{"class":239},[174,308,266],{"class":195},[174,310,185],{"class":184},[174,312,189],{"class":188},[174,314,211],{"class":184},[174,316,275],{"class":188},[174,318,320,322,324,326,329,331],{"class":176,"line":319},5,[174,321,281],{"class":184},[174,323,244],{"class":188},[174,325,258],{"class":239},[174,327,328],{"class":243},"008000",[174,330,240],{"class":239},[174,332,333],{"class":293},"   # 緑: 他シート参照\n",[174,335,337,340],{"class":176,"line":336},6,[174,338,339],{"class":180},"    else",[174,341,275],{"class":188},[174,343,345,347,349,351,354,356],{"class":176,"line":344},7,[174,346,281],{"class":184},[174,348,244],{"class":188},[174,350,258],{"class":239},[174,352,353],{"class":243},"000000",[174,355,240],{"class":239},[174,357,358],{"class":293},"   # 黒: シート内計算\n",[174,360,362,365],{"class":176,"line":361},8,[174,363,364],{"class":180},"else",[174,366,275],{"class":188},[174,368,370,373,375,377,380,382],{"class":176,"line":369},9,[174,371,372],{"class":184},"    color ",[174,374,244],{"class":188},[174,376,258],{"class":239},[174,378,379],{"class":243},"0000FF",[174,381,240],{"class":239},[174,383,384],{"class":293},"       # 青: ハードコード値\n",[15,386,387,390],{},[74,388,389],{},"cell.font.copy(color=...)"," を使うことで、フォントサイズや太字設定を壊さずに色だけ書き換える。",[116,392,394],{"id":393},"_3-適用結果の確認","3. 適用結果の確認",[15,396,397],{},"コマンド実行後、シートごとの色分け統計が返ってきた:",[30,399,400,419],{},[33,401,402],{},[36,403,404,407,410,413,416],{},[39,405,406],{},"シート",[39,408,409],{},"青（HC）",[39,411,412],{},"黒（式）",[39,414,415],{},"緑（他シート参照）",[39,417,418],{},"赤（外部）",[49,420,421,438,451],{},[36,422,423,426,429,432,435],{},[54,424,425],{},"IS",[54,427,428],{},"多数",[54,430,431],{},"中程度",[54,433,434],{},"少数",[54,436,437],{},"0",[36,439,440,443,445,447,449],{},[54,441,442],{},"BS",[54,444,428],{},[54,446,431],{},[54,448,431],{},[54,450,437],{},[36,452,453,456,458,460,462],{},[54,454,455],{},"CF",[54,457,434],{},[54,459,428],{},[54,461,428],{},[54,463,437],{},[15,465,466],{},"CFシートで緑（他シート参照）が多いのは想定通り。キャッシュフロー計算書はIS・BSの数値を引っ張ってくるため、シート間参照が集中する。",[116,468,470],{"id":469},"_4-ファイル名の変更","4. ファイル名の変更",[15,472,473,475,476,478],{},[74,474,125],{},"（手修正版を示すサフィックス）を",[74,477,159],{},"に変更して保存。これで「IBフォーマット適用済み」であることがファイル名から一目でわかる。",[19,480],{},[22,482,483],{"id":483},"なぜ自動化が破綻しないのか",[15,485,486],{},"IBモデルの設計規約が自動判定を支えている。投資銀行では以下の機能を意図的に避ける:",[488,489,490,497,503,509],"ul",{},[142,491,492,496],{},[493,494,495],"strong",{},"INDIRECT関数",": 参照先が文字列に隠れて追跡できない",[142,498,499,502],{},[493,500,501],{},"名前付き範囲",": 定義を開かないと参照先がわからない",[142,504,505,508],{},[493,506,507],{},"マクロ（VBA）",": コードを開かないと処理が見えない",[142,510,511,514],{},[493,512,513],{},"外部データ接続",": セル上に数式が残らない",[15,516,517,518,520],{},"これらを使わないから、",[74,519,108],{},"の有無で他シート参照を判定するロジックが崩れない。「制約が自動化を可能にする」という構図がここにもある。",[19,522],{},[22,524,525],{"id":525},"openpyxlの注意点",[15,527,528],{},"フォント色の変更自体は安全だが、openpyxlでファイルを開いて保存する行為自体に落とし穴がある:",[488,530,531,534,537,540],{},[142,532,533],{},"ピボットテーブルが消える",[142,535,536],{},"スパークラインが消える",[142,538,539],{},"一部の条件付き書式が壊れる",[142,541,542],{},"配列数式（CSE）の扱いが不完全",[15,544,545],{},"自分たちのパイプラインで生成したExcelにはこれらが含まれないので問題ない。他人が作った複雑なExcelに当てるなら、バックアップを取ってから走らせる。",[19,547],{},[22,549,550],{"id":550},"学びメモ",[488,552,553,556,564],{},[142,554,555],{},"IBフォーマットの色分けは、4色の判定ロジックが30行に収まるほど単純。それでも誤判定が起きないのは、IBモデル自体が「数式の透明性」を設計原則として参照先を隠す機能を排除しているから",[142,557,558,560,561,563],{},[74,559,125],{}," → ",[74,562,159],{}," のサフィックス変更は地味だが、ファイル名にステータスを埋め込む運用は複数人で触るExcelで効く。「このファイルは誰がどこまで手を入れたか」がエクスプローラー上で見える",[142,565,566],{},"15分で終わる作業を1日積み残していた。Googleタスクに残っていなかったら忘れていたかもしれない。タスク管理ツールが「忘却の穴」を塞いでくれた",[19,568],{},[22,570,571],{"id":571},"振り返り",[15,573,574],{},"朝イチでGoogleタスクを開いて積み残しを拾い、ib-formatコマンドを走らせて、色が塗り変わったExcelをざっと眺めて閉じた。手を動かしていた時間は15分ほど。4月11日にopenpyxlで検証した「フォント色だけ安全に差し替えられるか」が、そのままコマンドとして形になっていた。検証から実用までの距離が短かったのは、IBモデルの設計規約が判定ロジックを単純に保ってくれたおかげだと思う。",[576,577,578],"style",{},"html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":252,"depth":252,"links":580},[581,582,588,589,590,591],{"id":24,"depth":252,"text":25},{"id":114,"depth":252,"text":114,"children":583},[584,585,586,587],{"id":118,"depth":278,"text":119},{"id":129,"depth":278,"text":130},{"id":393,"depth":278,"text":394},{"id":469,"depth":278,"text":470},{"id":483,"depth":252,"text":483},{"id":525,"depth":252,"text":525},{"id":550,"depth":252,"text":550},{"id":571,"depth":252,"text":571},"dev","Claude Codeのib-formatコマンドを使って、Excelファイルに投資銀行スタイルの色分けルールを一括適用した作業記録","md",{},true,"/ib-format-excel-automation","eurekapu-nuxt4",false,"2026-04-19T00:00:00.000Z",{"title":5,"description":593},"2026-04/2026-04-19/ib-format-excel-automation",[604,605,606,607,608],"Excel","投資銀行","IBフォーマット","自動化","Claude Code","memo",null,"UooFqHhaih5y7_fnSpLzVRcLJQnLuLExJn2eIQegr-Y",[],"https://log.eurekapu.com/og/blog/ib-format-excel-automation.png?v=2026-04-19T00%3A00%3A00.000Z&title=Excel%E3%81%ABIB%EF%BC%88%E6%8A%95%E8%B3%87%E9%8A%80%E8%A1%8C%EF%BC%89%E3%83%A2%E3%83%87%E3%83%AB%E6%9B%B8%E5%BC%8F%E3%82%92%E8%87%AA%E5%8B%95%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95&author=Kei%20Komatsu&sig=d76db3b3a2e4d9ca",1780786053261]