こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と頭を抱えていませんか? 大丈夫、ここを通るエンジニアはみんな同じ道を通っています。
今回は、実務でめちゃくちゃ需要が高いのに、ネットを検索してもなかなか核心にたどり着かない「PDF出力時の『しおり(アウトライン)』を、 Visioのページ名ではなく特定のシェイプテキストから生成する」というテーマを深掘りします。
ここをクリアすれば、単なる「VBAの自動化ができる人」から、ドキュメントの品質までコントロールできる「ワンランク上のVisioオートメーション・エンジニア」に一歩近づけます。一緒にスッキリ解決していきましょう!
—
1. なぜ「ページのしおり」では物足りないのか?
Visioで複数ページの図面(VSDX)を作成し、PDFとして出力する際、デフォルトでは「ページ名(Page-1, Page-2など)」がそのままPDFのしおり(目次ツリー)になりますよね。
しかし、実際の業務ではどうでしょう?
- ページ名は管理用のコード(例: `FL-203_rev2`)にしておきたい。
- でも、PDFのしおりには、上司やクライアントが見て一発でわかる「正式な図面タイトル(例: 2階フロアネットワーク配線図)」を表示させたい。
こんなジレンマにぶ D(ぶつ)つかります。
実は、Visioの標準機能だけでこれを完璧にコントロールするのは至難の業。だからこそ、VBAの力でシェイプのテキストを抽出し、ページ名そのものを一時的に書き換えてからPDFに出力するという、プロならではのスマートな裏技を使います。
—
2. 本質を突く!アーキテクチャの全体像
今回書くVBAコードの戦略はこうです。
1. 対象ページの特定: 図面の全ページをループで回す。
2. タイトルシェイプの特定: 各ページにある「特定のタイトル(特定のマスターシェイプや、特定の位置にあるテキスト)」をハンティングする。
3. ページ名への一時退避と置換: 抽出したテキストを、そのページの `Name` プロパティに一時的にセットする。
4. PDF出力: 標準の `ExportAsFixedFormat` メソッドでPDF化(この時、書き換わったページ名をしおりとしてPDFが勝手に拾ってくれます)。
5. 復元: 処理が終わったら、ページ名を元の管理用名に戻す(ここ超重要!)。
このライフサイクルを頭に叩き込んでおけば、エラーで図面が破壊される心配もありません。
—
3. 実装コード:コピペで使える実用マクロ
それでは、開発の現場でそのまま使える実用的なコードを公開します。VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 処理名: ページ内の特定タイトルシェイプからPDFしおりを生成して出力するプロシージャ
‘ 対象者: マクロの記録を卒業し、ドキュメント品質を上げたい中級者向け
‘ ==============================================================================
Public Sub ExportPdfWithCustomBookmarks()
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument
Dim targetPage As Visio.Page
Dim shp As Visio.Shape
‘ ページ名と元の名前をペアで保持するための辞書(または配列)
‘ 今回はシンプルに、処理後に元に戻すためのバックアップ用配列を用意
Dim originalPageNames() As String
Dim pageCount As Long
pageCount = targetDoc.Pages.Count
ReDim originalPageNames(1 to pageCount)
On Error GoTo ErrorHandler
‘ ————————————————————————–
‘ Step 1: ページ名のバックアップ & タイトルシェイプからの置換
‘ ————————————————————————–
Dim i As Long
For i = 1 to pageCount
Set targetPage = targetDoc.Pages(i)
‘ 後で元に戻すために現在のページ名を保存
originalPageNames(i) = targetPage.Name
‘ ページ内のシェイプを走査し、「タイトル」とみなすテキストを探す
‘ ※ここでは分かりやすく、シェイプのTextに「TITLE:」から始まる文字列があると仮定
Dim foundTitle As String
foundTitle = “”
For Each shp in targetPage.Shapes
If Left(shp.Text, 6) = “TITLE:” Then
‘ 「TITLE:」を除いた部分をしおりの名称とする
foundTitle = Trim(Mid(shp.Text, 7))
Exit For ‘ 最初に見つかったタイトルを採用
End If
Next shp
‘ タイトルが見つかった場合のみ、ページ名を一時変更
‘ (※Visioの仕様上、ページ名に使えない文字を置換する配慮があると完璧ですが今回は省略)
If foundTitle <> “” Then
targetPage.Name = foundTitle
End If
Next i
‘ ————————————————————————–
‘ Step 2: 高品質PDFの出力
‘ ————————————————————————–
Dim outputPath As String
outputPath = targetDoc.Path & “\Output_With_CustomBookmarks.pdf”
‘ 万が一、同名ファイルが開かれていてロックされている場合のエラーを防ぐ
If Dir(outputPath) <> “” Then
‘ 既存ファイルがある場合は上書き確認をスキップして削除(実務では注意)
Kill outputPath
End If
‘ Visioの強力なExportAsFixedFormatメソッドでPDF化
‘ 第1引数: 形式 (vsFixedFormatPDF = 1)
‘ 第2引数: 出力パス
targetDoc.ExportAsFixedFormat _
Visio.VisFixedFormatTypes.visFixedFormatPDF, _
outputPath, _
Visio.VisPrintOutPages.visPrintAll, _
1, pageCount
MsgBox “PDFの出力が完了しました!” & vbCrLf & outputPath, vbInformation, “成功”
CleanUp:
‘ ————————————————————————–
‘ Step 3: 【最重要】ページ名の復元
‘ エラーが起きようとも、絶対に元のページ名に戻す神の慈悲(クリーンアップ処理)
‘ ————————————————————————–
For i = 1 to pageCount
targetDoc.Pages(i).Name = originalPageNames(i)
Next i
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub
—
4. コードの深掘りポイント(ここが分かれば怖くない!)
① エラーハンドリングの「お作法」 (`On Error GoTo`)
VBAでファイルを操作したり、プロパティを書き換えたりする際、途中でエラー(例: すでに同じ名前のページが存在して名前変更に失敗するなど)が起きると、ページ名が書き換わったままの状態でマクロが中断してしまいます。
これを防ぐために `On Error GoTo ErrorHandler` を仕込み、どんな結末を迎えても `CleanUp` ラベルを通って必ず元のページ名に復元する構造にしています。プロのコードには必ずこの「後始末の美学」があります。
② タイトルシェイプの特定ロジック
今回のサンプルコードでは、シェイプのテキストの先頭が `TITLE:` で始まるものをそのページのタイトルとみなしています。
現場の要件に合わせて、ここは以下のようにカスタマイズ可能です。
- 特定のマスターシェイプID(`Master.Name`)で判定する
- シェイプのカスタムプロパティ(Shape Data)に「IsTitle = True」というフラグを持たせて判定する
オブジェクトのプロパティを自由自在にイテレート(巡回)できるのが、Visio VBAの最大の強みです。
—
5. 陥りやすい罠とエンジニアからのアドバイス
最後に、初心者が絶対にハマる「Visio特有の罠」をシェアしておきます。
- 罠:ページ名に使えない文字を入れてしまう
Visioのページ名には `\`, `/`, `?`, “, `[`, `]`, `:` などの文字を含めることができません。もしタイトルシェイプにこれらの記号が含まれている場合、`targetPage.Name = foundTitle` の行で実行時エラー(実行時エラー ‘-2029’ など)が発生します。
- 対策: `Replace` 関数などを使って、ファイル名やページ名に使えない禁則文字をあらかじめ別の文字(全角スペースやハイフンなど)に置換するフィルター関数を挟みましょう。
—
まとめ
今回は、VisioのPDF出力時に「しおり」を特定のシェイプテキストから生成する、一歩進んだ自動化テクニックを解説しました。
- ページ名とPDFのしおりは連動している性質を利用する。
- 一時的にページ名をシェイプのテキストに書き換えて出力する。
- 絶対に元のページ名に戻すクリーンアップ処理を忘れない。
この3つさえ押さえておけば、どんなに複雑な図面であっても、あなたの意のままに美しいPDFドキュメントを生成できるようになります。
「ここをもっとこうしたい」「ウチの図面だとこういうレイアウトなんだけど…」といった疑問があれば、いつでもコメントやご質問をくださいね。それでは、快適なVisioライフを!
