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

スポンサーリンク

Visioの「肥大化」を根絶せよ!未使用マスターシェイプを自動削除してVSDXを極限まで軽量化するVBA術

こんにちは。現場でVisioと格闘している皆さん、お疲れ様です。

図面を長く運用していると、ファイルサイズがみるみる肥大化して、開くたびにイライラすることはありませんか?実はそれ、「使われていないのに居座り続けるマスターシェイプ」が原因のほとんどです。

今回は、VBAの力を借りて、保存直前にこの「ゴミ」を一掃し、あなたの図面を羽のように軽くする方法を伝授します。マクロの記録から一歩踏み出し、Visioの深淵に触れてみましょう。

—

なぜ「未使用のマスターシェイプ」が溜まるのか?

Visioの図面(VSDX)は、ドキュメント独自の「ドキュメントステンシル」を持っています。図形をドラッグ&ドロップするたび、あるいはコピー&ペーストを繰り返すたびに、裏側では新しいマスターシェイプが次々と登録されていきます。

厄介なのは、図形を削除してもマスターシェイプは消えないということ。これが溜まり続けると、ファイルはメタデータの塊となり、パフォーマンスは低下の一途を辿ります。

これを手動で削除するのは至難の業ですが、VBAなら一瞬です。

—

【実践】魔法のクリーンアップコード

以下のコードは、アクティブなドキュメント内で「現在図面上に存在しないマスターシェイプ」を検出し、パージ(削除)する処理です。

Sub PurgeUnusedMasters()
Dim doc As Visio.Document
Dim masters As Visio.Masters
Dim mst As Visio.Master
Dim i As Long

Set doc = ActiveDocument
Set masters = doc.Masters

‘ 【重要】逆順でループする
‘ コレクションからアイテムを削除する場合、先頭から回すと
‘ インデックスがズレて予期せぬエラーやスキップが発生します。
For i = masters.Count To 1 Step -1
Set mst = masters(i)

‘ どこにも使われていないマスターのみを削除対象とする
‘ mst.InUseプロパティがFalseなら、図面上に配置されていない証拠です
If mst.InUse = False Then
Debug.Print “削除対象: ” & mst.Name
mst.Delete
End If
Next i

MsgBox “クリーンアップが完了しました。保存してファイルサイズを確認してください。”
End Sub

コードのここがポイント!

1. 逆順ループ(Step -1)の鉄則:
コレクション(マスターシェイプのリスト)から項目を削除するとき、先頭から順に処理すると、削除した瞬間にインデックスが繰り上がり、処理が狂います。削除を伴うループは「後ろから」がエンジニアの常識です。
2. `mst.InUse`プロパティ:
これが今回の肝です。Visioのオブジェクトモデルが提供するこのプロパティは、そのマスターが現在何らかの図形として配置されているかを教えてくれます。これを利用しない手はありません。

—

保存時に自動実行させるためのヒント

この処理を毎回手動で叩くのは面倒ですよね? `ThisDocument` モジュール内のイベントハンドラを使うと、保存ボタンを押した瞬間に自動で走らせることができます。

‘ ThisDocument モジュールに記述
Private Sub Document_BeforeSave(ByVal doc As IVDocument)
‘ 保存直前にクリーンアップを実行
Call PurgeUnusedMasters
End Sub

—

陥りやすい罠と対策

1. 「削除できない」マスターが存在する?

一部のシェイプは、アドオンやVisioのシステム内部で依存関係があるため、`mst.Delete` を実行するとエラーになることがあります。実務では `On Error Resume Next` を使い、削除できないものはスキップする堅牢な作りにしておくと安心です。

2. 処理の重さ

巨大な図面の場合、マスターシェイプの数が数千個に及ぶことがあります。その場合は、処理の冒頭に `Application.ScreenUpdating = False` を記述し、画面の書き換えを一時停止させることで、体感速度を劇的に向上させられます。

—

最後に:エンジニアとしての心構え

「自動化」とは、単に楽をすることではありません。「ツールが快適に動くための環境を整えること」です。

今回紹介したコードは、Visioの動作を軽くするだけでなく、ファイル管理のストレスを劇的に減らしてくれます。この「裏側を制御している感覚」こそが、VBAプログラミングの醍醐味です。

まずはこのコードをコピーして、あなたの重たい図面で試してみてください。Visioが本来の軽快さを取り戻したとき、きっと新しい世界が見えてくるはずですよ。

それでは、良い自動化ライフを!

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