【Visio VBA】テンプレートの呪縛を解け:ゼロから描く「クリーン・キャンバス」構築術
業務自動化の現場において、Visioの「テンプレート」は諸刃の剣だ。
多くの入門書は「標準テンプレートから図面を作成せよ」と説くが、それは大規模なシステム連携や、自動生成ツールを開発する我々アーキテクトにとっては足枷でしかない。
なぜなら、標準テンプレートには不要なステンシル、スタイル、そして管理不能なメタデータが最初から混入しているからだ。「空のキャンバス」から開始することこそ、堅牢な自動化への第一歩である。
今回は、テンプレートの依存を完全に排除し、クリーンな状態でVisioドキュメントを立ち上げるための「最小構成」を伝授する。
—
なぜ「空のキャンバス」から始めるべきなのか
Visioの `Documents.Add` メソッドを引数なし(あるいは空文字)で呼ぶと、システム既定のテンプレートが適用される。これが罠だ。
自動化ツールを開発する際、環境によって既定テンプレートが異なれば、図面のスケールや単位系が揺らぐ。これはバグの温床となる。
我々が求めるのは、「いつ、どの環境で実行しても、全く同じ初期状態にあるキャンバス」だ。
プロダクションコード:空のドキュメント作成
まずは、最もシンプルかつ堅牢なコードを見てほしい。
Option Explicit
‘ —————————————————————————
‘ 関数名: CreateCleanDocument
‘ 概要: テンプレートに依存しない、完全な空のVisioドキュメントを作成する
‘ —————————————————————————
Public Sub CreateCleanDocument()
Dim doc As Visio.Document
‘ Application.Documents.Add メソッドに引数を渡さないことで、
‘ テンプレートを読み込まず、標準の空ドキュメントを作成する。
‘ ※注意: 厳密な初期化が必要な場合は、既存のテンプレートファイル(.vstx)を
‘ 明示的にパス指定して開くのが最も安全だが、今回は「純粋なゼロ」から構築する。
Set doc = Application.Documents.Add(“”)
‘ 文脈的な注意点:
‘ doc.Pages(1) は既に存在しているが、単位系やページサイズが
‘ 不安定な可能性があるため、初期化直後にページ設定を明示的に適用することを推奨する。
Debug.Print “ドキュメント生成成功: ” & doc.Name
End Sub
アーキテクトの視点:設計の勘所
このコードを実務に組み込む際、初心者が陥りがちな落とし穴が2つある。
1. ページ設定の「強制」
`Add(“”)` で作成した直後のページは、Visioの「デフォルト設定」に引きずられる。自動化ツールを組むならば、以下のプロパティを必ず明示的に設定せよ。
- `Page.PageSheet.Cells(“PageWidth”)`
- `Page.PageSheet.Cells(“PageHeight”)`
- `Page.PageSheet.Cells(“DrawingScale”)`
これらをコードで上書きしない限り、作成する図面は「いつか誰かが設定した環境」に依存し続けることになる。
2. ファイル保存と競合制御
自動生成ツールでは、ファイルを保存する際に「既に同名ファイルが存在する場合」のハンドリングが不可欠だ。
‘ 堅牢な保存処理のサンプル
Public Sub SaveDocument(doc As Visio.Document, filePath As String)
‘ 既存ファイルを上書き警告なしで強制的に保存する(実務用)
‘ ※実際には、ファイルロックの確認やディレクトリ存在確認を前段で行うこと
On Error Resume Next
doc.SaveAsEx filePath, Visio.VisSaveAsOptions.visSaveAsForce
If Err.Number <> 0 Then
MsgBox “保存失敗: ” & Err.Description, vbCritical
End If
On Error GoTo 0
End Sub
データベース連携・大規模開発への備え
もし君が、データベースから読み込んだ情報をもとに数百枚の図面を自動生成するようなシステムを組んでいるなら、「テンプレートを一切使わないこと」は最大の最適化になる。
- 処理速度: テンプレートの読み込み時間は意外と馬鹿にならない。空のドキュメント生成は、数百回、数千回の繰り返し処理において、劇的なパフォーマンス向上をもたらす。
- 保守性: 「なぜか特定の環境でだけ線幅が太くなる」「単位がインチになる」といった怪奇現象の9割は、テンプレートの依存が原因だ。ゼロから構築すれば、環境依存のバグを排除できる。
最後に:自動化の先にあるもの
Visio VBAは古い言語だが、そのオブジェクトモデルは極めて洗練されている。
「なんとなく動くコード」を書く段階は卒業しよう。「なぜそう動くのか」を理解し、環境を支配するコードを書くこと。
今日から、テンプレートという「甘え」を捨てて、君自身のコードで図面を定義してほしい。それが、プロフェッショナルな業務自動化エンジニアへの第一歩だ。
何か技術的な壁にぶつかったら、またここへ来い。次は、図形(Master)をプログラム的に動的生成する「真の自動化」について語り合おう。
