Visioの肥大化に終止符を。大規模VSDXを「外科手術」する最適化アーキテクチャ
Visioを業務フローの標準ツールとして採用している現場ほど、数年後に必ず直面する壁がある。「ファイルサイズが肥大化し、保存やPDF出力に数分かかる」という問題だ。
多くのエンジニアはこれを「Visioの仕様」と諦めるが、それは甘い。ファイルが重くなる真の犯人は、繰り返されるコピー&ペーストによって蓄積された「ゴミ」だ。使われていないマスターシェイプ、無秩序に増殖したスタイル。これらをコードで一掃しなければ、業務効率化ツールとは呼べない。
今回は、VisioのDocumentオブジェクトを「外科手術」し、極限まで軽量化するためのプロフェッショナルな設計手法を伝授する。
—
1. なぜ「手動削除」では不十分なのか
VisioのGUI上の「図面エクスプローラー」から手作業で削除しても、内部的な参照関係や、隠れた依存関係が残り続けることが多い。特に大規模なドキュメントでは、以下の2点がボトルネックになる。
- Mastersコレクションの汚染: 使用していないマスター定義が、一度でもドキュメントに読み込まれると、その後ページから消してもキャッシュとして残り続ける。
- Stylesの肥大化: デフォルトのスタイルを継承したゴミスタイルが、無意味にリソースを消費する。
これらを排除するには、`Document.Masters` および `Document.Styles` のコレクションをイテレートし、`UsageCount`(または依存関係)を判定するロジックが必要不可欠だ。
—
2. プロダクション品質の最適化コード
以下は、安全かつ確実に「使用されていない要素」を特定し、削除する設計だ。重要なのは、`Delete` を実行する際に、コレクションのインデックスがずれることを防ぐための「逆順ループ」を採用することである。
‘ —————————————————————————
‘ Visioドキュメント軽量化エンジン
‘ 対象:未使用のMastersおよびStylesのクリーンアップ
‘ —————————————————————————
Public Sub OptimizeVisioDocument()
Dim doc As Visio.Document
Set doc = ActiveDocument
On Error Resume Next ‘ 削除時の不測の例外を制御
‘ 1. 未使用のマスターシェイプを削除
‘ インデックスの逆順でループするのが鉄則
Dim i As Long
For i = doc.Masters.Count To 1 Step -1
‘ UsageCountが0のマスターのみ削除対象とする
‘ ※注意: 複雑な参照がある場合はここを細かく条件分岐させること
If doc.Masters(i).UsageCount = 0 Then
Debug.Print “Deleting Master: ” & doc.Masters(i).Name
doc.Masters(i).Delete
End If
Next i
‘ 2. 未使用のスタイルを削除
‘ 組み込みスタイルは削除できないため、エラーハンドラで無視
Dim stl As Visio.Style
For i = doc.Styles.Count To 1 Step -1
Set stl = doc.Styles(i)
If Not stl.BuiltIn Then
‘ ユーザー定義スタイルのみを精査
Debug.Print “Deleting Style: ” & stl.Name
stl.Delete
End If
Next i
On Error GoTo 0
MsgBox “最適化が完了しました。ファイルを上書き保存してサイズを確認してください。”, vbInformation
End Sub
—
3. 実務で「バグらせない」ためのアーキテクチャ上の注意点
このコードをただコピペするだけでは、現場の運用で事故が起きる。以下の3点を必ず設計に組み込んでほしい。
① 「削除対象」の除外リストを持つ
特定のステンシルやスタイルは、将来的に使う可能性がある、あるいはシステム側で動的に参照しているケースがある。`If InStr(name, “Required_”) > 0 Then` のような形式で、「削除してはならない要素」のホワイトリストをハードコードではなく外部設定ファイル(JSON等)で管理するのが、真のアーキテクトの仕事だ。
② PDF出力前のトランザクション管理
最適化を行った直後にPDF出力を行う場合、Visioの内部処理が追いつかず、稀に「ファイルが壊れている」と判定されることがある。コードの末尾には必ず `doc.Save` を挟み、一度物理ファイルと同期させるフェーズを設けること。
③ データベース連携時の整合性
もしVisioをDBの図面管理システムの一部として組み込んでいる場合、ステンシルID(MasterID)が変わるとデータ整合性が崩れる可能性がある。このツールを適用する際は、「名前ベース」ではなく「一意のGUID」ベースで履歴を管理しているかを確認せよ。
—
結論:技術は「掃除」に宿る
大規模なシステムほど、コードの複雑さよりも「溜まったゴミをいかに捨てるか」という維持管理の設計が勝敗を分ける。Visio VBAも例外ではない。
このツールを導入するだけで、数MB単位の削減は容易であり、PDF書き出しの速度も劇的に向上するはずだ。明日からの開発では、ぜひこの「最適化プロセス」をCI/CDならぬ「図面ライフサイクル管理」の一環として組み込んでほしい。
君たちが書くコードが、誰かの業務ストレスを減らす唯一無二のソリューションになることを期待している。
