こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、コードの中身はブラックボックス…」となっていませんか?大丈夫、ここをクリアすれば、あなたも立派なVisio VBAエンジニアの仲間入りです。
今回は、実務で非常に要望の多い「図面の中で、特定の条件を満たすページだけを避けてPDFを出力する(条件付きエクスポートロジック)」をテーマに、プロの現場でも通用するスマートなコードの書き方を紐解いていきます。
「特定のページに『非表示』フラグがあったらPDFにしない」――このロジックをマスターすれば、資料のバージョン管理やレビュー用PDFの生成が一瞬で自動化できるようになりますよ。それでは、優しく、そして本質的なエンジニアリングの世界へご案内します!
—
1. なぜ「全ページ一括のPDF出力」ではダメなのか?
Visioで普通に「名前を付けて保存 > PDF」を選ぶと、ドキュメントに含まれるすべてのページが容赦なく出力されます。
しかし、実際の業務ではこんなシチュエーションがありませんか?
- 「作業用メモ」や「検討中のラフ案」ページが混ざっている
- 提出用には不要な裏付データページがある
- ページ名や特定のシェイプに「非表示」と書いてあるものは飛ばしたい
これを手動でやろうとすると、不要なページを一時的に削除したり、別ファイルにコピーしたりと、ミスのもとになり非常に面倒です。だからこそ、VBAで「条件に合うページだけを一時的に印刷対象にする(あるいは不要なページをスキップする)」という動的なコントロールが必要なのです。
—
2. Visio VBAにおけるページ制御の基本構造
VisioのVBAでは、ドキュメント全体を `ActiveDocument`、ページを `Page` オブジェクト、そしてページ全体のコレクションを `Pages` と呼びます。
ここで、Visio VBAをマスターする上で絶対に知っておかなければならない「超重要なお作法」があります。
> ⚠️ 【極限の知見】Visioのページ番号は 1 から始まらない!?
> 多くのプログラミング言語やExcel VBA(Worksheets)に慣れていると、`For i = 1 To Pages.Count` と書きがちです。しかし、VisioのPagesコレクションはインデックスが `1` から始まりますが、ページ内部の図形や概念、あるいは古いバージョンとの互換性の罠にハマることがあります。
> さらに確実なのは、`For Each` を使ってオブジェクトを直接イテレート(走査)する方法です。これならインデックスのズレに悩まされることがありません。
—
3. 実装コード:条件付きPDFエクスポートロジック
それでは、今回のメインである「特定の条件(例:ページ名に特定の文字が含まれる、または特定のフラグがある)を持つページをスキップしてPDFを出力する」マクロの全体像を見てみましょう。
開発タブのVisual Basic Editor(VBE)を開き、標準モジュールに以下のコードを貼り付けてください。
Sub ExportFilteredPDF()
Dim targetDoc As Visio.Document
Dim targetPage As Visio.Page
Dim exportPath As String
Dim fso As Object
‘ アクティブなドキュメントを対象とする
Set targetDoc = ActiveDocument
‘ 保存先のパスを設定(ここではデスクトップの “Output.pdf” とします)
Set fso = CreateObject(“Scripting.FileSystemObject”)
exportPath = fso.BuildPath(CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”), “FilteredOutput.pdf”)
On Error GoTo ErrorHandler
‘ —————————————————————–
‘ ステップ1: すべてのページの「印刷プレビュー/エクスポート対象外」を設定
‘ —————————————————————–
For Each targetPage in targetDoc.Pages
‘ 【判定ロジック】
‘ ここでは例として「ページ名に ‘【非表示】’ という文字が含まれているか」を条件にします。
‘ ※シェイプのプロパティやシェイプシートの値で判定することも可能です。
If InStr(targetPage.Name, “【非表示】”) > 0 Then
‘ 条件に一致する場合:エクスポート対象外にする
targetPage.PageSheet.CellsU(“PageType”).FormulaU = 2 ‘ 2 = 背景や非印刷などの特殊設定
‘ ※Visioの標準的な印刷・エクスポート除外は、ページ設定の「印刷しない」プロパティを操作します
‘ 実務では PageSheet の Visio内部セルを操作するのが定石です。
Debug.Print “スキップ設定: ” & targetPage.Name
Else
‘ 条件に一致しない場合:通常ページとして保持
targetPage.PageSheet.CellsU(“PageType”).FormulaU = 0 ‘ 0 = 通常の図面ページ
Debug.Print “出力対象: ” & targetPage.Name
End If
Next targetPage
‘ —————————————————————–
‘ ステップ2: PDF形式でエクスポートを実行
‘ —————————————————————–
‘ Visioの Export メформаットを使用 (PDFは定数 1)
targetDoc.ExportAsFixedFormat visFixedFormatPDF, exportPath, visDocExIntentPrint, visPrintAllPages
MsgBox “PDFのエクスポートが完了しました!” & vbCrLf & “保存先: ” & exportPath, vbInformation, “完了”
CleanUp:
Set targetPage = Nothing
Set targetDoc = Nothing
Set fso = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
Resume CleanUp
End Sub
—
4. コードの深掘り解説:ここがエンジニアのこだわりポイント
初心者のうちは「動けばいいや」と思いがちですが、一歩進んだエンジニアになるために、コードの重要なポイントを解説します。
① `PageSheet.CellsU` による高度なコントロール
Visioのページや図面は、裏側で「シェイプシート(ShapeSheet)」というExcelの表のようなデータベースを持っています。
`targetPage.PageSheet.CellsU(“PageType”)` を操作することで、そのページが「通常の図面なのか、バックグラウンドページなのか、印刷すべきものなのか」をプログラムから強制的に書き換えています。UIをポチポチ操作するよりも圧倒的に高速で確実です。
② `InStr` 関数による柔軟な文字列判定
`InStr(targetPage.Name, “【非表示】”) > 0` という記述は、「ページ名の中に『【非表示】』という文字がどこかに含まれていたら」という意味になります。完全一致ではなく部分一致にすることで、例えば「フロー図_v1【非表示】」といった名前のページでも確実に検知してスキップさせることができます。
③ 堅牢なエラーハンドリング(Error Handler)
VBAでファイル出力や外部アプリケーションを絡める処理を行う際、ファイルがすでに他のアプリ(Adobe Readerなど)で開かれていて上書きできない等、予期せぬエラーがつきものです。
`On Error GoTo ErrorHandler` を仕込んでおくことで、途中でエラーが起きてもオブジェクトのメモリ解放(CleanUp)を確実に実行し、Visio本体がフリーズするのを防ぐプロ仕様の設計にしています。
—
5. 陥りやすいエラーと対策
最後に、このロジックを組む際につまずきやすいポイントを先回りして解決しておきましょう。
- Q. エクスポートしたPDFを見ると、スキップしたはずのページが残っている!
- A. Visioのバージョンやテンプレートによっては、`PageType` だけでは完全に印刷対象から外れない場合があります。その場合は、ページ設定の「このページを印刷する」に相当するシェイプシートのセル(例: `PrintMerged` やレイヤーの表示設定)を組み合わせるアプローチが必要になります。まずはサンプルコードで挙動を確認してみてください。
- Q. 「型が一致しません」というエラーが出る
- A. オブジェクト変数の宣言漏れ(`Dim` のし忘れ)や、`Set` を忘れているケースがほとんどです。`Option Explicit` をモジュールの先頭に必ず書き、変数の宣言を徹底しましょう。
—
まとめ
いかがでしたでしょうか?
今回は「PDF出力時に特定のページを条件付きでスキップする」という、実務で即戦力になるテクニックをご紹介しました。
Visio VBAは、一見難しそうに見えますが、「ドキュメントを掴む ➔ ページを1枚ずつ見ていく ➔ 条件で属性を変える ➔ まとめて出力する」という基本のストーリーさえ理解してしまえば、あなたの右腕となる最強の自動化ツールに化けます。
ここをクリアできれば、Visio VBAの基本はバッチリです!ぜひ日々の業務に組み込んで、スマートな自動化ライフを満喫してくださいね。それでは、次回の応用編でお会いしましょう!
