【入門編】【上級者向け】VisioのPDF出力エンジンが生成するPDFのしおり(アウトライン)をVBAでカスタマイズする – Visio VBA解析バイブル

スポンサーリンク

こんにちは、プロフェッショナルな自動化の世界へようこそ。私は長年、数えきれないほどのドキュメント生成ソリューションを設計してきたチーフアーキテクトです。

「マクロの記録」を卒業し、自分の手でコードを書き始めたあなたは、今まさに「Visioを単なる作図ツールから、強力なドキュメントエンジンへと昇華させる」扉の前に立っています。

今日のテーマは、実務で非常に要望が多い「PDF出力と、そのしおり(アウトライン)の制御」です。

Visioの標準機能でPDFを書き出すと、ページ名がそのまま「しおり」になります。しかし、現場では「特定のシェイプを見出しにしたい」「階層構造を自由に操りたい」という高度な要求が必ず出てきます。

この記事を読み終える頃には、Visio VBAの基本を完全に掌握し、PDF出力の限界を超えるための設計思想が身についているはずです。

—

1. Visio VBAにおける「PDF出力」の本質を理解する

まずは基本から。VisioでPDFを出力する際、私たちが最も信頼を寄せるメソッドは `Document.ExportAsFixedFormat` です。

単に保存する(SaveAs)のではなく、「固定フォーマットとして書き出す」という意識が重要です。

基本のコード例

Sub ExportToPdfBasic()
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument

‘ 出力パスの作成(ドキュメントと同じフォルダにPDFを作成)
Dim pdfPath As String
pdfPath = Replace(targetDoc.FullName, “.vsdx”, “.pdf”)

‘ PDF出力の実行
‘ ここで重要なのは「Intent」と「IncludeDocProps」です
targetDoc.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=pdfPath, _
Intent:=visIntentPrint, _
PrintRange:=visPrintAll, _
IncludeDocProps:=True ‘ ドキュメントプロパティを含めることで、しおりの基礎を作る

MsgBox “PDFの出力が完了しました!”, vbInformation
End Sub

ここがポイント:
`IncludeDocProps:=True` を指定することで、Visioの「ページ名」がPDFの「しおり」として自動的に採用されます。これがVisioにおけるPDFしおり制御の第一歩です。

—

2. 【応用】しおりをカスタマイズする「一時的なページリネーム戦略」

標準の `ExportAsFixedFormat` では、しおりの階層構造(親子関係)を直接作ることはできません。しかし、プロの現場では「出力する瞬間だけ、ページ名を制御する」というテクニックを使います。

例えば、特定のシェイプ(章タイトルなど)の内容をページ名に一時的に反映させ、PDF出力後に元に戻すという手法です。

実践的なコード:シェイプ情報をしおりに反映させる

このコードは、各ページにある「見出し」用のシェイプを探し、そのテキストをページ名(=しおり名)にセットしてからPDF化します。

Sub ExportCustomBookmarkPdf()
Dim vsoPage As Visio.Page
Dim oldNames() As String
ReDim oldNames(ActiveDocument.Pages.Count)
Dim i As Integer: i = 1

‘ — 1. 現在のページ名をバックアップし、新しい名前をセット —
For Each vsoPage In ActiveDocument.Pages
oldNames(i) = vsoPage.Name

‘ 例えば「Heading」という名前のマスターシェイプがあれば、そのテキストをしおり名にする
Dim vsoShape As Visio.Shape
For Each vsoShape In vsoPage.Shapes
If vsoShape.NameU Like “Heading” Then
vsoPage.Name = vsoShape.Text ‘ ページ名を一時的に変更
Exit For
End If
Next vsoShape
i = i + 1
Next vsoPage

‘ — 2. PDF出力 —
Dim pdfPath As String
pdfPath = CreateObject(“Scripting.FileSystemObject”).GetParentFolderName(ActiveDocument.FullName) & “\CustomOutput.pdf”

ActiveDocument.ExportAsFixedFormat visFixedFormatPDF, pdfPath, visIntentPrint, visPrintAll

‘ — 3. ページ名を元に戻す(ライフサイクルの管理) —
i = 1
For Each vsoPage In ActiveDocument.Pages
vsoPage.Name = oldNames(i)
i = i + 1
Next vsoPage

MsgBox “しおりをカスタマイズしたPDFを出力しました。”
End Sub

—

3. 【上級】PDFの階層構造(親子しおり)を実現する設計思想

Visio標準機能だけでは、PDFのしおりに「階層(親子関係)」を持たせることはできません。これを解決するには、以下の2つのアプローチを検討します。

方法A:Adobe Acrobat SDK(COM連携)を利用する

もし実行環境に Adobe Acrobat Pro がインストールされているなら、VBAから Acrobat のライブラリを操作して、出力後のPDFにしおりを「後付け」できます。

‘ ※参照設定に「Adobe Acrobat 10.0 Type Library」などが必要
Sub AddPdfBookmarksWithAcrobat()
‘ PDF出力後にこの処理を走らせる
‘ Acrobat.AcroPDDoc オブジェクトなどを使用して、
‘ 指定したページに Bookmark オブジェクトを追加していく設計にします。
‘ これは非常に強力ですが、ライセンス環境に依存します。
End Sub

方法B:外部ライブラリ(iTextSharp等)をコマンドラインから叩く

オープンソースの PDF 操作ライブラリ(iTextSharp や pdftk)を使い、VBAから `Shell` 関数経由で制御する方法です。Visio VBA側で「どのページにどのしおりを付けるか」の構成リスト(XMLやテキスト)を書き出し、それを外部ツールに読み込ませます。

—

4. 陥りやすいエラーと回避策

Visio VBAでファイルを扱う際、初心者が必ずと言っていいほど遭遇する落とし穴があります。

1. ファイルオープン中のエラー
すでに同じ名前のPDFが開いている状態で `ExportAsFixedFormat` を実行すると、コードはエラーで止まります。

  • 対策: `On Error Resume Next` でトラップするか、出力前に `Dir(pdfPath)` でファイルの存在を確認し、削除を試みる処理を入れましょう。

2. オブジェクトの解放漏れ
大量のページをループで処理する際、`Set vsoPage = Nothing` などを意識しないと、Visioのメモリ消費が跳ね上がり、動作が不安定になります。
3. 非表示ページの扱い
背景ページ(Background Pages)もPDFに出力される設定になっていると、予期せぬしおりが生成されます。`vsoPage.Background` プロパティを確認し、出力対象を制御しましょう。

—

5. 最後に:エンジニアとしてのステップアップ

「マクロの記録」で得られるコードは、言わば「その場限りのメモ」です。
しかし、今回のように 「一時的に状態を変え、目的を果たし、元の状態に戻す」 というロジックを組めるようになれば、あなたは立派なオートメーション・エンジニアです。

Visio VBAは、図面を描くだけの道具ではありません。情報を構造化し、他者に伝えるための「ドキュメント・ハブ」へと進化させることができるのです。

今回のPDF制御をマスターすれば、次は「Excelの設計書からVisio図面を自動生成し、しおり付きPDFとして納品する」という完全自動化パイプラインも見えてくるはずですよ。

一歩ずつ、本質を掴んでいきましょう。応援しています!

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