【入門編】【中級者向け】FSOとDir関数を組み合わせた、サブフォルダを含む全VSDXファイルの再帰的PDF変換ツール – Visio VBA解析バイブル

スポンサーリンク

【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の基本はバッチリですよ」

次回の作業からは、このコードを走らせて、コーヒーでも飲みながら完了を待ってください。それが、エンジニアの正しい姿です。質問があればいつでもどうぞ。あなたの自動化ライフを心から応援しています。

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