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に書き出すような、より高度な操作へ進んでいきましょう。
応援しています。あなたの手元で、最高にクールな自動化が動くことを期待しています。
