Visioオートメーションの深淵:FSOと非表示プロセスで構築する「PDF一括変換エンジン」の極意
業務自動化の世界において、VisioのPDF変換は「鬼門」として知られている。画面が勝手にポップアップし、意図せぬダイアログで処理が停止する。多くのエンジニアがこの「Visioの気まぐれ」に疲弊し、結局手作業に戻ってしまう。
だが、設計思想さえ正しければ、Visioは極めて従順なサーバーエンジンと化す。今回は、FileSystemObject(FSO)を駆使してディレクトリを再帰的に走査し、一切のUIを排除した状態でPDFを量産する、プロダクションレベルのコードを伝授する。
—
1. なぜ「非表示起動」が必須なのか
初心者は `Visio.Application` を起動し、そのまま放置する。これはメモリリークと不安定なプロセスの温床だ。
- UI表示コスト: 描画処理はCPUとメモリを著しく消費する。バッチ処理においては、描画は無駄でしかない。
- ダイアログ地獄: ファイルの破損やリンク切れが発生した際、ダイアログが出る。これを放置すると、プログラムは永久に終了しない。
- 堅牢な設計: `Invisible` モードで起動し、エラーハンドリングを徹底することで、深夜の無人運用に耐えうるエンジンを構築する。
—
2. 実装の要諦:プロダクションコード
以下のコードは、単なるスクリプトではない。エラー発生時にプロセスを確実に殺し、メモリを解放する「ライフサイクル管理」を意識した実装だ。
Option Explicit
‘ 参照設定: Microsoft Scripting Runtime (FSO用)
‘ Microsoft Visio 16.0 Type Library
Public Sub BatchExportPdf()
Dim fso As New FileSystemObject
Dim targetFolder As String
Dim appVisio As Visio.Application
targetFolder = “C:\Target\VSDX_Folder”
‘ Visioアプリの非表示起動
Set appVisio = New Visio.Application
appVisio.Visible = False
appVisio.AlertResponse = 7 ‘ ダイアログが出たら「キャンセル/No」を自動選択
On Error GoTo Cleanup
‘ 再帰処理の開始
ProcessFolder fso.GetFolder(targetFolder), appVisio
MsgBox “全ファイルのPDF変換が完了しました。”, vbInformation
Cleanup:
If Err.Number <> 0 Then Debug.Print “Error: ” & Err.Description
If Not appVisio Is Nothing Then
appVisio.Quit
Set appVisio = Nothing
End If
End Sub
Private Sub ProcessFolder(folder As Folder, appVisio As Visio.Application)
Dim file As file
Dim subFolder As Folder
Dim doc As Visio.Document
Dim pdfPath As String
‘ ファイル走査
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “vsdx” Then
Set doc = appVisio.Documents.Open(file.Path)
‘ PDF出力パスの生成
pdfPath = fso.BuildPath(file.ParentFolder, fso.GetBaseName(file.Name) & “.pdf”)
‘ エクスポート実行
doc.ExportAsFixedFormat visFixedFormatPDF, pdfPath, visDocFromAllPages, visDocPublishAll
doc.Close
End If
Next
‘ サブフォルダも再帰的に処理
For Each subFolder In folder.SubFolders
ProcessFolder subFolder, appVisio
Next
End Sub
—
3. 実務で勝つための「3つの絶対鉄則」
① `AlertResponse` を制御せよ
Visioはデフォルトで「フォントが見つかりません」「マクロを有効にしますか?」といったダイアログを出す。`appVisio.AlertResponse = 7` を設定することで、これらをすべて「いいえ(No)」として自動処理し、プロセス停止を防ぐ。これは必須の作法だ。
② プロセスリークは「死」と同義
`appVisio.Quit` を確実に呼ぶこと。エラーが発生してプログラムが落ちても、タスクマネージャーに `VISIO.EXE` が残るようではアーキテクト失格だ。必ず `On Error GoTo` で終了処理をラップし、異常系でもプロセスが確実に終了するパスを担保せよ。
③ PDF変換のパフォーマンスチューニング
大量のファイルを処理する場合、Visioのオブジェクトを毎回 `Open/Close` するとオーバーヘッドが大きい。もしファイル数が数千を超える場合は、一度起動したVisioインスタンスを使い回す現在の設計は正しいが、メモリ使用量を監視し、一定ファイル数ごとにプロセスを再起動するような「リサイクル戦略」も視野に入れるべきだ。
—
最後に:自動化の真髄
自動化とは、単にコードを書くことではない。「エラーが起きない状態」を設計し、万が一エラーが起きても「システム全体を停止させない」ための防波堤を築くことだ。
今回紹介したコードは、あくまで「骨子」である。実務ではここにログ出力機能を追加し、どのファイルで変換が失敗したかを追跡できるようにすべきだ。技術は手段に過ぎない。君たちの自動化プロジェクトが、退屈な手作業からエンジニアを解放することを願っている。
健闘を祈る。
