Visio VBAを「ただの自動化ツール」から「エンタープライズの核」へ昇華させる
こんにちは。業務自動化の深淵へようこそ。
多くの人がVisio VBAを「図形を並べるだけの玩具」だと思っています。しかし、それは大きな誤解です。Visioファイル(.vsdx)の実体は、実はXMLの塊です。これをSQL Serverと同期させることは、単なるマクロの域を超え、図面を「データコンテナ」として再定義することを意味します。
今回は、保存操作をトリガーにDBとメタデータを同期させる、プロフェッショナルなアーキテクチャの極意を伝授します。
—
なぜ「ドキュメントプロパティ」なのか?
Visioには「図面プロパティ(Document Properties)」という隠れた名機能があります。ここにメタデータを埋め込むことで、Visioを閉じてもデータが失われず、Windowsエクスプローラーの検索対象にすらなります。
ここをマスターすれば、「図面ファイルがデータベースの延長線上で動く」という、極めて堅牢なドキュメント管理システムが構築できます。
—
1. アーキテクチャの全体像
私たちが目指すのは以下の流れです。
1. Visioの保存イベントを捕捉する(`DocumentBeforeSave`イベント)
2. DBから最新のマスターデータを取得する(ADODBを利用)
3. Visioの「カスタムプロパティ」にデータを流し込む
4. 保存を許可する
—
2. 実装の要:DocumentBeforeSaveイベント
Visio VBAで最も重要なのは、`ThisDocument`モジュールを使いこなすことです。標準モジュールではなく、`ThisDocument`オブジェクトに記述するのが定石です。
‘ ThisDocument モジュールに記述してください
Private Sub Document_DocumentBeforeSave(ByVal doc As IVDocument)
‘ 保存時に自動実行されるイベントハンドラ
On Error GoTo ErrorHandler
‘ SQL Serverからメタデータを取得して埋め込む関数を呼び出し
Call SyncMetadataWithDatabase(doc)
Exit Sub
ErrorHandler:
MsgBox “同期に失敗しました: ” & Err.Description, vbCritical
‘ 必要に応じて保存をキャンセルするロジックをここに
End Sub
—
3. SQL Server連携とプロパティ更新の核
次に、外部データを取得し、図面のプロパティに書き込むコードを見てみましょう。`ADODB`ライブラリを参照設定に追加しておくことを忘れないでください。
Public Sub SyncMetadataWithDatabase(ByVal doc As Visio.Document)
Dim conn As Object
Dim rs As Object
Dim strConn As String
‘ SQL Server接続文字列(環境に合わせて変更)
strConn = “Provider=SQLOLEDB;Data Source=YourServer;Initial Catalog=YourDB;Integrated Security=SSPI;”
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)
conn.Open strConn
‘ 図面IDに基づきメタデータを取得
rs.Open “SELECT ProjectName, Version FROM DrawingMeta WHERE DrawingID = ‘” & doc.Name & “‘”, conn
If Not rs.EOF Then
‘ ドキュメントプロパティへの書き込み(DocumentSheetを利用)
‘ ※VisioのプロパティはDocumentSheetのUser-defined Cellsに格納するのが定石
Dim shp As Visio.Shape
Set shp = doc.DocumentSheet
‘ カスタムプロパティが存在しない場合は追加する処理が必要
shp.Cells(“User.ProjectName”).Formula = “””” & rs!ProjectName & “”””
shp.Cells(“User.Version”).Formula = “””” & rs!Version & “”””
End If
rs.Close
conn.Close
End Sub
—
4. 陥りやすい「罠」と解決策
① 保存の無限ループ
`DocumentBeforeSave`の中で`doc.Save`を呼ぶと、またイベントが発生し、無限ループに陥ります。イベント内で保存命令を出してはいけません。 あくまで「保存される直前のデータの書き換え」に専念してください。
② 参照設定の管理
`ADODB`を`CreateObject`で動的に生成することで、参照設定のズレによる実行時エラーを回避できます。これは大規模開発における鉄則です。
③ プロパティの初期化
`shp.Cells(“User.xxxx”)`が存在しない場合、エラーになります。事前に存在確認を行い、ない場合は`AddNamedRow`メソッドでセルを生成するガード節を必ず入れてください。
—
最後に:エンジニアとしての一歩先へ
「コードを動かす」段階から「システムを設計する」段階へ進むためには、「なぜそのイベントを使うのか」「なぜXML構造(DocumentSheet)を直接操作するのか」という問いに対する自分なりの解を持つことが重要です。
Visioはただの作図ソフトではありません。あなたの組織の業務フローを可視化し、データとして構造化するための最強のエンジンです。
ここをクリアすれば、あなたはもう「マクロを記録する人」ではありません。「図面をデータソースとして操るアーキテクト」の入り口に立っています。次回の記事では、PDF出力時にこのメタデータを自動的にスタンプとして埋め込む高度な制御について解説しましょう。
質問があれば、いつでもコメント欄へ。あなたの挑戦を応援しています。
