【実務・中級編】【中級者向け】VSDX保存時に、ファイル内の「未使用のマスターシェイプ」を削除して軽量化する – Visio VBA解析バイブル

スポンサーリンク

Visioの「肥大化」を根絶せよ:VBAで実現するマスターシェイプの完全クリーンアップ術

Visioファイルを運用していると、ある日突然、数MBのファイルが数十MBに膨れ上がる現象に遭遇したことはないだろうか。その正体は、編集過程で蓄積された「ゴミ」――すなわち、ドキュメントステンシルに居座り続ける「使用されていないマスターシェイプ」だ。

GUIから手動で消す? それはプロの仕事ではない。今回は、保存の瞬間にこれらを自動検出し、ファイルサイズを極限までシェイプアップする「堅牢なクリーンアップアーキテクチャ」を伝授する。

—

なぜ「ゴミ」は溜まるのか?

Visioの仕様上、一度ドキュメント上に配置したシェイプは、削除しても「マスターシェイプ」はステンシル内に残存する。これを放置すると、VSDXの内部XML構造が肥大化し、読み込み速度の低下や予期せぬクラッシュを誘発する。

現場レベルで最も危険なのは、「削除してはいけないシェイプ」を誤って消すことだ。本稿では、Document.MasterItemsのライフサイクルを考慮し、安全かつ確実に「現在使用されていないもの」だけをパージするロジックを構築する。

—

堅牢なパージ・ロジックの設計思想

闇雲に`Master.Delete`を呼ぶのはバグの温床だ。以下の設計要件を遵守せよ。

1. 参照整合性の保護: 現在のページ上にインスタンスが存在するかを判定(`Shape.Master`プロパティとの照合)。
2. 例外処理の徹底: 組み込みステンシルや保護されたマスターの誤削除を防ぐ。
3. トランザクション: 処理の前後で`Application.ScreenUpdating`を制御し、パフォーマンスを最大化する。

—

プロダクションコード:`CleanDocumentMasters`

このモジュールは、保存直前の呼び出しを想定している。保守性を高めるため、クリーンアップロジックを関数として切り出した。

Option Explicit

”’

”’ アクティブなVisioドキュメントから未使用のマスターシェイプを削除する
”’

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は、単なる「操作の自動化」ではない。ドキュメントの構造を理解し、不要なノイズを削ぎ落とす「保守運用エンジニアリング」そのものだ。

今回紹介したコードは、あくまで基本形である。これをあなたの環境に合わせて拡張し、肥大化という悪夢から解放されたクリーンな開発ライフを送ってほしい。健闘を祈る。

タイトルとURLをコピーしました