【実務・中級編】【中級者向け】特定フォルダを監視し、新しいVSDXが保存された瞬間に自動でPDF変換を行う簡易フォルダ監視ツール – Visio VBA解析バイブル

スポンサーリンク

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の書き方ではなく、「どうすればシステムが壊れないか」という設計の深淵について語り合おう。

タイトルとURLをコピーしました