Visioの「自動化」を極める:フォルダ監視によるPDFリアルタイム変換の極意
「保存ボタンを押すたびに、PDFを手動で書き出すのはもうやめませんか?」
こんにちは。業務自動化の深淵へようこそ。
Visio VBAを使いこなすということは、単に図形を動かすことではありません。Visioという巨大なエンジンの「呼吸」を制御し、あなたの作業フローに完璧に同期させる技術です。
今回は、中級者へのステップアップとして、「特定のフォルダを監視し、VSDXが保存された瞬間に自動でPDFを生成する」という、実戦的な自動化ソリューションを構築します。
—
なぜVBAだけでは完結しないのか?
まず、重要な教訓を伝えます。「VBAは待機が得意ではない」ということです。
VisioのVBAだけでフォルダを監視しようとすると、無限ループでCPUを焼き尽くすか、Visioがフリーズするかの二択になります。
そこで、我々は「Windowsのファイルシステム監視(FileSystemWatcher)」をVB.NETで軽量な常駐アプリとして動かし、そこからVisioを操るという「司令塔と実行部隊」のアーキテクチャを採用します。
—
アーキテクチャの全体像
1. 監視役(VB.NET製): `FileSystemWatcher`を利用して、フォルダの「保存完了」イベントを検知。
2. 実行役(Visio VBA): 呼び出されたVisioが、対象ファイルを開き、PDFとしてエクスポート。
—
Step 1:司令塔(VB.NET)を構築する
このコードは、監視対象フォルダに`.vsdx`が生成・更新された瞬間にトリガーを引きます。
‘ シンプルなコンソールアプリとして作成してください
Imports System.IO
Module MonitorApp
Sub Main()
Dim watcher As New FileSystemWatcher(“C:\TargetFolder”)
watcher.Filter = “.vsdx”
watcher.EnableRaisingEvents = True
‘ ファイルが作成・保存されたらトリガー
AddHandler watcher.Changed, AddressOf OnChanged
Console.WriteLine(“監視中…”)
Console.ReadLine()
End Sub
Sub OnChanged(source As Object, e As FileSystemEventArgs)
‘ Visioを起動し、マクロを実行する命令を送る
Dim visio As Object = CreateObject(“Visio.Application”)
Dim doc As Object = visio.Documents.Open(e.FullPath)
‘ 魔法の呼び出し: PDF出力マクロを叩く
visio.Run(“ExportToPDF”)
doc.Close(False)
visio.Quit()
End Sub
End Module
—
Step 2:実行部隊(Visio VBA)の核心
Visio側には、呼び出される「PDF出力関数」を記述します。ここで重要なのは、「Visioのオブジェクトモデルを正しく閉じること」です。
‘ 標準モジュールに記述
Public Sub ExportToPDF()
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ PDF出力パスを生成(元のファイル名 + .pdf)
Dim pdfPath As String
pdfPath = Left(doc.FullName, InStrRev(doc.FullName, “.”) – 1) & “.pdf”
‘ VisioのPDFエクスポートメソッド
‘ 0 = visFixedFormatPDF
On Error Resume Next ‘ エラーハンドリングは必須
doc.ExportAsFixedFormat 0, pdfPath, 1, 0
If Err.Number <> 0 Then
Debug.Print “変換失敗: ” & Err.Description
End If
On Error GoTo 0
End Sub
—
陥りやすい罠と対策
1. 「ファイルが使用中です」エラー
`FileSystemWatcher`は、ファイルが書き込まれている「最中」にもイベントを発生させることがあります。
対策: `OnChanged`の中で、ファイルが完全に解放されるまで数ミリ秒待機するか、`Try-Catch`ブロックでリトライ処理を入れるのがプロの作法です。
2. Visioのバックグラウンド残留
コードで`visio.Quit()`を呼び出しても、処理が完了していないとVisioプロセスがタスクマネージャーに残ります。
対策: `Set doc = Nothing` および `Set visio = Nothing` を明示的に行い、オブジェクトの参照カウンタを確実にゼロにしてください。
—
最後に:なぜこれを学ぶのか
「自動化」の本質は、退屈な作業を機械に委ね、あなたは「より創造的な設計」に集中するための時間を確保することにあります。
今回の仕組みを構築できれば、あなたは単なる「マクロ使用者」から、「業務フローをデザインするアーキテクト」へと進化します。最初は複雑に見えるかもしれませんが、この疎結合な設計(監視と実行の分離)こそが、堅牢な自動化の鍵です。
さあ、恐れずに開発環境を開いてください。Visioのポテンシャルを解放するのは、あなた自身です。
—
次回の講義では、Visioの図形プロパティ(ShapeSheet)を直接操作し、メタデータをPDFのタグに反映させる高度なテクニックを解説します。お楽しみに。
