Visioの「肥大化」を根絶せよ:VBAで実現するマスターシェイプの完全クリーンアップ術
Visioファイルを運用していると、ある日突然、数MBのファイルが数十MBに膨れ上がる現象に遭遇したことはないだろうか。その正体は、編集過程で蓄積された「ゴミ」――すなわち、ドキュメントステンシルに居座り続ける「使用されていないマスターシェイプ」だ。
GUIから手動で消す? それはプロの仕事ではない。今回は、保存の瞬間にこれらを自動検出し、ファイルサイズを極限までシェイプアップする「堅牢なクリーンアップアーキテクチャ」を伝授する。
—
なぜ「ゴミ」は溜まるのか?
Visioの仕様上、一度ドキュメント上に配置したシェイプは、削除しても「マスターシェイプ」はステンシル内に残存する。これを放置すると、VSDXの内部XML構造が肥大化し、読み込み速度の低下や予期せぬクラッシュを誘発する。
現場レベルで最も危険なのは、「削除してはいけないシェイプ」を誤って消すことだ。本稿では、Document.MasterItemsのライフサイクルを考慮し、安全かつ確実に「現在使用されていないもの」だけをパージするロジックを構築する。
—
堅牢なパージ・ロジックの設計思想
闇雲に`Master.Delete`を呼ぶのはバグの温床だ。以下の設計要件を遵守せよ。
1. 参照整合性の保護: 現在のページ上にインスタンスが存在するかを判定(`Shape.Master`プロパティとの照合)。
2. 例外処理の徹底: 組み込みステンシルや保護されたマスターの誤削除を防ぐ。
3. トランザクション: 処理の前後で`Application.ScreenUpdating`を制御し、パフォーマンスを最大化する。
—
プロダクションコード:`CleanDocumentMasters`
このモジュールは、保存直前の呼び出しを想定している。保守性を高めるため、クリーンアップロジックを関数として切り出した。
Option Explicit
”’
”’
Public Sub CleanDocumentMasters()
Dim doc As Visio.Document
Dim masters As Visio.Masters
Dim mstr As Visio.Master
Dim i As Long
Dim isUsed As Boolean
Set doc = ActiveDocument
Set masters = doc.Masters
‘ 画面更新を停止して高速化
Application.ScreenUpdating = False
‘ 後ろからループを回す(削除によるインデックスのズレを防ぐ鉄則)
For i = masters.Count To 1 Step -1
Set mstr = masters.Item(i)
‘ インスタンスが使用されているか確認
If Not IsMasterInUse(mstr) Then
‘ 削除の実行
mstr.Delete
Debug.Print “Deleted: ” & mstr.Name
End If
Next i
Application.ScreenUpdating = True
MsgBox “クリーンアップが完了しました。”, vbInformation
End Sub
”’
”’
Private Function IsMasterInUse(mstr As Visio.Master) As Boolean
Dim pg As Visio.Page
Dim shp As Visio.Shape
‘ 各ページを走査
For Each pg In mstr.Document.Pages
For Each shp In pg.Shapes
‘ シェイプのマスターと対象マスターを比較
If Not shp.Master Is Nothing Then
If shp.Master.Name = mstr.Name Then
IsMasterInUse = True
Exit Function
End If
End If
Next shp
Next pg
IsMasterInUse = False
End Function
—
現場で勝つための注意点
1. 外部データ連携時の罠
もし図面が外部データベースとリンクしている場合、マスターシェイプを削除するとリンク情報(`DataRecordset`)が破損する可能性がある。データベース連動型の図面であれば、このクリーンアップ処理は実行するべきではない。
2. パフォーマンスの最適化
ドキュメントのページ数が多い場合、`IsMasterInUse`内の全シェイプ走査は負荷が高い。ページ数やシェイプ数があまりに膨大であれば、`Master.ID`を用いた高速な探索アルゴリズムに切り替える必要があるが、まずは上記の実装で「正確性」を優先するのがエンジニアとしての定石だ。
3. PDF出力との連携
PDF出力(`Document.ExportAsFixedFormat`)を行う前にこの関数を呼び出すことで、PDF側のファイルサイズも劇的に抑えることができる。PDF作成自動化ツールを作る際は、必ず「保存・パージ・出力」というフローをパイプライン化せよ。
—
終わりに
VisioのVBAは、単なる「操作の自動化」ではない。ドキュメントの構造を理解し、不要なノイズを削ぎ落とす「保守運用エンジニアリング」そのものだ。
今回紹介したコードは、あくまで基本形である。これをあなたの環境に合わせて拡張し、肥大化という悪夢から解放されたクリーンな開発ライフを送ってほしい。健闘を祈る。
