こんにちは!Visioの図面管理、日々の業務でお疲れ様です。
「あの図面の最新の版数っていくつだっけ?」「作成部署のハンコ(メタデータ)が古いまま放置されている……」
そんな絶望的な状況に直面したことはありませんか?複数の図面を扱う現場において、図面の「メタデータ(図面情報)」の管理は永遠の課題です。
今回は、マクロの記録の先へ進みたいあなたへ向けて、Visioの心臓部である`Document.CustomDocumentProperties`(ドキュメントのカスタムプロパティ)を完全に手なづける方法を伝授します。
ここをクリアすれば、あなたも単なる「VBAの初心者」から「業務自動化のアーキテクト」への第一歩を踏み出せますよ。さあ、一緒にVisio VBAの深淵を覗いてみましょう!
—
1. なぜ「図面のメタデータ管理」にDocumentオブジェクトを使うのか?
Visioで図面を描くとき、私たちは無意識に「Shape(図形)」ばかりに目を奪われがちです。しかし、プロのエンジニアは「Document(ファイル全体)」を見ます。
図面全体のメタデータ(版数、作成部署、最終更新者など)を個別の図形に持たせてはいけません。なぜなら、図形が削除されたり、新しいページが追加されたりしたときにデータが散逸してしまうからです。
ファイルそのものが持つ記憶領域――それが`Document.CustomDocumentProperties`です。
0からわかるオブジェクトの階層構造
VisioのVBAの世界は、マトリョーシカ構造になっています。
Application(Visioアプリ全体)
└─ Document(今開いているファイル)
├─ Page(図面のページ)
└─ CustomDocumentProperties(★今回使うファイルの頭脳・メタデータ倉庫)
この「ファイルの頭脳」にアクセスできるようになると、VBAを使ってファイル単位で情報を一括管理・自動書き込みできるようになります。
—
2. 現場で使える!メタデータ自動書き込み・一括管理の実装コード
それでは、開発の現場でそのままコピペして使える実用コードを公開します。
このコードは、「図面を開いたとき(あるいはマクロを実行したとき)」に、作成部署や版数、最終更新日時を自動的にチェックし、存在しなければ新規作成、存在すれば最新情報にアップデートする賢いプログラムです。
Sub ManageDrawingMetadata()
‘ =====================================================================
‘ 目的: Documentのカスタムプロパティを活用し、図面メタデータを自動管理する
‘ 著者: チーフアーキテクト
‘ =====================================================================
Dim docTarget As Visio.Document
Dim props As Visio.CustomProperties
‘ エラーハンドリングの基本:トラブル時に処理を止めず安全に抜ける
On Error GoTo ErrorHandler
‘ 対象ドキュメントを「現在アクティブな図面」に設定
Set docTarget = ActiveDocument
‘ ドキュメントのカスタムプロパティコレクションを取得
Set props = docTarget.CustomDocumentProperties
‘ 1. 「作成部署」プロパティの書き込み・更新
Call SetOrUpdateProperty(props, “Department”, msoPropertyTypeString, “第一システム開発部”)
‘ 2. 「版数」プロパティの書き込み・更新
Call SetOrUpdateProperty(props, “Revision”, msoPropertyTypeString, “Ver.1.02”)
‘ 3. 「最終更新日時」プロパティの書き込み・更新(現在時刻を自動取得)
Call SetOrUpdateProperty(props, “LastUpdated”, msoPropertyTypeDate, Now)
‘ 完了メッセージ
MsgBox “図面メタデータの更新が完了しました。”, vbInformation, “メタデータ管理”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
‘ =====================================================================
‘ 補助プロシージャ: プロパティが存在すれば更新、なければ新規作成する汎用関数
‘ =====================================================================
Private Sub SetOrUpdateProperty(ByRef props As Visio.CustomProperties, _
ByVal propName As String, _
ByVal propType As MsoDocProperties, _
ByVal propValue As Variant)
Dim propItem As Office.DocumentProperty
Dim isExist As Boolean
isExist = False
‘ 既存のプロパティをスキャンして探す
For Each propItem In props
If propItem.Name = propName Then
isExist = True
Exit For
End If
Next propItem
‘ 存在する場合は値を上書き、存在しない場合は新規追加
If isExist Then
props(propName).Value = propValue
Else
props.Add Name:=propName, LinkToSource:=False, Type:=propType, Value:=propValue
End If
End Sub
コードのここがポイント!
- `On Error GoTo ErrorHandler`: VBAの世界では予期せぬエラーがつきもの。現場で動かすコードには必ずエラーハンドリングを仕込みましょう。
- `SetOrUpdateProperty`(ヘルパー関数): 「あるかどうか分からないなら、探して無ければ作ればいい」というエンジニアリングの基本思想を体現した関数です。これがあるおかげで、何度マクロを実行してもエラーになりません。
—
3. 初学者が陥りやすい「罠」と回避の極意
Visio VBAを学び始めたエンジニアが、必ずと言っていいほどハマる「罠」があります。先回りして回避策をお伝えしておきますね。
罠1:参照設定の抜け落ち(コンパイルエラー)
今回のコードでは `MsoDocProperties` や `Office.DocumentProperty` という型を使用しています。これらはMicrosoft Office共通のライブラリ(Office Object Library)に依存しています。
もしコードを貼り付けて「ユーザー定義型は定義されていません」と怒られたら、VBAエディタのメニューから [ツール] > [参照設定] を開き、「Microsoft Office 16.0 Object Library(数字はバージョンにより異なる)」にチェックを入れてください。
罠2:「ActiveDocument」と「ThisDocument」の混同
- `ActiveDocument`: ユーザーが今「アクティブ」にしている(フォーカスが当たっている)図面を指します。
- `ThisDocument`: このVBAコードが書かれているファイル自身を指します。
今回の自動化のように「今開いている図面にメタデータを仕込みたい」という場合は、確実に `ActiveDocument` を使うのが安全です。
—
4. さらに実用性を高めるために(応用へのステップ)
このメタデータ管理を極めると、次のような「真の自動化」へ進むことができます。
1. 保存時(`DocumentBeforeSave`イベント)のフック:
ユーザーが「上書き保存」ボタンを押した瞬間をVBAで検知し、自動的に「版数」をインクリメント(+0.01など)させたり、「最終更新日時」を現在時刻に強制書き換えしたりする。
2. 複数図面の一括処理(バッチ処理):
特定のフォルダ内にあるすべての `.vsdx` ファイルをVBAで自動的に開き、このメタデータ書き込みスクリプトを走らせて一斉保存して閉じる。
—
まとめ:ここをクリアすれば、Visio VBAの基本はバッチリです!
今回は `Document.CustomDocumentProperties` を使った図面メタデータの自動管理について解説しました。
- 図面の情報は「個別の図形」ではなく「Document」に持たせる。
- 「探す・なければ作る(SetOrUpdate)」のロジックでコードを堅牢にする。
- 参照設定やオブジェクトのスコープ(ActiveDocument)に気をつける。
ここをマスターできれば、単なる作業の自動化を超えて、「組織全体の図面資産をコントロールするアーキテクト」としてのスキルが身についています。
ぜひ自分の環境でコードを動かして、その強力さを体感してみてください。あなたの自動化ライフが、より一層素晴らしいものになることを応援しています!
