【入門編】【全対象】複数のVisio図面を結合して1つのPDFにするためのVBA連携術 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩抜け出し、「自分の手でシステムをコントロールしたい」と願うあなたを、今日は最高峰の自動化の世界へご案内します。

現場でよくあるこんなお悩み、ありませんか?
「複数のVSDX(Visio)ファイルがあって、それぞれ最新の状態にしてPDF化しなきゃいけない。しかも、それを1つのPDFにキレイにまとめたい……。手作業でやると、開いて、エクスポートして、結合ソフトに放り込んで……って、気が狂いそう!」

大丈夫。その絶望的な単純作業、Visio VBAとAdobe Acrobatの連携で、ワンクリックの「完全自動化」に仕立て上げましょう。
ここをクリアすれば、あなたのVBAスキルは間違いなく一段階上のステージに到達します。さあ、一緒に本質を学んでいきましょう!

—

1. 全体像の把握:なぜ「Visio単体」ではPDF結合ができないのか?

まず最初に、Visio VBAの限界と、今回のアーキテクチャの核心を押さえておきます。

Visioというアプリケーションは、非常に優秀な図面作成・エクスポートツールです。VBAを使えば、プログラムから「この図面をPDFとして保存しなさい」と命令(`ExportAsFixedFormat`メソッド)することは朝飯前です。

しかし、Visioには「複数の独立したPDFファイルを1つに結合する機能」はありません。

そこでどうするか?
「VisioのVBAから、OS上でPDFを操る最強の黒幕——Acrobat(Adobe Acrobat)の機能、あるいは専用のPDF操作ライブラリを裏で呼び出す」という連携プレイを行います。

今回構築する自動化のフロー

1. 指定したフォルダ内にある複数のVSDXファイルを順番に開く。
2. それぞれを個別のPDFとして一時保存する。
3. すべてのPDFが出揃ったら、AcrobatのCOMオブジェクト(またはAPI)を使ってそれらを1つのPDFに結合する。
4. 開いたVisioファイルを保存せずにスマートに閉じ、一時ファイルを掃除する。

この一連の流れを、たった一つのマクロで完結させます。

—

2. 開発の準備:参照設定の魔法を知る

VBAでAcrobatを操るためには、VBAのエディタ(VBE)に「Acrobatを使いますよ」と教える必要があります。これを参照設定と呼びます。

参照設定の手順

1. Visioを開き、`[Alt] + [F11]` でVBE(Visual Basic Editor)を開きます。
2. メニューの [ツール] > [参照設定] をクリックします。
3. 一覧の中から 「Adobe Acrobat XX.X Type Library」 (XX.Xはお使いのバージョンによって異なります)を探してチェックを入れ、[OK]を押します。

> 💡 先輩エンジニアからの知見
> この参照設定をしておくことで、コードを書くときに「入力補助(インテリセンス)」が効くようになり、記述ミスを激減させることができます。プログラミングの効率が段違いになるので、必ず行いましょう。

—

3. 実装コード:一撃でファイルを結合するVBAマクロ

お待たせしました。実務でそのままコピー&ペーストして、パスを書き換えるだけで動く実用的なコードをプレゼントします。

Sub CombineVisioFilesToSinglePDF()
Dim wsShell As Object
Dim fso As Object
Dim targetFolder As String
Dim pdfList As Collection
Dim vsoDoc As Visio.Document
Dim file As Object
Dim vsdPath As String
Dim tempPdfPath As String
Dim finalPdfPath As String
Dim jso As Object
Dim pdDocMaster As Object
Dim pdDocTemp As Object
Dim i As Long

‘ — 【設定エリア】環境に合わせてパスを変更してください —
targetFolder = “C:\MyVisioFiles\” ‘ 結合したいVSDXが入っているフォルダ
finalPdfPath = “C:\MyVisioFiles\Combined_Output.xlsx” ‘ ではなくてPDFですね!
finalPdfPath = “C:\MyVisioFiles\Combined_Output.pdf” ‘ 最終的に出力されるPDF
‘ ———————————————————

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set pdfList = New Collection

‘ フォルダが存在するかチェック
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません: ” & targetFolder, vbCritical
Exit Sub
End If

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法です)
Application.ScreenUpdating = False
Application.Interactive = False

On Error GoTo ErrorHandler

‘ 1. フォルダ内のすべてのVSDXファイルを処理
For Each file In fso.GetFolder(targetFolder).Files
If LCase(fso.GetExtensionName(file.Name)) = “vsdx” Then
vsdPath = file.Path
‘ 一時PDFのパスを作成 (例: C:\…\filename.pdf)
tempPdfPath = fso.BuildPath(targetFolder, fso.GetBaseName(file.Name) & “_temp.pdf”)

‘ Visio図面を開く (非表示で開くことでユーザーの邪魔をしない)
Set vsoDoc = Documents.OpenEx(vsdPath, visOpenRO + visOpenHidden)

‘ PDFとしてエクスポート
vsoDoc.ExportAsFixedFormat visFixedFormatPDF, tempPdfPath, visStandardPrint, visPrintAll

‘ 図面を閉じる(変更は保存しない)
vsoDoc.Close

‘ 成功した一時PDFのパスをコレクションに蓄積
pdfList.Add tempPdfPath
End If
Next file

If pdfList.Count = 0 Then
MsgBox “対象となるVSDXファイルが見つかりませんでした。”, vbExclamation
GoTo CleanUp
End If

‘ 2. Acrobatを使ってPDFを結合する
‘ Adobe Acrobat Pro がインストールされている必要があります
Set pdDocMaster = CreateObject(“AcroExch.PDDoc”)
Set pdDocTemp = CreateObject(“AcroExch.PDDoc”)

‘ 1つ目のPDFをマスターとして開く
If pdDocMaster.Open(pdfList(1)) Then

‘ 2つ目以降のPDFをループで後ろに結合していく
For i = 2 To pdfList.Count
If pdDocTemp.Open(pdfList(i)) Then
‘ pdDocMasterの末尾(引数は全ページ数を示す)に一時PDFの全ページを挿入
‘ 引数: 挿入先のページ位置(0始まりの末尾), 挿入元PDDoc, 挿入元の開始ページ, 挿入するページ数, しおりの保持(0/1)
Call pdDocMaster.InsertPages(pdDocMaster.GetNumPages – 1, pdDocTemp, 0, pdDocTemp.GetNumPages, True)
pdDocTemp.Close
End If
Next i

‘ 結合したPDFを指定パスに保存
pdDocMaster.Save 1, finalPdfPath
pdDocMaster.Close
End If

‘ 3. 一時ファイルの削除(お掃除)
For i = 1 To pdfList.Count
If fso.FileExists(pdfList(i)) Then
fso.DeleteFile pdfList(i)
End If
Next i

MsgBox “すべてのVisio図面が結合され、以下のPDFが出力されました!” & vbCrLf & finalPdfPath, vbInformation

CleanUp:
‘ 画面描画の復元(絶対に忘れてはいけない!)
Application.ScreenUpdating = True
Application.Interactive = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

—

4. コードの深掘り:プロが仕込む「3つの重要テクニック」

上記のコードには、単なる「動くコード」を超えた、現場で生き残るためのプロの知見が詰まっています。特に重要なポイントを解説します。

① `Documents.OpenEx` による「バックグラウンドオープン」

Set vsoDoc = Documents.OpenEx(vsdPath, visOpenRO + visOpenHidden)

ただ `Documents.Open` を使うと、Visioの画面がパカパカと切り替わり、処理が遅くなるだけでなくユーザーにストレスを与えます。`visOpenHidden` を指定して「非表示」かつ `visOpenRO` で「読み取り専用」で開くのが、大量処理を高速かつ安全に行うための鉄則です。

② 画面描画と操作のロック

Application.ScreenUpdating = False
Application.Interactive = False

処理の最初にこれをオフにし、最後に必ず `True` に戻します。これを行わないと、Visioがファイルを開き閉めするたびに画面が再描画され、処理速度が何倍も遅くなります。

③ Acrobat COMオブジェクトによる堅牢なページ結合

Adobe Acrobat ProがPCにインストールされている場合、`AcroExch.PDDoc` という強力なオブジェクトが使えます。これを使うことで、PDFのページ単位での抽出・結合・並べ替えが自由自在になります。

> ⚠️ 現場の注意点
> このAcrobatの結合機能(`AcroExch.PDDoc`)を利用するには、PCにAdobe Acrobat(StandardまたはProのデスクトップ版)がインストールされている必要があります(※無料のAdobe Acrobat ReaderではこのAPIは動きません)。もしAcrobatが入っていない環境の場合は、フリーのコマンドラインツール(pdftkなど)を `Shell` 関数で叩いて結合するアプローチをとるのが次善の策となります。

—

まとめ:ここをクリアすれば、もう怖くない!

お疲れ様でした!今回は「複数のVisio図面をPDF化して1つに結合する」という、やや高度なテーマを解説しました。

  • Visio単体では結合できないため、Acrobat API(COMオブジェクト)と連携する。
  • ファイルを非表示(`visOpenHidden`)で開くことで、高速かつスマートに処理する。
  • 処理の前後で画面描画のロック・アンロック(`ScreenUpdating`)を確実に行う。

ここをクリアできれば、単なるマクロの記録の域を完全に脱却し、立派な「業務自動化エンジニア」としての第一歩を踏み出したことになります。

日々の面倒な手作業をコードで駆逐し、本当に価値のあるクリエイティブな時間にシフトしていきましょう。あなたのVBAライフを、これからも応援しています!

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