VisioとSQL Serverを同期せよ:VBAによる「真の」図面ライフサイクル管理
Visioの図面を単なる「絵」として扱っているうちは、自動化の恩恵の半分も享受できていない。図面はデータであり、そのデータはエンタープライズの基幹システム(SQL Server)と一元化されるべきだ。
今日は、Visioの保存イベントをトリガーに、図面内のカスタムプロパティをSQL Serverへ書き戻し、常に情報の鮮度を担保する「双方向同期」の設計論を授ける。
—
1. なぜ「保存時イベント」なのか
多くのエンジニアが犯す最大の過ちは、ユーザーに「同期ボタン」を押させることだ。人は忘れるし、間違える。エンジニアの責務は、ユーザーの操作を介さずに状態を確定させることにある。
Visioの `Document.BeforeDocumentSave` イベントをフックすることで、保存が試行される直前にデータベースとの整合性を強制する。これが堅牢なシステム構築の第一歩だ。
—
2. アーキテクチャの要点:切断と接続の極意
VBAからSQL Serverへ接続する際、最も注意すべきは「タイムアウト」と「リソースリーク」だ。
- 接続文字列の外部化: コード内に直書きは論外。環境変数か、隠しシートのセルに保持せよ。
- ADOの明示的クローズ: `ADODB.Connection` は、処理が終わるたびに必ず `Close` し、`Nothing` をセットする。Visioはメモリ管理が繊細であり、接続を放置すれば図面自体が不安定になる。
—
3. 実装:プロダクションコード
以下のコードを `ThisDocument` モジュールに配置せよ。
‘ ———————————————————
‘ 概要: 保存直前にカスタムプロパティをSQL Serverへ同期
‘ 依存: Microsoft ActiveX Data Objects 6.x Library
‘ ———————————————————
Private Sub Document_BeforeDocumentSave(ByVal doc As IVDocument)
On Error GoTo ErrorHandler
Dim conn As Object
Dim cmd As Object
Dim strConn As String
‘ SQL接続文字列 (実際には構成管理ファイル等から取得すること)
strConn = “Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;”
Set conn = CreateObject(“ADODB.Connection”)
conn.Open strConn
‘ 図面のDocumentプロパティを取得
Dim docName As String: docName = doc.Name
Dim docVersion As String: docVersion = doc.CustomProps(“Version”).Value
‘ SQL実行: Upsert (存在しなければInsert、あればUpdate)
Set cmd = CreateObject(“ADODB.Command”)
With cmd
.ActiveConnection = conn
.CommandText = “usp_UpdateDrawingMetadata”
.CommandType = 4 ‘ adCmdStoredProc
.Parameters.Append .CreateParameter(“@DocName”, 200, 1, 255, docName)
.Parameters.Append .CreateParameter(“@Version”, 200, 1, 50, docVersion)
.Execute
End With
conn.Close
Exit Sub
ErrorHandler:
MsgBox “同期失敗: ” & Err.Description, vbCritical
‘ 必要に応じて保存をキャンセルするロジックをここに挿入
End Sub
—
4. 運用上の「罠」と解決策
A. ネットワーク遅延による「保存のフリーズ」
上記のコードは保存プロセスに同期的に割り込む。SQL Serverの応答が遅いと、ユーザーは「Visioが固まった」と感じる。
解決策: タイムアウト値を短く設定し、失敗した場合はログを残して非同期処理(別途バックグラウンドで走るPowerShellスクリプト等)へフォールバックさせる設計を推奨する。
B. コンフリクトの回避
複数人が同時に同じ図面を触る環境では、楽観的排他制御(`Version`カラムによる整合性チェック)が必須だ。SQL側で `UPDATE … WHERE Version = @OldVersion` を行い、影響行数が0なら競合エラーを発生させよ。
C. PDF出力の自動化
図面保存時にPDFを生成したい場合、`doc.ExportAsFixedFormat` を使うのがモダンな作法だ。これも同期処理の最後に組み込むことで、ドキュメント管理システム(DMS)への自動登録フローが完結する。
—
最後に:エンジニアとしての矜持
VBAはレガシーではない。使い手次第で、それは高度なシステム制御のインターフェースとなる。
今回提示したコードは、あくまで「動く最小単位」だ。実戦では、ここにエラーログの集約、接続のリトライロジック、そして何より「失敗した時にユーザーにどう伝えるか」というUXの設計を積み重ねること。
ツールを作るのではない。業務の「あり方」を設計するのだ。健闘を祈る。
