Visioの「腐ったコード」を浄化せよ:ドキュメント健全性監査エンジンの設計思想
Visioをただの作図ツールだと思っているなら、それは大きな間違いだ。業務自動化の現場において、Visioファイルは「肥大化したデータベース」であり、「技術的負債の温床」である。
ファイルを開くたびに重くなり、謎の挙動でクラッシュする。その原因の多くは、不要なマスターシェイプの蓄積や、数千の非表示レイヤーの亡霊だ。本稿では、Visioの深淵を覗き込み、その内部状態を可視化・監査するための「ドキュメント健全性監査エンジン」を実装する。
1. なぜ「Document.Stats」と「Master」の追跡が必要なのか
Visioの `Document.Stats` プロパティは、ファイル内のオブジェクト数を取得する強力な指標だ。しかし、この数値を盲信してはならない。
- 未使用マスターの罠: ページ上からシェイプを削除しても、マスターシェイプはドキュメント内に残り続ける。これがファイルを肥大化させ、描画エンジンのオーバーヘッドを生む。
- 非表示レイヤーの亡霊: 削除されたつもりのシェイプが、非表示レイヤーに紐付いたまま残存しているケースがある。
これらを一括で抽出するツールは、単なる便利ツールではなく、「ファイルのリファクタリング」に必要な羅針盤である。
2. 実務で「壊れない」ための設計原則
プロダクション環境で動作させるためには、以下の原則を厳守せよ。
1. オブジェクトの解放を怠るな: Visio VBAはメモリ管理が甘い。`Set obj = Nothing` を徹底し、ループ内でのオブジェクト生成を最小化せよ。
2. イベントの抑止: 監査中に画面更新やイベントが発生するとパフォーマンスが著しく低下する。`Application.ScreenUpdating = False` は必須だ。
3. エラーハンドリング: 破損したシェイプやロックされたレイヤーに遭遇しても落ちない、堅牢な `On Error Resume Next` とログ出力を実装せよ。
3. 実践:ドキュメント監査ツール実装コード
このコードは、アクティブなドキュメントの統計と未使用マスターを列挙し、即座にイミディエイトウィンドウに出力する。これをCSVやExcelに書き出せば、そのまま監査レポートになる。
Option Explicit
‘ Visioドキュメントの健全性を監査するメインプロシージャ
Public Sub RunDocumentAudit()
Dim vsoDoc As Visio.Document
Dim vsoPage As Visio.Page
Dim vsoMaster As Visio.Master
Dim i As Long
Set vsoDoc = Application.ActiveDocument
‘ 画面更新停止による高速化
Application.ScreenUpdating = False
Debug.Print “— Visio Document Audit Report —”
Debug.Print “Document: ” & vsoDoc.Name
Debug.Print “Total Shapes (Stats): ” & vsoDoc.Stats(Visio.visDocStatsShapes)
Debug.Print “Total Pages: ” & vsoDoc.Pages.Count
‘ 1. 未使用マスターの特定
Debug.Print vbCrLf & “[Unused Masters Report]”
For Each vsoMaster In vsoDoc.Masters
‘ InUseプロパティで生存確認
If Not vsoMaster.InUse Then
Debug.Print “Unused: ” & vsoMaster.Name
End If
Next vsoMaster
‘ 2. 非表示レイヤーの確認
Debug.Print vbCrLf & “[Hidden Layers Report]”
For Each vsoPage In vsoDoc.Pages
For i = 1 To vsoPage.Layers.Count
If vsoPage.Layers.Item(i).CellsC(Visio.visLayerVisible).ResultIU = 0 Then
Debug.Print “Page: ” & vsoPage.Name & ” | Hidden Layer: ” & vsoPage.Layers.Item(i).Name
End If
Next i
Next vsoPage
Application.ScreenUpdating = True
Debug.Print vbCrLf & “— Audit Complete —”
‘ オブジェクト解放
Set vsoDoc = Nothing
End Sub
4. チーフアーキテクトからの助言:このコードをどう進化させるか
上記のコードは「監査」の第一歩に過ぎない。実務でさらに一歩先へ進むための戦略を授ける。
- Excel連携: `Debug.Print` でコンソールに出すのではなく、`CreateObject(“Excel.Application”)` を介して直接Excelシートにデータを書き出せ。これにより、非技術者のメンバーでもグラフ化して傾向分析が可能になる。
- 自動クリーンアップの実装: 未使用マスターを抽出したあと、`vsoMaster.Delete` を安全に行うループを追加すれば、ファイルサイズを劇的に縮小できる「スリミングツール」へと進化する。
- 再帰的探索: グループ化されたシェイプ内を探索する際は、`Shape.Type` が `visTypeGroup` であるかを判定し、再帰的に `Shapes` コレクションを掘り下げる設計を徹底すること。
結びに代えて
Visioの自動化を極めるということは、「見えないもの」を「見える化」する力を持つことに他ならない。多くのエンジニアが「なぜか重い」という理由でファイルを捨ててしまう中、君はコードでその原因を突き止め、健全な状態へ復元できる。
このツールを武器に、肥大化したファイル群を支配せよ。それが、プロのエンジニアの流儀である。
