Zenn Dev Minipoisson Articles Xlsm Devkit Production Hardening
業務Excelに実践投入して見えたもの ─ xlsm_devkit の完成度を上げる
- URL: https://zenn.dev/minipoisson/articles/xlsm-devkit-production-hardening
- 日付: 2026-06-26
- Tier: Tier 3
- 要旨: xlsm_devkitを8000セルのアルゴリズムが実装された実業務Excelに本格投入した際に顕在化した問題群と、その改善を記録した記事。PoC段階では現れなかった速度(Application.ScreenUpdating等3行の欠落、O(n²)の文字列連結)・roundtrip信頼性(数値と表示形式NumFmtの不可分性、セミコロンエスケープ、"-“番兵値衝突、先頭末尾スペース消失)・DEV/Releaseワークフロー自動化という3つのテーマが対象。「export→import→exportのMarkdown完全一致」をリリース条件に設定することで双方向ワークフローの信頼性を担保した。AI(主にCodex)が実装を担ったが、VBAの短絡評価なし仕様など言語固有の罠はAIが見落とし人間が発見するケースが複数あった。
詳細
- 速度問題1・importが遅い: Application.ScreenUpdating=False/EnableEvents=False/Calculation=xlCalculationManualの3行が抜けていた。小規模PoCでは気づかず業務Excelで発覚。AI主体開発では規模依存の定型コードが抜けやすい
- 速度問題2・exportが遅い(O(n²)文字列連結): str=str & newPartの連結が8000セル規模で問題化。DevkitStringBuilder UDT(配列に追記→最後にJoinで一括連結O(n))を実装して対処。体感上は進捗表示(StatusBarへの表示)の方が効果が大きかった
- roundtrip問題1・数値と表示形式の不可分: Excelは日時を数値で保持するためNumFmtなしでは往復で値が壊れる。NumFmtを扱う機能を追加して対処
- roundtrip問題2・セミコロンエスケープ: Styleのセミコロン区切りと表示形式文字列(例: #,##0.00;[Red]-#,##0.00)内のセミコロンが衝突。スタイル値内のセミコロンを;にエスケープし、ParseStyleTokensで対処
- roundtrip問題3・”-“番兵値とリテラルの衝突: 空セルの番兵”-“とセル値の文字列”-“を区別できなかった。リテラルは-にエスケープして出力し復元
- roundtrip問題4・先頭末尾スペースの消失: Trim()をTrimMDTableField(先頭末尾の1スペースのみ除去)に置換
- リリース条件: export→import→exportで生成されるMarkdownが完全一致することを必ず確認してからリリース
- エラー値セルでのクラッシュ: rng.ValueでエラーセルはVBAランタイムエラー。IsError()でチェックしrng.TextをフォールバックにするがVBAはAND式の短絡評価なし→AIがNot IsError()をAND内の式Aに書いて式B内でエラーが発生する問題があった
- プロテクトシート混在: import開始前にAbortIfProtectedImportSheetsで全対象シートの保護状態を確認し保護シートがあれば中止
- import失敗時の状態復元: エラーでもApplication.ScreenUpdating等を必ず復元するエラーハンドラーを整備
- CallInitDevMode/CallSaveAsRelease: DEVコピー作成と配布用クリーンファイル生成の自動化でモジュール削除忘れリスクを解消