Visio自動化の極意:フォルダ監視による「リアルタイムPDF変換エンジン」の構築
エンジニア諸君。Visioの「名前を付けて保存」を毎日手動で繰り返していないか?
もしそうなら、君はエンジニアではなく「クリック作業員」だ。我々が目指すべきは、システムが自律的に動き、人間は創造的な仕事に集中する環境だ。
今回は、特定のフォルダを監視し、VSDXが置かれた瞬間にPDFへ変換する「常駐型自動化エンジン」の設計思想を叩き込む。
—
1. なぜ「タイマー監視」ではいけないのか
VBAの`OnTime`メソッドを使って1分おきにフォルダを走査するコードを書いて満足している者がいるが、それは「低次元な実装」だ。
リソースを無駄に食い、ファイルロックの競合リスクを生む。真に堅牢な設計とは、Windows OSのファイルシステムイベント(FileSystemWatcher)をフックし、「イベントが発生したその瞬間」にトリガーを引くことだ。
今回は、軽量なVB.NETのコンソールアプリ(常駐監視)をフロントに据え、Visioのインスタンスを背後で操るアーキテクチャを採用する。
—
2. アーキテクチャの核心:VB.NETによる監視エンジン
まず、Windowsの`FileSystemWatcher`を利用する。VBA単体で完結させようとするとOSレベルのイベントを拾えず、無限ループの爆弾を抱えることになる。
監視用コード(VB.NET / コンソールアプリ)
このコードをビルドしてバックグラウンドで動かすのが、最も安定する。
Imports System.IO
Module MonitorModule
‘ 監視対象フォルダ
Private Const WatchPath As String = “C:\VisioWork\Input”
Sub Main()
Dim watcher As New FileSystemWatcher(WatchPath, “.vsdx”)
AddHandler watcher.Created, AddressOf OnFileCreated
watcher.EnableRaisingEvents = True
Console.WriteLine(“監視を開始しました…”)
Console.ReadLine()
End Sub
Private Sub OnFileCreated(sender As Object, e As FileSystemEventArgs)
‘ ファイルが完全に書き込まれるまで待機
Threading.Thread.Sleep(2000)
‘ VBAのプロシージャを呼び出す(Visioを開くトリガー)
Dim visioApp = CreateObject(“Visio.Application”)
Dim doc = visioApp.Documents.Open(e.FullPath)
‘ PDF出力(パスは出力先へ変更)
doc.ExportAsFixedFormat(1, “C:\VisioWork\Output\” & Path.GetFileNameWithoutExtension(e.Name) & “.pdf”, 0, 0)
doc.Close()
visioApp.Quit()
Console.WriteLine($”変換完了: {e.Name}”)
End Sub
End Module
—
3. Visio VBA:プロダクション品質の「PDF変換ロジック」
上記のVB.NETから呼び出される、あるいはVisio側でトリガーされる変換処理は、「エラーハンドリング」と「状態管理」が全てだ。Visioは不意にダイアログを出してプログラムを止める。これを潰すのがプロの仕事だ。
‘ Visio VBA モジュール
Public Sub ExportToPDF_Robust(ByVal strSource As String, ByVal strDest As String)
On Error GoTo ErrorHandler
‘ 1. ダイアログ抑制(バックグラウンド処理の鉄則)
Application.AlertResponse = 7
Dim doc As Visio.Document
Set doc = Application.Documents.Open(strSource)
‘ 2. 固定形式でのエクスポート
‘ visFixedFormatPDF = 1, visDocExIntentPrint = 0
doc.ExportAsFixedFormat 1, strDest, 0, 0
doc.Close SaveChanges:=False
‘ 3. 後始末
Application.AlertResponse = 0
Exit Sub
ErrorHandler:
‘ ログ出力の仕組みをここに組み込む
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
Resume Next
End Sub
—
4. 現場で生き残るための「極限の知見」
① 「ファイルロック」という名の悪魔
Windowsがファイルを移動・保存している最中にVisioがファイルを開こうとすると、十中八九「アクセス拒否」エラーが出る。VB.NET側で`FileStream`を`FileAccess.Read`で開き、例外が出なくなるまでリトライを繰り返すループを組むのが、最も堅牢な回避策だ。
② Visioインスタンスの「墓場」を作らない
`CreateObject`で生成したVisioインスタンスを終了させる際、`doc.Close`だけでは不十分な場合がある。`Application.Quit`を必ず呼び出し、メモリリークを阻止せよ。サーバー環境であれば、`TaskKill /F /IM Visio.exe`を終了処理に組み込むくらいの潔さが必要だ。
③ データベース連携の罠
もしファイル名やメタデータをDBに記録するなら、「ファイル変換が成功した後にのみ」DB書き込みを行え。ファイルシステムとDBの整合性が崩れると、リカバリー不能な負債となる。
—
結論:自動化は「設計」が9割
コードを書くのは最後でいい。まずは「どのタイミングで」「どのような例外が発生し」「どう復旧させるか」というライフサイクルを紙の上で描き切れ。
今回提示した「ファイルシステム監視 + Visio常駐制御」のモデルは、中規模の業務自動化において最も安定して稼働する構成だ。これをベースに、君たちの現場の要件に合わせて磨き上げてほしい。
質問があれば受け付ける。ただし、基礎的なVBAの書き方ではなく、「どうすればシステムが壊れないか」という設計の深淵について語り合おう。
