こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」というフェーズは、もう卒業しましょう。ここからは、あなたがVisioを意のままに操るチーフアーキテクトです。
今回は、すべての起点となる`Application`オブジェクトの正体を暴き、ドキュメントの生成から安全な保存までのライフサイクルを完全に掌握するための第一歩を踏み出します。
ここをクリアすれば、Visio VBAの基本はバッチリですよ。さあ、一緒に扉を開けましょう。
—
1. Visioオブジェクトモデルの全体像:頂点に君臨する `Application`
VisioのVBAを書くとき、私たちは常に「今、どの階層にいるのか」を意識する必要があります。Visioのオブジェクト階層は、いわば大企業の組織図のようなものです。
[ Application ] (Visioアプリそのもの)
└─ Documents (開かれている図面のコレクション)
└─ Document (個々の図面ファイル .vsd/.vsdx)
└─ Pages (ページ全体のコレクション)
└─ Page (個々の描画ページ)
└─ Shapes (図形たちのコレクション)
└─ Shape (個々の図形)
その頂点に君臨するのが、`Application`オブジェクトです。
Excel VBAにおける `Application` と同様に、Visioのアプリケーション全体を指し示します。「今、Visioがどんな状態か」「新しい図面を開きたい」「画面の描画を一旦ストップさせたい」といった、全体を統括する命令はすべてこの `Application` が握っています。
マクロ初心者からの脱却:親の顔(オブジェクト)を省略しない
VBAに慣れてくると、つい `ActiveDocument` や `ActivePage` といったショートカットプロパティを多用しがちです。しかし、大規模な自動化や実務のエラー耐性を考えるなら、「どのApplicationの、どのDocumentの、どのPageか」を明示する癖をつけることが、プロへの最短ルートです。
—
2. 新規図面の作成と、安全な開閉・保存の作法
それでは、実際にコードを書いていきましょう。
Visio VBAにおける「ファイル操作」の基本は、`Documents` コレクションを操作することです。
以下のコードは、新規図面の作成から、名前をつけた保存、そして安全な閉じる処理までのライフサイクルを網羅した実用的なサンプルです。VBAの標準モジュールに貼り付けて実行してみてください。
実践コード:ドキュメントのライフサイクル管理
Sub ManageVisioDocumentSample()
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
Dim appVisio As Visio.Application
Dim docNew As Visio.Document
Dim targetPath As String
Dim targetName As String
‘ 1. Applicationオブジェクトの取得
‘ ※VBAの内部から実行する場合は Application そのままでも動作します
Set appVisio = Visio.Application
‘ 2. 画面描画のロック(パフォーマンス向上のためのプロの技)
‘ 図形が勝手に描画されるチラつきを防ぎ、処理速度を爆発的に上げます
appVisio.ScreenUpdating = False
‘ 3. 新規図面の作成(デフォルトのステンシルなしで空の図面を作る場合)
‘ ※通常の空図面なら appVisio.Documents.Add(“”) でもOKです
Set docNew = appVisio.Documents.Add(“”)
Debug.WriteLine “新しい図面を作成しました。”
‘ 4. ファイルの保存パスを設定(デスクトップに保存する例)
targetPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\”
targetName = “SampleDrawing.vsdx”
‘ 既に同名のファイルが存在する場合は削除しておく(上書き保存エラーを防ぐため)
If Dir(targetPath & targetName) <> “” Then
Kill targetPath & targetName
End If
‘ 5. ドキュメントの保存
docNew.SaveAs targetPath & targetName
MsgBox “図面を保存しました: ” & targetPath & targetName, vbInformation, “成功”
‘ 6. 安全なクローズ処理
‘ 保存済みであることを確認して閉じる
docNew.Close
‘ 描画ロックの解除
appVisio.ScreenUpdating = True
Exit Sub
ErrorHandler:
‘ 万が一のエラー時に描画ロックがフリーズしたままになるのを防ぐ
appVisio.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub
—
3. コードの急所:プロが解説する「絶対に押さえるべきポイント」
上記のコードには、現場で生き残るための「エンジニアの知見」がいくつか詰められています。特に重要なポイントを解説します。
① `ScreenUpdating = False` によるパフォーマンス最適化
Visioは、図形を1つ追加・変更するたびに画面を再描画しようとします。これがプログラムの実行速度を著しく低下させる原因(いわゆる「カクつき」や「爆発的な遅延」)になります。
処理の最初に `ScreenUpdating = False` をかけ、最後に `True` に戻す。これは大量の図形を自動生成するVisioマクロでは絶対の鉄則です。
② エラーハンドリングと「画面ロックの解除」のセット
もしコードの途中でエラーが発生してプログラムが止まったとき、`ScreenUpdating = False` のままになると、Visioの画面がフリーズしたような状態になり、ユーザーをパニックにさせます。
必ず `On Error GoTo` を使って、エラー時でも確実に画面描画を `True` に戻す保険を仕込んでおきましょう。
③ 既存ファイルの安全な開け方 (`Documents.Open`)
今回は新規作成 (`Add`) を行いましたが、既存の図面を開く場合は `Documents.Open` を使います。
Dim docOpened As Visio.Document
‘ 読み取り専用で開く場合の例
Set docOpened = appVisio.Documents.OpenEx(targetPath & targetName, visOpenRO)
実務では「ファイルがすでに別のユーザーによって開かれていないか」「パスが存在するか」を事前に `Dir` 関数などでチェックする優しさが求められます。
—
4. 初学者が陥りがちな「罠」と回避策
最後に、Visio VBAを学び始めた人が必ずと言っていいほどハマる罠を共有しておきます。
- 罠:図面を閉じるときに「変更を保存しますか?」というダイアログが出てマクロが止まる
- 対策: 自動化スクリプトにおいて、意図しないダイアログボックスは最大の敵です。保存せずに強制的に閉じたい場合は `doc.Close` の代わりに `doc.Saved = True`(保存したとみなす)を設定してから閉じるか、強制終了系のメソッドを活用します。
- 罠:`ActiveDocument` と `ThisDocument` の混同
- 対策: `ThisDocument` は「今このコードが書かれているVBAプロジェクトが含まれるドキュメント」を指します。一方 `ActiveDocument` は「現在ユーザーが画面上でアクティブにしているドキュメント」です。マクロから別の図面を操作する際は、曖昧なショートカットを使わず、変数に格納した `Document` オブジェクトを確実に指し示すようにしましょう。
—
おわりに
お疲れ様でした!
今回は `Application` オブジェクトの概念から、図面の生成・保存・終了というライフサイクルの基本を学びました。
ここをマスターすれば、次は「ページ (`Page`) の切り替え」や「図形 (`Shape`) の配置」という、よりクリエイティブで実用的な領域へと進むことができます。
基礎を固めたあなたなら、もうマクロの記録人形ではありません。自信を持って、次のステップへ進みましょう!
