【実務・中級編】【中級者向け】FSOを活用したフォルダ内の全VSDXファイル一括オープンと一括PDF出力 – Visio VBA解析バイブル

スポンサーリンク

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インスタンスを使い回す現在の設計は正しいが、メモリ使用量を監視し、一定ファイル数ごとにプロセスを再起動するような「リサイクル戦略」も視野に入れるべきだ。

—

最後に:自動化の真髄

自動化とは、単にコードを書くことではない。「エラーが起きない状態」を設計し、万が一エラーが起きても「システム全体を停止させない」ための防波堤を築くことだ。

今回紹介したコードは、あくまで「骨子」である。実務ではここにログ出力機能を追加し、どのファイルで変換が失敗したかを追跡できるようにすべきだ。技術は手段に過ぎない。君たちの自動化プロジェクトが、退屈な手作業からエンジニアを解放することを願っている。

健闘を祈る。

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