原xls保格式修改(Excel COM)
トリガー条件
- ユーザー/クライアントから「元の表に修正を加えて、書式・デザインは一切変更せず、他の表は調整しないでほしい」と要求された場合
- 財務三表(貸借対照表、損益計算書、キャッシュフロー計算書)の調整:未処分利益/利益総額を変更後、資産=負債+資本の勾配関係を維持する必要がある場合
- 古い.xls形式のレポートをもらって数字を変更する必要があり、ワークブックを再構築できない場合
鉄則:openpyxlで再構築しないこと
openpyxlでxlsxを再構築すると、元の書式・スタイル・レイアウトが失われます。クライアントは「元の表ではない」とすぐに気づきます。 必ずExcel COMで元ファイルのコピーを開き、対象セルの値だけを変更し、その他はすべてそのまま保持してください。
環境(Windows)
# pywin32 を hermes venv にインストール(システムPythonにはありません!)
python -m pip install pywin32
# スクリプトの実行も hermes venv の python を使用(システムPythonは win32com をインポートできません)
コア処理フロー
1. 元のファイルをコピーしてから変更
import shutil
shutil.copy2(SRC, OUT) # 元ファイルはそのまま、OUTを変更
2. COMで開き、ラベルスキャンで行/列を特定(行番号を推測しない!)
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('貸借対照表')
# A列/E列をスキャンして科目名を探し、実際の行と列を出力
for r in range(1, 60):
a = str(ws.Cells(r, 1).Value or ''); e = str(ws.Cells(r, 5).Value or '')
if '未処分利益' in a or '未処分利益' in e:
print(r, a, e, ws.Cells(r,7).Value) # G/H列は右側の数値
⚠️ 左右二段組のレポート(貸借対照表)では、科目はE列、数値はG/H列—「未処分利益」は右側のG34/H34、C/Dではありません! ⚠️ xlrdは0起点、COMは1起点で、行番号が1ずれる—必ずラベルスキャンで確認すること。
3. 対象セルの値のみ変更
ws.Cells(13, 3).Value = 4307698.97 # その他未収入金 期末(左欄C)
ws.Cells(34, 7).Value = 1052736.98 # 未処分利益 期末(右欄G)
wb.Application.Calculate()
wb.Save(); wb.Close(True); excel.Quit()
4. ⚠️ 古いxlsには計算式がないことが多い—合計行は手動で計算して書き込む必要がある
中小企業基準でエクスポートされたxlsの合計行は、多くの場合SUM関数ではなく数値です。明細を変更しても合計は自動更新されません。 調整後は手動で計算する必要があります:
- 資産合計 = 流動資産 + 非流動資産
- 資本合計 = 資本金 + 未処分利益
- 負債+資本 = 負債合計 + 資本合計 = 資産合計 ✅ バランス確認
- 損益計算書:営業利益 = 収益 - 原価 - 管理費 - 財務費;利益総額 = 営業利益 + 営業外収益;純利益 = 利益総額 - 法人税等
5. バランス検証
assert abs(ws.Cells(36,3).Value - ws.Cells(36,7).Value) < 0.01 # 資産 = 負債 + 資本
財務三表調整の一般的な方法(2026-08実測)
目標:未処分利益を適正化(例:期末105万円/期首79万円)、利益総額=期末-期首の差額。
- 貸借対照表:「その他未収入金」(資産側)を同額増加→資産=負債+資本が自動的にバランス
- 損益計算書:「営業収益」(または管理費)を調整し、利益総額=未処分利益の差額に;当期利益は別途決定
- キャッシュフロー計算書:現金の出入りを伴わない損益調整は、通常変更しない
- 勾配検証:
期末未処分利益 - 期首未処分利益 == 累計利益総額
ハマりポイントと解決策
- pywin32はhermes venvにのみインストール→システムPythonで
import win32comすると「No module named 'pywintypes'」エラー;venvのPythonを使用 python -I分離モードではsite-packagesが読み込めない→-Iなしで直接実行- COMで元の値を読み取ると0が表示される→行番号の間違い(xlrdは0起点、COMは1起点)、ラベルスキャンで位置を特定
- 変更後、検証しても反映されていない→左欄と右欄のどちらを変更したか確認(C/D vs G/H)
- Pythonプロセスを強制終了する前にコマンドラインを確認(webapp/ゲートウェイもPythonプロセス)
🙋 作者について
九品錦鯉e | ハマったポイントを「そのまま使える」スキルにパッケージ化。教科書は書きません。このスキルは私自身が毎日使っているバージョンです。
WeChat:ly5419495(メモに「SkillHub」と追加してください。優先的に承認します) 公式アカウント:初五Agent(WeChatで検索。振り返りと方法論はそちらに書いてあります。WeChatを追加しなくても読めます)
私が他に作ったすぐ使えるツールは、こちらの棚にあります(ブラウザで開いてください): https://skillpay.alipay.com/public/jiupinjinlie
使っている途中で詰まった場合や、別のシチュエーションをスキル化してほしい場合は、上記のいずれかの方法でご連絡ください。
