コンテンツにスキップ
Zenn Dev Minipoisson Articles Xlsm Devkit Xlsx Support

マクロなしの業務帳票に踏み込む ─ xlsm_devkit の .xlsx 対応と、AI による数式査読

  • URL: https://zenn.dev/minipoisson/articles/xlsm-devkit-xlsx-support
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: xlsm_devkitをマクロなしExcel(.xlsx)に対応させ、複雑な数式の塊である業務帳票を開発対象にした実装記録。.xlsxの場合、SaveCopyAsでVBAプロジェクトがコピーに含まれないという.xlsmとの挙動差異を実際に動かして初めて発見し、一時コピーにxlsm_devkit.basを再インポートする分岐を追加した。帳票適用では大量セル結合による8〜15分の処理遅延・Pictureオブジェクトへのラベル代入エラー・結合セルの.Locked設定エラーなど多数の課題が顕在化し、それぞれ選択インポート(xlsm_devkit.ini)・HasTextFrameチェック・MergeArea.Lockedへの変更で対処した。AIへの「実装完了」報告が仮説にすぎず、人間による動作確認が不可欠だという教訓も記されている。

詳細

  • .xlsxと.xlsmの挙動差: SaveCopyAsは元の形式を保つため.xlsxのコピーにはVBAが含まれない。対処: 一時コピーに追加モジュールをインポート後、src/xlsm_devkit.basを再度インポートして.xlsmとして保存
  • 課題1・大量セル結合による遅延(8〜15分): 結合解除→属性書込→再結合の流れが帳票では致命的。選択インポート(xlsm_devkit.ini)のmerge=0で結合構造はそのまま、セル値・数式のみ更新するよう対処→ほぼ一瞬に短縮
  • 課題2・Picture型図形へのラベル代入(Err 438): shp.HasTextFrameで確認しテキストフレームを持たない図形へのラベル適用をスキップ
  • 課題3・結合セルのLocked設定(Err 1004): 結合領域に属する単一セルへのrng.Locked代入が不可。rng.MergeArea.Locked = Falseで結合領域全体を対象にすることで解決。unlocked=0が既定(オプトイン安全装置)
  • 課題4・1セルの失敗で全体が中断: Bold/Italic/Strike/Wrap/UnlockedのトークンをOn Error Resume Nextで囲み、失敗は診断ログに記録して続行
  • merge=0の副作用・ドリフト: ClearFormatsを含む重い処理を省略したことで「Markdownからトークンを削除=既定に戻す」という不変条件が破られ、Excelに残った属性がそのまま残るドリフトが発生。対処: インポート時に対象フラグが有効なら該当属性を既定値へリセットしてからトークン処理(v1.11.0)、さらに空セルでもリセットが走るようにしread-before-writeで余計なCOM書込を抑制(v1.12.0)
  • AI依頼の教訓: AIの「実装できました」報告はまだ検証されていない仮説。「コードがそう書いてある」と「実物でそう動く」の間には隔たりがあり、人間側の確認と背景知識が必要
  • Application.StatusBarへのDoEvents追加: 1000セルごとのDoEventsでは進捗が見えないケースがあり、.StatusBar直後にDoEventsを追加(AI報告を信じて確認を怠った失敗の事例として記録)