【実務・中級編】マスターシェイプの活用術:Document.Mastersからステンシル図形をドキュメント上に実体化する – Visio VBA解析バイブル

スポンサーリンク

Visio自動化の真髄:マスターシェイプを「操る」ための設計哲学

Visioの自動化において、初心者が最初に陥る罠がある。「とりあえず `Drop` メソッドを呼べばいい」という安易な実装だ。しかし、現場で求められるのは単なる配置ではない。「どのステンシルから、どのマスターを、どの位置に、どのような状態で生成するか」という、堅牢なライフサイクル管理である。

本稿では、`Document.Masters` を活用し、社内標準を遵守した「壊れない自動生成エンジン」を構築するための極意を伝授する。

1. なぜ「Drop」メソッドだけで実装してはいけないのか

多くのコードが、`ActivePage.Drop` を唐突に呼び出す。これは、ステンシルファイル(.vssx)が開いていることが前提となっており、環境が変われば即座に「マスターが見つかりません」というエラーで爆死する。

プロの設計はこうだ:
1. 依存関係の明示: 必要なステンシルがロードされているかをチェックし、なければロードする。
2. 型安全な参照: 文字列でマスター名を指定するのではなく、定数やEnumで管理する。
3. 状態の確定: 生成直後にプロパティを上書きし、レイアウト崩れを防ぐ。

2. 本番環境に耐えうるプロダクションコード

以下は、外部ファイルからマスターを取得し、ページ上に配置する際のベストプラクティスである。このコードは、エラーハンドリングとリソースの開放を考慮した、業務自動化のテンプレートとなる。

Option Explicit

‘ マスター名を管理する定数(保守性向上のため)
Private Const MASTER_NAME_PROCESS As String = “プロセス”
Private Const STENCIL_NAME As String = “社内標準フロー.vssx”

Public Sub CreateStandardShape()
Dim vsoPage As Visio.Page
Dim vsoMaster As Visio.Master
Dim vsoShape As Visio.Shape
Dim vsoStencil As Visio.Document

Set vsoPage = ActivePage

‘ 1. ステンシルがロードされているか確認
On Error Resume Next
Set vsoStencil = Documents.Item(STENCIL_NAME)
If vsoStencil Is Nothing Then
‘ ロードされていなければ明示的に開く(パスは適宜フルパスへ)
Set vsoStencil = Documents.OpenEx(Application.GetBuiltInStencilPath & “\” & STENCIL_NAME, visOpenRO + visOpenDocked)
End If
On Error GoTo 0

‘ 2. マスターを取得
Set vsoMaster = vsoStencil.Masters.ItemU(MASTER_NAME_PROCESS)

‘ 3. Drop実行(座標はインチ換算不要、Visio内部単位である「インチ」で指定)
‘ ※ 画面のチラつきを防ぐため、処理中は画面更新を停止させるのが定石
Application.ScreenUpdating = False

Set vsoShape = vsoPage.Drop(vsoMaster, 2#, 8#)

‘ 4. 生成されたシェイプの初期設定
With vsoShape
.Text = “新規プロセス”
.Cells(“Char.Size”).Formula = “12pt”
.Cells(“FillForegnd”).Formula = “RGB(240,240,240)”
End With

Application.ScreenUpdating = True

Debug.Print “シェイプ生成成功: ” & vsoShape.Name
End Sub

3. アーキテクトからの助言:3つの鉄則

① `ItemU` を使え

`Masters.Item()` ではなく `Masters.ItemU()` を推奨する。UはUniversalの略であり、多言語環境やOSのロケール設定に依存せず、常に英数字名で正確にオブジェクトを特定できる。これはグローバル展開を視野に入れたシステム開発の鉄則だ。

② 外部データとの連携(Excel/DB)

マスターを配置した後、`Shape.Data1` や `Shape.Cells(“Prop.Name”).Formula` を使い、外部データを流し込む機会が多いはずだ。このとき、「シェイプの生成」と「属性の流し込み」はロジックとして分離せよ。
生成関数はシェイプを返し、属性セット関数はシェイプを受け取る。この疎結合な設計こそが、変更に強いコードを生む。

③ ステンシルの「浮遊」を防ぐ

ステンシルを `Documents.OpenEx` で開く際、`visOpenDocked` を指定することで、UIの左側に正しくドッキングさせる。これを忘れると、ユーザーの画面上にステンシルがウィンドウとして浮遊し、UXを著しく損ねる。細部へのこだわりが、ツールの評価を決定づける。

まとめ:自動化の先にあるもの

Visioのマスターシェイプを使いこなすことは、単なる配置の自動化ではない。「組織のルールを、図面という言語で強制力を持って実行する」ことである。

今日紹介したコードは、あくまで「骨子」だ。ここに貴社の業務特有のバリデーションや、レイアウト計算ロジックを載せてほしい。設計の美しさを追求すれば、VBAは単なるマクロから、組織を支える「エンジニアリングツール」へと進化する。

次回の更新では、配置したシェイプ同士を自動的に接続する `AutoConnect` の極意について解説しよう。現場での健闘を祈る。

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