Visio VBAで実現する「図面とSQL Serverの完全同期」:現場を救うメタデータ管理術
こんにちは。自動化の深淵へようこそ。
図面(VSDX)を単なる「絵」として扱っていませんか?
プロの現場において、Visioファイルは「データコンテナ」です。図面の中に埋め込まれたカスタムプロパティ(シェイプデータ)と、背後のSQL Server上のマスターデータを乖離させないこと。これは、大規模な図面管理を行うエンジニアにとっての「聖杯」です。
今日は、Visioの保存イベントをトリガーに、DBと図面プロパティを双方向に同期させる、極めて実用的なロジックを伝授します。
—
1. なぜ「保存イベント」を狙い撃ちするのか
VBAで同期を行う際、ボタンを押して手動更新するような設計は、必ず「忘れる人」が現れて破綻します。
我々が実装すべきは、`DocumentBeforeSave` イベントです。ユーザーが「上書き保存」を押したその瞬間に、バックグラウンドでDBへの書き戻しを完了させる。これにより、「図面を開いているときは常に最新である」という信頼性を担保するのです。
—
2. 実装の設計図:イベントハンドラの配置
まず、`ThisDocument` オブジェクトにイベントを紐付けます。ここが全ての入り口です。
‘ ThisDocumentモジュールに記述
Option Explicit
‘ 保存前に発火するイベント
Private Sub Document_DocumentBeforeSave(ByVal doc As IVDocument)
‘ データベース同期ロジックを呼び出す
‘ 失敗しても保存を止めるか、警告を出すかの制御が必要です
On Error GoTo ErrorHandler
Call SyncVisioToSQL(doc)
Exit Sub
ErrorHandler:
MsgBox “DB同期に失敗しました: ” & Err.Description, vbCritical
End Sub
—
3. SQL Serverとの対話:ADOによる接続
Visio VBAからDBを叩くには `ADODB` ライブラリを使います。プロジェクトの「参照設定」で `Microsoft ActiveX Data Objects x.x Library` を追加してください。
SQL同期の核心ロジック
Public Sub SyncVisioToSQL(doc As IVDocument)
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim strConn As String
‘ 1. SQL Serverへの接続文字列
strConn = “Provider=SQLOLEDB;Data Source=YourServerName;Initial Catalog=DrawingDB;Integrated Security=SSPI;”
Set conn = New ADODB.Connection
conn.Open strConn
‘ 2. 図面プロパティから値を取得(例:図面ID)
Dim docID As String
docID = doc.DocumentSheet.Cells(“Prop.DrawingID”).ResultStr(“”)
‘ 3. DBへ更新クエリを送信
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandText = “UPDATE Drawings SET LastUpdated = GETDATE(), Status = ? WHERE DrawingID = ?”
.Parameters.Append .CreateParameter(“@Status”, adVarChar, adParamInput, 50, “Synced”)
.Parameters.Append .CreateParameter(“@ID”, adVarChar, adParamInput, 20, docID)
.Execute
End With
conn.Close
‘ オブジェクトの解放は忘れずに
Set conn = Nothing
End Sub
—
4. 陥りやすい罠:ここだけは押さえろ
この実装で初心者が必ずハマるポイントが2つあります。
① セル値の取得には `.ResultStr(“”)` を使え
Visioのシェイプシートは内部的に数式を持っています。「プロパティの値が欲しいのに数式が返ってくる」という事態を防ぐため、必ず `.ResultStr(“”)` を使い、評価済みの文字列を抽出してください。
② 非同期処理の「重さ」への配慮
ネットワーク環境が悪い場合、`DocumentBeforeSave` 内で重いDB処理を行うと、ユーザーは「Visioがフリーズした」と感じます。
- 対策: 可能であれば、同期処理を別プロセス(EXE)に切り出すか、最低限の項目だけを高速に書き込むようクエリを軽量化してください。
—
5. 次のステップへ
今回のコードは「図面→DB」のフローですが、反対に「DB→図面」を実装するには、図面を開くイベント `DocumentOpened` を使い、DBから取得した値で `doc.DocumentSheet.Cells(“Prop.DrawingID”).Formula = “…”` を上書きすればOKです。
Visio VBAをマスターするということは、単にコードを書くことではありません。「図面という静的なファイルに、動的な命を吹き込むこと」なのです。
最初は難しく感じるかもしれませんが、この「保存と同期」のサイクルを一度構築してしまえば、あなたの図面管理は劇的に洗練されます。まずは小さなプロパティ一つから、連携を試してみてください。
何かあればいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
