こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよくわからないけれど動いたぞ」というフェーズを抜け出し、いよいよ自分の手でVisioを自在にコントロールしたいと思っているあなたへ。
今回は、Visio VBAプログラミングにおいて最も基本的でありながら、最も事故が起きやすい「Documentオブジェクトのライフサイクル管理」について解説します。
「ファイルを開いて、何かを描いて、保存して、閉じる」
一見すると当たり前のこの一連の流れを、コードで完璧にコントロールできるようになると、Visio VBAの基本はもうバッチリです。背伸びせず、一つひとつ丁寧に紐解いていきましょう。
—
1. Visioのオブジェクト階層と「Document」の立ち位置
まず、Visioの心臓部がどうなっているのか、頭の中に地図を描いておきましょう。VisioのVBAの世界は、次のようなピラミッド構造になっています。
Application (Visioアプリ全体)
└ Documents (開かれている図面のコレクション)
└ Document (個別の図面ファイル ★今回主役!)
└ Pages (ページたちの集まり)
└ Page (個別のキャンバス)
└ Shapes (図形たちの集まり)
└ Shape (個別の図形)
私たちが普段見ている「〇〇.vsdx」というファイル、あるいは新しく開いたまっさらなキャンバス。それが `Document`オブジェクト です。
このDocumentを「どう生み出し、どう料理し、どう安全に片付けるか」。これがライフサイクル管理のすべてです。
—
2. Documentのライフサイクル:3つのステップ
Documentの一生は、以下の3つのフェーズで成り立っています。
1. 誕生(Open / Add):既存ファイルを開くか、新しく作る
2. 稼働(Modify):図形を配置したり、データを書き込んだりする
3. 終焉(Save / Close):保存して閉じる、あるいは変更を破棄して閉じる
プログラミング初心者が一番やりがちなミスは、「開いたはいいが、閉じ忘れる」「エラーが起きたときにファイルが宙ぶらりんになる」というもの。これを防ぐための「安全な作法」をコードで見ていきましょう。
—
3. 実践!安全なライフサイクル管理のコードテンプレート
現場でそのままコピペして使える、堅牢(ロバスト)なVBAコードを用意しました。
新規ファイルを作成し、保存して閉じるまでの全手順が詰まっています。
Sub ManageDocumentLifeCycle_Sample()
‘ 変数の宣言(型を明確にするのがプロの第一歩です)
Dim targetDoc As Visio.Document
Dim targetPage As Visio.Page
‘ 【エラーハンドリングの準備】
‘ 予期せぬエラーで処理が止まったとき、ファイルが開いたままになるのを防ぎます
On Error GoTo ErrorHandler
‘ ==========================================
‘ ステップ1:誕生(新規ドキュメントの作成)
‘ ==========================================
‘ 空の図面テンプレートを指定して新規作成します
‘ (“”) を指定すると、デフォルトの空白図面が開きます
Set targetDoc = Application.Documents.Add(“”)
‘ 操作対象となるアクティブページを取得します
Set targetPage = targetDoc.Pages(1)
‘ ==========================================
‘ ステップ2:稼働(図形の配置など)
‘ ==========================================
‘ ここでは例として、長方形を一つ配置してみます
Dim shpBox As Visio.Shape
Set shpBox = targetPage.DrawRectangle(1, 5, 4, 3)
shpBox.Text = “ライフサイクルテスト”
‘ ==========================================
‘ ステップ3:終焉(保存して閉じる)
‘ ==========================================
‘ 保存先のパスを指定します(※実行環境に合わせてフォルダパスを変更してください)
Dim filePath As String
filePath = ThisDocument.Path & “TestDrawing.vsdx”
‘ すでに同名ファイルがある場合は上書き保存できるように一度削除するか、
‘ SaveAs ではなく SaveAsEx を使います(今回はシンプルに SaveAs)
‘ 注意:名前をつけて保存すると、targetDocの参照先も新しいファイルに切り替わります
targetDoc.SaveAs filePath
‘ ドキュメントを完全に閉じます
targetDoc.Close
‘ オブジェクト変数をキレイに解放します
Set targetPage = Nothing
Set targetDoc = Nothing
MsgBox “図面の作成から保存・クローズまで正常に完了しました!”, vbInformation
Exit Sub
ErrorHandler:
‘ — 非常口(エラー発生時の処理) —
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
‘ もしドキュメントが開いたまま変数に残っていたら、変更を破棄して強制的に閉じます
If Not targetDoc Is Nothing Then
‘ すでに保存されているかに関わらず、変更を保存せずに閉じる場合は Saved = True にしてからClose
‘ targetDoc.Saved = True ‘ 変更破棄したい場合はコメントアウトを解除
targetDoc.Close
Set targetDoc = Nothing
End If
Set targetPage = Nothing
End Sub
—
4. ここで差がつく!知っておくべきプロの知見
上記のコードの中で、初心者が「おっ?」と思うポイントや、現場でハマりがちな罠をいくつか解説しておきます。
① 既存ファイルを開くときの注意(`Application.Documents.Open`)
新規作成ではなく、既存のファイルを開くときは `Add` の代わりに `Open` を使います。
Dim existingDoc As Visio.Document
Set existingDoc = Application.Documents.Open(“C:\Work\Data.vsdx”)
この時、もしそのファイルがすでにユーザーの手によってVisioで開かれていた場合、同じファイルを二重に開こうとしてエラーになるか、読み取り専用で開いてしまうことがあります。実務では「すでに開かれていないかチェックする」という一手間を入れると、よりプロっぽい堅牢なコードになります。
② `Save` と `SaveAs` の違い
- `doc.Save`: すでに名前がついているファイルの上書き保存。
- `doc.SaveAs “パス”`: 新規ファイルに名前をつけて保存。
ここで一つ重要な罠があります。`SaveAs` を実行すると、その瞬間に `Document` オブジェクトの指し示すファイルパスが新しいものに変わります。 連続して処理を行うときは、今どのファイルを操作しているのかを見失わないように注意しましょう。
③ 「保存せずに閉じる」テクニック
作業途中でエラーが起きたときや、テスト実行でファイルを残したくないとき、「変更を保存するかどうか尋ねるダイアログ」が出てマクロが止まってしまうことがあります。これを完全にサイレントで閉じるには、以下のように書きます。
‘ 「変更は保存済みである」とVisioに思い込ませてから閉じる
targetDoc.Saved = True
targetDoc.Close
この技を知っていると、バッチ処理などで不要なダイアログにイライラさせられることがなくなります。
—
まとめ
今回は、Visio VBAにおけるDocumentオブジェクトのライフサイクル(誕生〜稼働〜終焉)について解説しました。
- 新規作成は `Documents.Add`、オープンは `Documents.Open`
- 処理が終わったら必ず `Document.Close` でメモリとリソースを解放する
- 万が一のエラーに備えて、エラーハンドリング(`On Error GoTo`)の中で確実に閉じる処理を入れる
ここをクリアできれば、あなたの書くVisioマクロは「ただ動くおもちゃ」から「実務で耐えうる堅牢な自動化ツール」へと確実にレベルアップします。
基本をマスターしたあなたなら、もう次のステップへ進む準備は万全です。明日からのVisio開発を、ぜひ楽しんでくださいね!
