【Visio VBA極意】サブフォルダのVSDXを根こそぎPDF化!FSOで構築する堅牢な自動化エンジン
こんにちは。自動化の現場で、日々「泥臭い手作業」を「優雅なコード」に昇華させることに命をかけているエンジニアです。
Visioの図面がフォルダの奥深くに散らばっていて、一つずつ開いてPDFに出力する……そんな「修行」のような作業、まだ続けていますか?今回は、FileSystemObject (FSO) を使いこなし、サブフォルダまで再帰的に潜り込んで全ファイルをPDF化する、プロフェッショナルなツールを構築しましょう。
「マクロの記録」から一歩踏み出し、真の自動化エンジニアへと至る道筋を一緒に歩みます。
—
1. なぜ「FileSystemObject」なのか?
VBAには古くからある `Dir` 関数がありますが、再帰処理(フォルダの中にフォルダがある場合)を行うにはコードが複雑になりがちです。
一方で、FileSystemObject (FSO) は、ファイルシステムをオブジェクトとして扱うため、非常に直感的かつ強力です。
- 堅牢性: パス操作や存在確認がエラーを出しにくい。
- 拡張性: ファイルの作成日時やサイズでのフィルタリングも容易。
今回は、このFSOを心臓部に据えた「高耐久なバッチ処理エンジン」を組み上げます。
—
2. 構築するツールの全容
このコードは、指定したルートフォルダを起点に、中身を全て探し出し、Visioで開いてPDF保存し、閉じる……という一連のライフサイクルを自動化します。
事前準備:参照設定
VBAエディタ(Alt+F11)を開き、メニューの「ツール」→「参照設定」で以下にチェックを入れてください。
- Microsoft Scripting Runtime(これがFSOを使うための魔法の鍵です)
実装コード
Option Explicit
‘ 伝説的な自動化エンジニアによる、再帰的PDF変換エンジン
Public Sub ConvertAllVsdxToPdf()
Dim fso As New FileSystemObject
Dim rootFolder As String
‘ 変換したいルートフォルダを指定
rootFolder = “C:\Users\YourName\Documents\VisioProjects”
If Not fso.FolderExists(rootFolder) Then
MsgBox “指定されたフォルダが存在しません。”, vbCritical
Exit Sub
End If
‘ 再帰処理を開始
ProcessFolder fso.GetFolder(rootFolder), fso
MsgBox “全ての処理が完了しました!”, vbInformation
End Sub
‘ フォルダを巡回する再帰関数
Private Sub ProcessFolder(folder As folder, fso As FileSystemObject)
Dim file As file
Dim subFolder As folder
‘ 1. 現在のフォルダ内のVSDXをPDF変換
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “vsdx” Then
ExportToPdf file.Path
End If
Next
‘ 2. サブフォルダがあれば再帰的に呼び出し
For Each subFolder In folder.SubFolders
ProcessFolder subFolder, fso
Next
End Sub
‘ Visioを開いてPDF保存する実務用メソッド
Private Sub ExportToPdf(filePath As String)
Dim visApp As Visio.Application
Dim visDoc As Visio.Document
Set visApp = Application
Set visDoc = visApp.Documents.Open(filePath)
‘ PDF出力処理(パスを置換して保存)
Dim pdfPath As String
pdfPath = Replace(filePath, “.vsdx”, “.pdf”)
‘ ExportAsFixedFormatはVisio自動化の王道メソッド
visDoc.ExportAsFixedFormat visFixedFormatPDF, pdfPath
‘ オブジェクトの解放(ここがメモリ管理の要!)
visDoc.Close
Set visDoc = Nothing
End Sub
—
3. コードの「魂」を読み解く
① 再帰関数の仕組み
`ProcessFolder` メソッドの中で、自分自身を呼び出しているのがポイントです。これにより、フォルダが何階層深くなっても、Visioは迷うことなく奥底のファイルを見つけ出します。
② メモリの管理(重要)
`Set visDoc = Nothing` を必ず行ってください。Visioのドキュメントを大量に開く際、この解放を忘れるとメモリリークを起こし、PCが重くなったり、最悪の場合はVisioがクラッシュします。「開いたら閉じる」というオブジェクトのライフサイクルを管理することこそ、プロの作法です。
③ なぜ `LCase` を使うのか?
ファイル拡張子は `.VSDX` だったり `.vsdx` だったりします。`LCase` で小文字に統一して比較することで、どんな表記揺れにも対応できる「頑丈な」コードになります。
—
4. 陥りやすい罠と対策
- パスの権限エラー: 会社共有サーバーの深い階層などで、読み取り権限がないフォルダに当たるとエラーで停止します。必要に応じて `On Error Resume Next` を活用し、スキップするロジックを加えるとより堅牢になります。
- Visioの警告ダイアログ: ファイルを開く際に「警告」が出る場合、`visApp.AlertResponse = 7` (Noを選択) のように設定して、自動化を止めない工夫が必要になることもあります。
—
まとめ:あなたの武器にしよう
今回のツールは単なるPDF変換機ではありません。「指定したルールでファイルシステムを探索し、対象を特定し、アプリケーションを操作して結果を出力する」 という、業務自動化の基本テンプレートです。
このロジックを理解すれば、PDF変換だけでなく、図面内のテキストの一括置換や、プロパティの自動書き出しなど、どんな応用も思いのままです。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ」
次回の作業からは、このコードを走らせて、コーヒーでも飲みながら完了を待ってください。それが、エンジニアの正しい姿です。質問があればいつでもどうぞ。あなたの自動化ライフを心から応援しています。
