[{"data":1,"prerenderedAt":940},["ShallowReactive",2],{"content-/cf-worksheet-sumifs-modularization":3,"all-pages-for-dir":938,"og-image-/cf-worksheet-sumifs-modularization":939},{"id":4,"title":5,"body":6,"category":917,"description":918,"extension":919,"meta":920,"navigation":199,"path":921,"project_name":922,"published":923,"publishedAt":924,"seo":925,"stem":926,"tags":927,"todo":935,"updatedAt":936,"__hash__":937},"pages/2026-04/2026-04-06/cf-worksheet-sumifs-modularization.md","CF精算表パイプラインの大幅強化 --- SUMIFS全面置換・共通モジュール化・5論点横展開",{"type":7,"value":8,"toc":887},"minimark",[9,14,18,23,28,31,34,37,40,48,52,56,59,62,65,68,71,75,78,81,84,87,104,107,110,117,317,323,327,338,349,422,425,428,431,442,446,450,453,459,486,500,504,515,521,775,779,782,785,799,802,806,809,829,832,836,839,843,846,849,868,871,874,880,883],[10,11,13],"h1",{"id":12},"cf精算表パイプラインの大幅強化","CF精算表パイプラインの大幅強化",[15,16,17],"p",{},"朝、年次推移表のExcelを開いて目が止まった。セルをクリックしても数式バーに数値しか表示されない。Pythonで計算した値をベタ打ちしているから当然だが、「この数字はどこから来たのか」をExcel上で追えない。教材として渡すファイルがこれでは、開いた瞬間にブラックボックスに見える。年次推移表をSUMIFS数式に全面置換する作業を起点に、共通モジュール化と5論点への横展開まで一気に走った一日だった。",[19,20,22],"h2",{"id":21},"_301借入金に営業経費シートを追加","301借入金に営業経費シートを追加",[24,25,27],"h3",{"id":26},"顧問料と家賃-未払費用と前払費用の対比","顧問料と家賃 --- 未払費用と前払費用の対比",[15,29,30],{},"借入金の精算表に営業経費シートを追加した。月次の固定費として税理士顧問料33,000円と家賃110,000円を計上する。",[15,32,33],{},"この2つを同じシートに並べたのは、経過勘定の対比を見せるためだ。顧問料は後払いなので、役務提供を受けた月に費用が発生し、翌月の支払時までは「未払費用」になる。家賃は前払いなので、支払月に現金が出ていき、翌月の費用発生まで「前払費用」として資産に載る。同じ固定費でもキャッシュフローへの影響タイミングが逆になる。1シートに並べることで、BS科目がどう動くかを追える教材になった。",[24,35,36],{"id":36},"現金売上と仕入の追加",[15,38,39],{},"営業経費だけを追加すると、PLが費用のみで赤字になり、普通預金残高がマイナスに沈む。ファイルを開いたとき「この会社は何で稼いでいるのか」が見えない。教材として不自然だった。",[15,41,42,43,47],{},"現金売上と現金仕入のシートを追加して解消した。ここでCodexが指摘を入れてきた。",[44,45,46],"code",{},"generate_daily_purchases"," 関数が在庫バッファを持つ設計になっており、仕入量が売上量を上回る期間が生じる。教材にはゼロ在庫（仕入=売上原価）のモデルが適切なので、在庫バッファのロジックを削除した。",[19,49,51],{"id":50},"中間テーブルsumifsの簡素化","中間テーブルSUMIFSの簡素化",[24,53,55],{"id":54},"j列勘定科目フィルタが不要だった","J列（勘定科目フィルタ）が不要だった",[15,57,58],{},"中間テーブルにはSUMIFS数式が並んでおり、J列に勘定科目名のフィルタ条件を持たせていた。しかしデータ構造を見直すと、各行は既に特定の勘定科目に対応している。フィルタ条件が冗長だった。",[15,60,61],{},"J列を削除すると、SUMIFS数式から条件が1つ減り、数式の長さが半分近くになった。数式バーを見ただけで何を集計しているか読み取れるようになった。",[24,63,64],{"id":64},"合計テーブルの新設と撤回",[15,66,67],{},"中間テーブルの集計結果をさらに合計テーブルにまとめる案を実装した。しかし動かしてみると、中間テーブルと合計テーブルで同じ数値を二重に持つだけで、CFWSから参照するのは結局どちらか一方だけだった。冗長なレイヤーを一枚剥がして合計テーブルを削除した。",[15,69,70],{},"合計テーブル廃止に伴い、利息のINDEX/MATCH数式のスコープを中間テーブルの該当範囲に限定し直した。",[19,72,74],{"id":73},"年次推移表のsumifs化","年次推移表のSUMIFS化",[15,76,77],{},"ここが今日の最大の作業だった。",[24,79,80],{"id":80},"構造の変更",[15,82,83],{},"ベタ打ちの値を消し、仕訳シートを参照するSUMIFS数式に全面置換した。年次推移表の各セルが「仕訳シートの取引日がFrom〜Toの範囲で、かつ勘定科目が一致する行の金額を合計する」数式になる。",[15,85,86],{},"追加した要素:",[88,89,90,98],"ul",{},[91,92,93,97],"li",{},[94,95,96],"strong",{},"From/To行",": 各年度列のヘッダ直下にFrom日付とTo日付を配置。SUMIFS数式の日付範囲条件がこの行を参照する",[91,99,100,103],{},[94,101,102],{},"BS科目のFrom固定",": PL科目のFromは期首日（4/1）だが、BS科目のFromは設立日に固定。BS残高は設立以来の累積だから、期首リセットしない",[24,105,106],{"id":106},"仕訳シートの日付がテキスト文字列だった",[15,108,109],{},"SUMIFS数式を入れて再計算させると、全セルが0を返した。数式の構文は正しいのに、SUMIFSが1行もヒットしない。",[15,111,112,113,116],{},"仕訳シートの取引日列をクリックすると、セルの表示形式が「文字列」になっていた。Pythonで仕訳データを書き込む際、日付をISO文字列（",[44,114,115],{},"\"2024-04-01\"","）としてセルに入れていた。SUMIFSの日付比較は数値型のシリアル値を期待するため、文字列のままでは条件が一致しない。",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-python shiki shiki-themes vitesse-light vitesse-light","# Before: 文字列として書き込み\nws.cell(row=r, column=1, value=\"2024-04-01\")\n\n# After: date型に変換して書き込み\nfrom datetime import date\nws.cell(row=r, column=1, value=date(2024, 4, 1))\nws.cell(row=r, column=1).number_format = \"YYYY-MM-DD\"\n","python","",[44,125,126,135,194,201,207,223,275],{"__ignoreMap":123},[127,128,131],"span",{"class":129,"line":130},"line",1,[127,132,134],{"class":133},"sxvE3","# Before: 文字列として書き込み\n",[127,136,138,142,146,149,152,156,159,162,165,168,170,174,176,179,181,185,189,191],{"class":129,"line":137},2,[127,139,141],{"class":140},"sG7-3","ws",[127,143,145],{"class":144},"shFtX",".",[127,147,148],{"class":140},"cell",[127,150,151],{"class":144},"(",[127,153,155],{"class":154},"s4oTP","row",[127,157,158],{"class":144},"=",[127,160,161],{"class":140},"r",[127,163,164],{"class":144},",",[127,166,167],{"class":154}," column",[127,169,158],{"class":144},[127,171,173],{"class":172},"sM54T","1",[127,175,164],{"class":144},[127,177,178],{"class":154}," value",[127,180,158],{"class":144},[127,182,184],{"class":183},"sMJiu","\"",[127,186,188],{"class":187},"sdGka","2024-04-01",[127,190,184],{"class":183},[127,192,193],{"class":144},")\n",[127,195,197],{"class":129,"line":196},3,[127,198,200],{"emptyLinePlaceholder":199},true,"\n",[127,202,204],{"class":129,"line":203},4,[127,205,206],{"class":133},"# After: date型に変換して書き込み\n",[127,208,210,214,217,220],{"class":129,"line":209},5,[127,211,213],{"class":212},"sHkkW","from",[127,215,216],{"class":140}," datetime ",[127,218,219],{"class":212},"import",[127,221,222],{"class":140}," date\n",[127,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,257,259,262,264,267,269,272],{"class":129,"line":225},6,[127,227,141],{"class":140},[127,229,145],{"class":144},[127,231,148],{"class":140},[127,233,151],{"class":144},[127,235,155],{"class":154},[127,237,158],{"class":144},[127,239,161],{"class":140},[127,241,164],{"class":144},[127,243,167],{"class":154},[127,245,158],{"class":144},[127,247,173],{"class":172},[127,249,164],{"class":144},[127,251,178],{"class":154},[127,253,158],{"class":144},[127,255,256],{"class":140},"date",[127,258,151],{"class":144},[127,260,261],{"class":172},"2024",[127,263,164],{"class":144},[127,265,266],{"class":172}," 4",[127,268,164],{"class":144},[127,270,271],{"class":172}," 1",[127,273,274],{"class":144},"))\n",[127,276,278,280,282,284,286,288,290,292,294,296,298,300,303,306,308,311,314],{"class":129,"line":277},7,[127,279,141],{"class":140},[127,281,145],{"class":144},[127,283,148],{"class":140},[127,285,151],{"class":144},[127,287,155],{"class":154},[127,289,158],{"class":144},[127,291,161],{"class":140},[127,293,164],{"class":144},[127,295,167],{"class":154},[127,297,158],{"class":144},[127,299,173],{"class":172},[127,301,302],{"class":144},").",[127,304,305],{"class":140},"number_format ",[127,307,158],{"class":144},[127,309,310],{"class":183}," \"",[127,312,313],{"class":187},"YYYY-MM-DD",[127,315,316],{"class":183},"\"\n",[15,318,319,320,322],{},"date型に変換して書き込むようにしたところ、SUMIFSが正しく集計を始めた。表示上は同じ ",[44,321,188],{}," でも、Excelの内部表現が文字列と数値で異なる。",[24,324,326],{"id":325},"account_dbのキー名がsignだった","ACCOUNT_DBのキー名が'sign'だった",[15,328,329,330,333,334,337],{},"年次推移表のSUMIFS数式で借方・貸方の符号を正しく反映するには、ACCOUNT_DBから勘定科目の正常残高方向を取得する必要がある。コード上で ",[44,331,332],{},"account['normal']"," と書いて ",[44,335,336],{},"KeyError"," が出た。",[15,339,340,341,344,345,348],{},"ACCOUNT_DBの定義を開いて確認すると、キー名は ",[44,342,343],{},"'normal'"," ではなく ",[44,346,347],{},"'sign'"," だった。過去のどこかでリネームされたまま、年次推移表の新コードが旧名を参照していた。",[118,350,352],{"className":120,"code":351,"language":122,"meta":123,"style":123},"# Before: KeyError\nsign = ACCOUNT_DB[account_name]['normal']\n\n# After: 正しいキー名\nsign = ACCOUNT_DB[account_name]['sign']\n",[44,353,354,359,390,394,399],{"__ignoreMap":123},[127,355,356],{"class":129,"line":130},[127,357,358],{"class":133},"# Before: KeyError\n",[127,360,361,364,366,370,373,376,379,382,385,387],{"class":129,"line":137},[127,362,363],{"class":140},"sign ",[127,365,158],{"class":144},[127,367,369],{"class":368},"snbK4"," ACCOUNT_DB",[127,371,372],{"class":144},"[",[127,374,375],{"class":140},"account_name",[127,377,378],{"class":144},"][",[127,380,381],{"class":183},"'",[127,383,384],{"class":187},"normal",[127,386,381],{"class":183},[127,388,389],{"class":144},"]\n",[127,391,392],{"class":129,"line":196},[127,393,200],{"emptyLinePlaceholder":199},[127,395,396],{"class":129,"line":203},[127,397,398],{"class":133},"# After: 正しいキー名\n",[127,400,401,403,405,407,409,411,413,415,418,420],{"class":129,"line":209},[127,402,363],{"class":140},[127,404,158],{"class":144},[127,406,369],{"class":368},[127,408,372],{"class":144},[127,410,375],{"class":140},[127,412,378],{"class":144},[127,414,381],{"class":183},[127,416,417],{"class":187},"sign",[127,419,381],{"class":183},[127,421,389],{"class":144},[19,423,424],{"id":424},"補助科目の統合",[24,426,427],{"id":427},"二重シート問題",[15,429,430],{},"これまで年次推移表には2種類のシートがあった。「年次推移表」（補助科目なし）と「年次推移表_補助科目あり」の2枚だ。両方に同じ親科目の数値が入っており、メンテナンスコストが二重に発生していた。",[15,432,433,434,437,438,441],{},"補助科目ありシートを廃止し、アンダースコア命名（",[44,435,436],{},"未払費用_未払利息","、",[44,439,440],{},"未払費用_未払営業経費","）で1シートに統合した。親科目の行には子科目のSUM数式を入れ、展開しなくても合計値が見える構造にした。",[19,443,445],{"id":444},"xlsx_helperspy共通モジュール化","xlsx_helpers.py共通モジュール化",[24,447,449],{"id":448},"phase-1-5スクリプトから共通関数を抽出","Phase 1: 5スクリプトから共通関数を抽出",[15,451,452],{},"借入金・株主資本・固定資産・運転資本・貸付金の5つの生成スクリプトに、同じセル書き込み関数やフォーマット設定関数が散在していた。",[15,454,455,458],{},[44,456,457],{},"xlsx_helpers.py"," を新設し、共通関数を集約した。対象は以下の5スクリプト:",[88,460,461,466,471,476,481],{},[91,462,463],{},[44,464,465],{},"gen_301_borrowing.py",[91,467,468],{},[44,469,470],{},"gen_302_equity.py",[91,472,473],{},[44,474,475],{},"gen_303_fixed_asset.py",[91,477,478],{},[44,479,480],{},"gen_304_working_capital.py",[91,482,483],{},[44,484,485],{},"gen_305_lending.py",[15,487,488,489,492,493,492,496,499],{},"各スクリプトから ",[44,490,491],{},"write_header_row",", ",[44,494,495],{},"apply_number_format",[44,497,498],{},"set_column_width"," などの関数を抽出し、importに切り替えた。",[24,501,503],{"id":502},"phase-2-auto_fit_columnsの移動と改善","Phase 2: auto_fit_columnsの移動と改善",[15,505,506,507,510,511,514],{},"列幅を自動調整する ",[44,508,509],{},"auto_fit_columns"," 関数が、数式セルの文字列長（",[44,512,513],{},"=SUMIFS(...)"," のような長い文字列）をそのまま幅計算に含めていた。数式が長い列だけ異常に幅が広がる。",[15,516,517,518,520],{},"数式セルを幅計算から除外し、最大幅を20文字にキャップして修正した。この関数も ",[44,519,457],{}," に移動し、全スクリプトから共通利用する形にした。",[118,522,524],{"className":120,"code":523,"language":122,"meta":123,"style":123},"def auto_fit_columns(ws, max_width=20):\n    for col in ws.columns:\n        lengths = []\n        for cell in col:\n            if cell.data_type == 'f':  # 数式セルは除外\n                continue\n            if cell.value is not None:\n                lengths.append(len(str(cell.value)))\n        if lengths:\n            width = min(max(lengths) + 2, max_width)\n            ws.column_dimensions[col[0].column_letter].width = width\n",[44,525,526,553,575,585,600,630,635,657,691,702,738],{"__ignoreMap":123},[127,527,528,532,536,538,540,542,545,547,550],{"class":129,"line":130},[127,529,531],{"class":530},"stQ0i","def",[127,533,535],{"class":534},"senZ8"," auto_fit_columns",[127,537,151],{"class":144},[127,539,141],{"class":140},[127,541,164],{"class":144},[127,543,544],{"class":140}," max_width",[127,546,158],{"class":530},[127,548,549],{"class":172},"20",[127,551,552],{"class":144},"):\n",[127,554,555,558,561,564,567,569,572],{"class":129,"line":137},[127,556,557],{"class":212},"    for",[127,559,560],{"class":140}," col ",[127,562,563],{"class":212},"in",[127,565,566],{"class":140}," ws",[127,568,145],{"class":144},[127,570,571],{"class":140},"columns",[127,573,574],{"class":144},":\n",[127,576,577,580,582],{"class":129,"line":196},[127,578,579],{"class":140},"        lengths ",[127,581,158],{"class":144},[127,583,584],{"class":144}," []\n",[127,586,587,590,593,595,598],{"class":129,"line":203},[127,588,589],{"class":212},"        for",[127,591,592],{"class":140}," cell ",[127,594,563],{"class":212},[127,596,597],{"class":140}," col",[127,599,574],{"class":144},[127,601,602,605,608,610,613,616,619,622,624,627],{"class":129,"line":209},[127,603,604],{"class":212},"            if",[127,606,607],{"class":140}," cell",[127,609,145],{"class":144},[127,611,612],{"class":140},"data_type ",[127,614,615],{"class":530},"==",[127,617,618],{"class":183}," '",[127,620,621],{"class":187},"f",[127,623,381],{"class":183},[127,625,626],{"class":144},":",[127,628,629],{"class":133},"  # 数式セルは除外\n",[127,631,632],{"class":129,"line":225},[127,633,634],{"class":212},"                continue\n",[127,636,637,639,641,643,646,649,652,655],{"class":129,"line":277},[127,638,604],{"class":212},[127,640,607],{"class":140},[127,642,145],{"class":144},[127,644,645],{"class":140},"value ",[127,647,648],{"class":530},"is",[127,650,651],{"class":530}," not",[127,653,654],{"class":212}," None",[127,656,574],{"class":144},[127,658,660,663,665,668,670,674,676,679,681,683,685,688],{"class":129,"line":659},8,[127,661,662],{"class":140},"                lengths",[127,664,145],{"class":144},[127,666,667],{"class":140},"append",[127,669,151],{"class":144},[127,671,673],{"class":672},"sz8Xr","len",[127,675,151],{"class":144},[127,677,678],{"class":672},"str",[127,680,151],{"class":144},[127,682,148],{"class":140},[127,684,145],{"class":144},[127,686,687],{"class":140},"value",[127,689,690],{"class":144},")))\n",[127,692,694,697,700],{"class":129,"line":693},9,[127,695,696],{"class":212},"        if",[127,698,699],{"class":140}," lengths",[127,701,574],{"class":144},[127,703,705,708,710,713,715,718,720,723,726,729,732,734,736],{"class":129,"line":704},10,[127,706,707],{"class":140},"            width ",[127,709,158],{"class":144},[127,711,712],{"class":672}," min",[127,714,151],{"class":144},[127,716,717],{"class":672},"max",[127,719,151],{"class":144},[127,721,722],{"class":140},"lengths",[127,724,725],{"class":144},")",[127,727,728],{"class":530}," +",[127,730,731],{"class":172}," 2",[127,733,164],{"class":144},[127,735,544],{"class":140},[127,737,193],{"class":144},[127,739,741,744,746,749,751,754,756,759,762,765,767,770,772],{"class":129,"line":740},11,[127,742,743],{"class":140},"            ws",[127,745,145],{"class":144},[127,747,748],{"class":140},"column_dimensions",[127,750,372],{"class":144},[127,752,753],{"class":140},"col",[127,755,372],{"class":144},[127,757,758],{"class":172},"0",[127,760,761],{"class":144},"].",[127,763,764],{"class":140},"column_letter",[127,766,761],{"class":144},[127,768,769],{"class":140},"width ",[127,771,158],{"class":144},[127,773,774],{"class":140}," width\n",[19,776,778],{"id":777},"_5論点への横展開","5論点への横展開",[15,780,781],{},"SUMIFS化と共通モジュール化を301借入金で確立した後、残り4論点（302株主資本、303固定資産、304運転資本、305貸付金）に同じ変更を適用した。",[15,783,784],{},"各論点で固有の対応が必要だった箇所:",[88,786,787,793],{},[91,788,789,792],{},[94,790,791],{},"303固定資産",": パソコン（工具器具備品）を資産として追加。償却計算表に1行増える",[91,794,795,798],{},[94,796,797],{},"302株主資本",": BS科目のFrom日付を設立日に固定する処理が、他の論点と微妙に異なる（資本金は増減がないためSUMIFSではなく固定値参照にした）",[15,800,801],{},"5論点すべてで年次推移表のSUMIFS化とxlsx_helpers.pyへの移行が完了した。",[19,803,805],{"id":804},"excel生成ルールの整備","Excel生成ルールの整備",[15,807,808],{},"横展開の過程で、スクリプト間でフォーマットの揺れが目についた。ルールとして明文化した主な項目:",[88,810,811,817,823],{},[91,812,813,816],{},[94,814,815],{},"合計列にはSUM関数を必ず入れる",": ベタ打ちの合計値は禁止。数式で集計することで検算が自動化される",[91,818,819,822],{},[94,820,821],{},"A列スペーサーは新規シートのみ",": 既存シートにA列を挿入すると、他のシートからの参照がズレる",[91,824,825,828],{},[94,826,827],{},"auto_fit_columnsの最大幅20、数式除外",": 前述のルール",[19,830,831],{"id":831},"その他の整備",[24,833,835],{"id":834},"当期表示から実年度名に統一","「当期」表示から実年度名に統一",[15,837,838],{},"年次推移表の列ヘッダが「前々期」「前期」「当期」という相対表記だった。ファイルを翌年に開いたとき「当期」がどの年度を指すのか分からなくなる。「2022年度」「2023年度」「2024年度」のような実年度名に統一した。",[24,840,842],{"id":841},"ibフォーマット適用","IBフォーマット適用",[15,844,845],{},"全シートにIB（投資銀行）フォーマットのカラーリングルールを適用した。入力セルは青字、参照セルは黒字、ハードコードは緑字。セルの性質が色で区別できる。",[24,847,848],{"id":848},"命名規則違反の修正",[15,850,851,852,855,856,859,860,863,864,867],{},"一部のスクリプトやシート名が ",[44,853,854],{},"CF_xxx"," プレフィックスを使っていた。現行の命名規則は ",[44,857,858],{},"cf_xxx","（小文字）統一なので、grepで ",[44,861,862],{},"CF_"," を洗い出し全箇所を ",[44,865,866],{},"cf_"," に置換した。",[19,869,870],{"id":870},"振り返り",[15,872,873],{},"SUMIFSの日付型不一致で全セルが0を返したとき、数式の構文ばかりを疑って30分近く空転した。セルをダブルクリックして参照先のハイライトを確認し、「条件は合っているのにヒットしない」と首をひねった。仕訳シートの日付列を右クリックして「セルの書式設定」を開いた瞬間、「文字列」の表示が目に飛び込んできて原因がつながった。見た目が同じでも内部表現が違う --- この落とし穴を踏んだことで、以後のスクリプトではdate型で書き込むことを徹底するようになった。",[15,875,876,877,879],{},"ACCOUNT_DBの ",[44,878,347],{}," キー問題も似た構造だ。「あるはずのキーがない」というエラーメッセージだけ見て新規追加しかけた。定義ファイルを開いてキー名の一覧を目で確認したら、リネームされた痕跡がそのまま残っていた。辞書のキー名を変更したら、参照側を全文検索で洗い出さないと漏れる。",[15,881,882],{},"xlsx_helpers.pyへの共通化で、5スクリプトに散らばっていた同一コードが1箇所に集まった。auto_fit_columnsの数式幅問題のような修正が、1回の変更で全論点に行き渡る。「同じ関数を5回コピペしている」と気づいた時点でもっと早く手を動かせたはずだ、という反省が残る。",[884,885,886],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}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 .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}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 .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}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);}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}",{"title":123,"searchDepth":137,"depth":137,"links":888},[889,893,897,902,905,909,910,911,916],{"id":21,"depth":137,"text":22,"children":890},[891,892],{"id":26,"depth":196,"text":27},{"id":36,"depth":196,"text":36},{"id":50,"depth":137,"text":51,"children":894},[895,896],{"id":54,"depth":196,"text":55},{"id":64,"depth":196,"text":64},{"id":73,"depth":137,"text":74,"children":898},[899,900,901],{"id":80,"depth":196,"text":80},{"id":106,"depth":196,"text":106},{"id":325,"depth":196,"text":326},{"id":424,"depth":137,"text":424,"children":903},[904],{"id":427,"depth":196,"text":427},{"id":444,"depth":137,"text":445,"children":906},[907,908],{"id":448,"depth":196,"text":449},{"id":502,"depth":196,"text":503},{"id":777,"depth":137,"text":778},{"id":804,"depth":137,"text":805},{"id":831,"depth":137,"text":831,"children":912},[913,914,915],{"id":834,"depth":196,"text":835},{"id":841,"depth":196,"text":842},{"id":848,"depth":196,"text":848},{"id":870,"depth":137,"text":870},"dev","年次推移表をベタ打ちからSUMIFS数式に全面置換し、xlsx_helpers.pyへの共通モジュール化、営業経費・現金売上の追加、中間テーブル簡素化、5論点への横展開までを一日で完遂した記録","md",{},"/cf-worksheet-sumifs-modularization","eurekapu-nuxt4",false,"2026-04-06T00:00:00.000Z",{"title":5,"description":918},"2026-04/2026-04-06/cf-worksheet-sumifs-modularization",[928,929,930,931,932,933,934],"CF精算表","SUMIFS","Python","Excel自動化","年次推移表","リファクタリング","openpyxl","memo",null,"w8LKkUX642pTpQ_Rz4t5bFDiiLH1TG-0KeqKv9vHqLQ",[],"https://log.eurekapu.com/favicon.svg",1775511575098]