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

スポンサーリンク

Visio自動化の極意:FSOと非表示制御で実現する「PDF一括変換バッチ」の構築

こんにちは。業務自動化の世界へようこそ。
「マクロの記録」で生成される冗長なコードに別れを告げ、Visioの心臓部を直接操作する領域へ足を踏み入れましょう。

今回は、エンジニアの現場で最も需要の高い「指定フォルダ内のVSDXファイルを全自動でPDFへ変換する」というタスクを題材に、Visio VBAの本質的な制御術を伝授します。

—

1. なぜ「FileSystemObject (FSO)」を使うのか?

Visio VBAでファイルを扱う際、標準の`Dir`関数を使う人もいますが、私は断じて推奨しません。
`FSO`(Microsoft Scripting Runtime)を使うべき理由は明白です。

  • 堅牢性: 再帰処理(サブフォルダ内の検索)が極めて容易。
  • オブジェクト指向: ファイルやフォルダを「モノ(オブジェクト)」として扱えるため、プロパティ操作のミスが激減する。
  • 可読性: コードが構造的になり、後から見た時のメンテナンスコストが劇的に下がる。

自動化の本質は「書くこと」ではなく「運用し続けること」にあります。FSOはそのための最強のパートナーです。

—

2. 実践:VSDX一括PDF変換スクリプト

このコードは、指定したフォルダ内にある全ての`.vsdx`ファイルを探し出し、Visioを裏側で静かに起動してPDFを吐き出す「プロ仕様」の雛形です。

Option Explicit

‘ 参照設定: Microsoft Scripting Runtime を有効にしてください
‘ Microsoft Visio XX.0 Type Library も必須です

Public Sub BatchConvertVSDXToPDF()
Dim fso As New FileSystemObject
Dim targetFolder As Folder
Dim visApp As Visio.Application
Dim doc As Visio.Document
Dim folderPath As String

‘ 変換したいフォルダを指定
folderPath = “C:\Projects\VisioDrawings”

‘ 1. Visioアプリケーションの起動(非表示で実行)
Set visApp = New Visio.Application
visApp.Visible = False
visApp.AlertResponse = 7 ‘ ダイアログを自動的に「いいえ」で閉じる(エラー停止防止)

Set targetFolder = fso.GetFolder(folderPath)

‘ 2. フォルダ内の全ファイルをループ処理
Call ProcessFolder(targetFolder, visApp)

‘ 3. 後処理
visApp.Quit
Set visApp = Nothing

MsgBox “全ファイルのPDF変換が完了しました。”, vbInformation
End Sub

Private Sub ProcessFolder(folder As Folder, visApp 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 = visApp.Documents.Open(file.Path)

‘ PDF出力(フルパスで保存)
pdfPath = fso.GetParentFolderName(file.Path) & “\” & _
fso.GetBaseName(file.Path) & “.pdf”

doc.ExportAsFixedFormat visFixedFormatPDF, pdfPath, visDocExAllPages

doc.Close
End If
Next file

‘ 再帰処理:サブフォルダも対象にする場合
For Each subFolder In folder.SubFolders
Call ProcessFolder(subFolder, visApp)
Next subFolder
End Sub

—

3. 知的エンジニアが知っておくべき「3つの落とし穴」

このコードを動かす際、初心者が必ず直面する「壁」があります。ここを突破すれば、あなたはもう中級者の入り口に立っています。

① `AlertResponse` の重要性

Visioはファイルを開く際、「リンクが切れています」「図形が更新されています」といったダイアログを出しがちです。これを放置すると、自動化プロセスがダイアログ待ちで永久に停止します。`visApp.AlertResponse = 7` は、いわば「全ての質問に勝手に『いいえ』と答えておいてくれ」という命令です。

② 非表示起動(Visible = False)の功罪

非表示で起動すると、処理速度は向上しますが、エラー時にVisioのプロセスだけがメモリに残る「ゾンビ化」が起きやすくなります。必ず`On Error`でトラップを張り、エラー発生時でも`visApp.Quit`が呼ばれるように設計しましょう。

③ 参照設定の重要性

コード内で`New Visio.Application`と書くためには、VBAエディタの「ツール」→「参照設定」から「Microsoft Visio XX.0 Type Library」にチェックを入れる必要があります。これを怠ると「ユーザー定義型は定義されていません」というエラーで悩み続けることになります。

—

結論:自動化は「設計」で決まる

今回紹介したコードは、あくまで「型」です。現場では、ここから「特定のページだけ出力したい」「PDFのプロパティを細かく制御したい」といった要求が必ず出てきます。

Visio VBAは、オブジェクトモデル(Application > Document > Page > Shape)さえ理解してしまえば、怖いものはありません。まずはこの一括処理を動かし、「自分の手を使わずにファイルが変換されていく快感」を体感してください。

ここをクリアしたあなたは、もう「マクロの記録」に頼る必要はありません。次のステップとして、Visioのシェイプデータ(プロパティ)をExcelに書き出すような、より高度な操作へ進んでいきましょう。

応援しています。あなたの手元で、最高にクールな自動化が動くことを期待しています。

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