Visioを「解剖」する:ドキュメント健全性を一括査察するVBAアーキテクチャ
こんにちは。業務自動化の深淵へようこそ。
多くのユーザーが「マクロの記録」でVisioを操作しようとして挫折する理由は一つ。Visioという巨大なオブジェクトモデルの「階層構造」を理解せずに、表面だけをなぞっているからです。
今日は、あなたの手元にある重たいVisioファイルが「なぜ重いのか」、その正体を暴き、ファイルの状態を可視化する「ドキュメント監査ツール」を一緒に作っていきましょう。ここをマスターすれば、あなたはもう初心者ではありません。
—
1. Visioのオブジェクトモデルを俯瞰する
Visioの構造は、ロシアのマトリョーシカのように階層的です。まずはこの地図を頭に叩き込んでください。
- Application: Visioそのもの。全ての親。
- Document: ファイル単位。ここがデータの保管庫。
- Page: 図面上のページ。
- Shape: 図形。これがVisioの最小かつ最強の構成要素。
「マクロの記録」は単に `ActiveWindow.Selection` を叩くだけですが、真のエンジニアは `Document` オブジェクトから下層へ潜り込み、全シェイプをスキャンします。
—
2. ファイルを解剖する:監査ツール実装コード
このスクリプトは、ドキュメント内の総シェイプ数、ページ数、そして「ゴミ」となっている未使用マスターシェイプを抽出し、イミディエイトウィンドウにレポートを出力します。
Option Explicit
‘ — Visioドキュメント監査ツール —
‘ 目的:ファイル内の構造的負債を可視化し、軽量化の指針を得る
Sub AuditVisioDocument()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim master As Visio.Master
Dim shapeCount As Long
Set doc = ActiveDocument
Debug.Print “=== Visio ドキュメント監査レポート ===”
Debug.Print “ファイル名: ” & doc.Name
Debug.Print “ページ総数: ” & doc.Pages.Count
‘ 1. 全ページ・全シェイプのカウント
shapeCount = 0
For Each pg In doc.Pages
shapeCount = shapeCount + pg.Shapes.Count
Next pg
Debug.Print “シェイプ総数: ” & shapeCount
‘ 2. 未使用マスターシェイプの検出
‘ 未使用のマスターはファイルサイズを肥大化させる最大要因の一つ
Debug.Print “— 未使用マスターシェイプ —”
Dim unusedCount As Integer: unusedCount = 0
For Each master In doc.Masters
‘ InUseプロパティがFalseなら、図面上に存在しないことを意味する
If Not master.InUse Then
Debug.Print “未使用: ” & master.Name
unusedCount = unusedCount + 1
End If
Next master
Debug.Print “未使用マスター数: ” & unusedCount
Debug.Print “================================”
MsgBox “監査完了。イミディエイトウィンドウ(Ctrl+G)を確認してください。”
End Sub
—
3. ここで躓くな:エンジニアの心得
① `InUse` プロパティの罠
コード内で `master.InUse` を使いました。これは「このマスターが図面にドラッグされているか」を判定する非常に強力なプロパティです。しかし、注意点があります。「グループ化された図形の中に潜んでいる」場合、Visioはそれを「使用中」と判定します。完全に削除して良いかどうかは、必ず一度手動で確認してから実行する習慣をつけましょう。
② パフォーマンスの重み
Visioのオブジェクトをループで回す際、シェイプ数が数千を超えると処理が極端に重くなります。
- 回避策: ループ内で `DoEvents` を入れる、あるいは `Application.ScreenUpdating = False` を利用して画面描画を停止させることで、体感速度を劇的に向上させることが可能です。
③ 隠れたシェイプレイヤー
Visioには「非表示レイヤー」が存在します。目に見えないからといって存在しないわけではありません。もし `Shapes.Count` が異常に多い場合、レイヤー設定で「非表示」になっているシェイプが大量に埋もれている可能性があります。監査ツールを拡張する際は、`Shape.Layer` プロパティまで踏み込むと、さらに深い分析が可能になります。
—
4. まとめ:次のステップへ
今回作成したコードは、単なる「カウントツール」ですが、これを応用して「特定のレイヤーにあるシェイプを削除する」「全シェイプの保護設定を解除する」といった高度な自動化へ繋げていくことができます。
Visio VBAは、ただの「お絵かきソフトの自動化」ではありません。「図面というデータベースを操作する技術」です。
まずはこのコードを動かし、ご自身のファイルがどれだけの「見えない資産(または負債)」を抱えているか確認してみてください。それが、あなたのVisioエンジニアリングの第一歩です。
何か不明点があれば、またいつでも聞いてください。一緒に最高の自動化環境を作り上げましょう。
