【テクニカル・上級編】Document.Statsおよびプロパティ監査:ファイル内の全シェイプ数・ページ数・未使用マスターを一括抽出するレポート作成ツール – Visio VBA解析バイブル

スポンサーリンク

朽ちゆくVisioドキュメントを救え:VBAによる「静的解析と構造的健全性」の極致

Visioのファイルは、長期間運用されると「墓場」と化す。不要なマスターシェイプが肥大化し、誰も触れない非表示レイヤーがメモリを食い、見えないゴミが描画パフォーマンスを殺す。

多くの開発者は、Visioを単なる作図ツールとして扱うが、我々アーキテクトにとってVisioファイルは「データ構造そのもの」である。今日は、Visioの深層に潜り込み、その構造を白日の下に晒すための「査察用VBAエンジン」を伝授する。

1. Visioオブジェクトモデルの深淵:Statsと監査の哲学

Visioのドキュメント構造は、単純な親子関係ではない。`Document.Stats` プロパティは、ファイル全体の状態を概観する強力な武器だが、これだけでは不十分だ。真の監査には、`Masters` コレクションの生存確認と、`Layers` の可視性判定を組み合わせた、多角的なスキャンが必要となる。

我々が追うべきは以下の指標だ:

  • Shape Count: 単純なシェイプ数ではなく、グルーピングされた階層の深さ。
  • Ghost Masters: ドキュメント上で使用されていないのに削除されていない「ゾンビ・マスター」。
  • Hidden Layers: 操作不能かつ無駄にプロパティを保持する隠れレイヤー。

2. 実装:システム監査レポート生成ツール

以下のコードは、単なるプロパティ取得ではない。メモリの断片化を避けるため、オブジェクトの参照を逐次解放し、大規模ファイルでもハングアップしないよう配慮した設計だ。

Option Explicit

‘ Visioファイルの健全性を査察するコア・エンジン
Public Sub GenerateAuditReport()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim mstr As Visio.Master
Dim layer As Visio.Layer

Set doc = ActiveDocument

‘ メモリ最適化:不要な描画更新を停止
Application.ScreenUpdating = False

Debug.Print “— Visio Audit Report: ” & doc.Name & ” —”

‘ 1. 基本統計の抽出
Debug.Print “Total Pages: ” & doc.Pages.Count
Debug.Print “Total Masters: ” & doc.Masters.Count

‘ 2. 未使用マスターの特定(重要)
‘ マスターがドキュメント内でインスタンス化されているかを確認する
Dim unusedCount As Integer: unusedCount = 0
For Each mstr In doc.Masters
If mstr.Type = visTypeMaster Then
‘ 参照カウントを擬似的に判定(使用されていれば参照先が存在する)
If Not IsMasterInUse(doc, mstr) Then
Debug.Print “Unused Master found: ” & mstr.Name
unusedCount = unusedCount + 1
End If
End If
Next mstr

‘ 3. レイヤーの全探索
For Each pg In doc.Pages
For Each layer In pg.Layers
If layer.Visible = False Then
Debug.Print “Hidden Layer in Page ” & pg.Name & “: ” & layer.Name
End If
Next layer
Next pg

‘ オブジェクトの明示的解放(VBAではSet Nothingが正義)
Set doc = Nothing
Application.ScreenUpdating = True

MsgBox “査察完了。イミディエイトウィンドウを確認せよ。”
End Sub

‘ マスターが使用されているか判定するロジック
Private Function IsMasterInUse(doc As Visio.Document, mstr As Visio.Master) As Boolean
Dim p As Visio.Page
Dim s As Visio.Shape

For Each p In doc.Pages
For Each s In p.Shapes
‘ ShapeのMasterプロパティを突き合わせる
If Not s.Master Is Nothing Then
If s.Master.Name = mstr.Name Then
IsMasterInUse = True
Exit Function
End If
End If
Next s
Next p
IsMasterInUse = False
End Function

3. チーフアーキテクトからの助言:ここが限界点だ

メモリ管理の定石

VBAは参照カウンタ方式のガベージコレクションである。`For Each` ループ内でオブジェクトを生成し続け、`Set Nothing` を怠れば、Visioのメモリリークは加速する。特に、数千のシェイプを持つ図面で `Shapes` コレクションを再帰的に走査する場合、必ず `Set` 変数を解放せよ。

パフォーマンスの最適化

大規模な図面での `Application.ScreenUpdating = False` は必須だが、さらに踏み込むなら `Application.DeferRecalc = True` を使用しろ。Visioはシェイプが変わるたびに数式(ShapeSheet)の再計算を行う。レポート作成中はこれを止めるだけで、処理速度は数倍に跳ね上がる。

レガシーの打破

もし君の組織が、何十年も前の `.vsd` 形式を維持しているなら、まずは `.vsdx` (XML形式) への変換を強く推奨する。XML化されたVisioファイルは、VBAで中身を解析するよりも、`.NET` の `System.IO.Compression` で解凍し、XMLデータを直接解析する方が遥かに高速で安全だ。

結び

Visioの管理は「清掃」である。不要なマスターを捨て、ゾンビレイヤーを葬り去る。それがシステム全体のレスポンスを向上させ、次世代のエンジニアに負の遺産を残さないための、我々シニア層の義務である。

コードが動いたか? ならば、次はそれをExcelのダッシュボードに自動出力するパイプラインを構築してみろ。Visioは、ただの作図ツールではない。君のデータセンターの地図なのだから。

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