こんにちは!Visioの自動化の世界へようこそ。
「マクロの記録」ボタンを押して得られたコードをそのまま動かしてみたものの、なんだか狙った通りに動かない……あるいは、手作業で毎回プロパティを入力するのが面倒になってきた頃ではないでしょうか?
今回は、現場で即座に役立つ「Visioの保存時に、作成者やプロジェクトコードなどのメタデータを自動的に埋め込むVBAテクニック」を徹底解説します。
ここをクリアすれば、単なる「操作の記録係」から、業務をデザインする「エンジニア」への大きな一歩を踏み出せますよ。温かく導きますので、ゆっくりついてきてくださいね。
—
なぜVisioの「メタデータ自動化」が必要なのか?
図面管理の現場でよくある悩みが、「誰がいつ作ったか分からない」「プロジェクトコードがバラバラで検索できない」というトラブルです。
Visioには、図面のプロパティ(タイトル、作成者、会社名など)を手動で入力する機能がありますが、人間の手で行う以上、入力漏れや表記揺れは必ず発生します。
これを解決するのが、「保存する瞬間に、VBAが自動で正しいデータを書き込む」という仕組みです。
匠が教える:Visioの「ドキュメントプロパティ」の裏側
Visioの裏側(Documentオブジェクト)には、ファイル自体の情報(メタデータ)を格納する場所が用意されています。実は、ここを操作するアプローチにはいくつかありますが、今回は最も堅牢で、ファイルフォーマット(VSDX)の仕様に依存せず安全に書き込める「Document.DocumentProperties」と、カスタムプロパティを格納する「Document.Info」を組み合わせた手法を使います。
—
現場で使える!メタデータ自動書き込みVBAコード
以下のコードを、VisioのVBE(Visual Basic Editor:`[Alt] + [F11]`)の「ThisDocument」モジュールに貼り付けてください。
標準モジュールではなく、`ThisDocument`(このドキュメント)に書くことが、ファイルイベント(保存時など)をフックする極意です。
Option Explicit
‘ ==============================================================================
‘ 処理名: Document_BeforeSave
‘ 概要 : 図面が保存される直前に自動発火し、メタデータを強制的に書き込む
‘ ==============================================================================
Private Sub Document_BeforeSave(ByVal Doc As IVDocument)
On Error GoTo ErrorHandler
‘ 予期せぬ無限ループや無駄なイベント発火を防ぐためのガード
Application.Settings.EventEnabled = False
Dim targetDoc As Visio.Document
Set targetDoc = Doc
‘ — 1. 標準ドキュメントプロパティへの書き込み —
With targetDoc.DocumentProperties
.Author = “設計部 自動化Bot” ‘ 作成者
.Manager = “インフラ開発課” ‘ 管理者・部署
.Category = “ネットワーク図” ‘ カテゴリ
.Company = “株式会社 匠エンジニアリング” ‘ 会社名
End With
‘ — 2. 組み込みのInfoプロパティへの書き込み(コメント欄の活用) —
‘ VisioのInfoプロパティは、Index番号でアクセスします
‘ visPropSubject (2): 主題
‘ visPropDescription (3): 説明
‘ visPropManager (5): マネージャー
targetDoc.Info(visPropSubject) = “PJ-202X-A-001” ‘ プロジェクトコードを埋め込み
targetDoc.Info(visPropDescription) = “自動生成されたシステム構成図です。更新日: ” & Format(Now, “yyyy/mm/dd HH:nn”)
‘ 変更を保存対象に含めるため、ドキュメントに「保存済み」フラグを強制しない(Visioが保存処理を継続するため)
GoTo Finally
ErrorHandler:
MsgBox “メタデータの自動書き込み中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “自動化エラー”
Finally:
‘ イベント監視を必ず再有効化する(これ忘れると二度とイベントが動かなくなるので注意!)
Application.Settings.EventEnabled = True
Exit Sub
End Sub
—
コードの注目ポイントと、初心者がハマりがちな罠
このコードには、実務で絶対に外せない「プロの知見」が詰まっています。いくつか重要なポイントを解説しますね。
1. なぜ `Document_BeforeSave` なのか?
「保存した後(`AfterSave`)」ではなく、「保存する前(`BeforeSave`)」を使っている点に注目してください。
保存する直前にプロパティを書き換えることで、「書き換わった最新のメタデータを含めた状態で、そのままファイルに保存」させることができます。これにより、「保存したのにメタデータが空っぽだった」という事故を防げます。
2. `Application.Settings.EventEnabled = False` の魔法
プロシージャの最初でイベントを無効化し、最後で有効化(`True`に戻す)していますよね。
これには深い理由があります。もし、コード内でプロパティを書き換えたことがキッカケで「また保存イベントが発火してしまう」と、最悪の場合、無限ループ(セーブの嵐)に陥ってVisioがフリーズします。
自動化コードを書くときは、「自分のコードが引き起こした変更で、自分を再起動させない」というガードが必須なのです。
3. エラーハンドリングと `Finally` のお作法
万が一エラーが発生した場合でも、`Application.Settings.EventEnabled = True` が実行されずに終わってしまうと、そのあとVisioのイベントが一切反応しなくなってしまいます(Visioが「耳抜き」できなくなるような状態です)。
そのため、`GoTo Finally` を使って、エラーが起きようとも絶対にイベントが再有効化される構造にしています。これは業務自動化の鉄則です。
—
動作確認してみましょう
1. Visioで新しい図面を開きます。
2. `[Alt] + [F11]` を押してVBEを開き、左側のプロジェクトツリーから `ThisDocument` をダブルクリックして、上記のコードを貼り付けます。
3. ファイルを適当な名前で「名前を付けて保存」します。
4. 保存後、再度ファイル情報([ファイル] > [情報] > [プロパティ] > [詳細プロパティ] など)を確認してみてください。
- 「作成者」に `設計部 自動化Bot`
- 「会社名」に `株式会社 匠エンジニアリング`
- 「主題」に `PJ-202X-A-001`
……ね?意図した通りにピタッとデータが刻み込まれているはずです。
—
まとめ:ここをクリアすればVisio VBAは怖くない!
今回は、保存時のイベントをフックしてメタデータを自動挿入するテクニックをご紹介しました。
- イベントプロシージャは `ThisDocument` に書く
- 無限ループを防ぐために `EventEnabled` を制御する
- エラー時でも環境を元に戻す(後始末を徹底する)
この3つさえ押さえておけば、単なるマクロの域を超えて、組織の運用ルールをシステムで強制する「真の業務自動化エンジニア」としてのコードが書けるようになります。
ぜひ、あなたの現場の図面管理ルールに合わせてカスタマイズし、日々の作業をスマートに自動化してみてくださいね。応援しています!
