VisioのPDF出力が「終わらない…」を終わらせる。ページ別・高速プロファイラー作成術
こんにちは。業務自動化の現場を渡り歩いてきたエンジニアです。
Visioで数百ページに及ぶ巨大な図面をPDF化する際、進捗バーが止まったまま数分間フリーズした経験はありませんか? 「Visioが壊れたか?」と疑いたくなりますが、大抵の原因は「特定のページに含まれる過剰なグループ化、巨大な画像、あるいは複雑な接続関係」にあります。
今回は、ただPDFを書き出すだけのマクロから脱却し、「どのページが重いのか」をミリ秒単位で可視化する、プロ仕様のPDFプロファイラーを構築しましょう。
—
1. なぜVisioのPDF出力は重くなるのか?
VisioのPDF変換は、単なるスクリーンショットではなく、各図形をベクター形式として再計算・変換するプロセスです。以下の要素がボトルネックになります。
- 多重ネストされたグループ: 階層が深いほど、再帰計算の負荷が指数関数的に増大します。
- 高解像度の埋め込み画像: 不要に大きなビットマップは変換時にメモリを食いつぶします。
- 複雑な「コネクタ」: 接続点が多すぎる場合、最適化アルゴリズムが迷走します。
これらを特定するために、「ページごとに計測してログを出す」というアプローチが最強のデバッグ手段となります。
—
2. 実装:PDF出力プロファイラーの全貌
このコードは、各ページを個別に「一時的なPDF」として書き出し、その時間を計測してイミディエイトウィンドウにレポートします。
Option Explicit
‘ 【上級者向け】ページ単位のPDF出力時間計測プロファイラー
Public Sub ProfileVisioPdfExport()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim startTime As Double, endTime As Double
Dim exportPath As String
Dim fileName As String
Set doc = ActiveDocument
‘ 保存先は一時フォルダを指定(適宜書き換えてください)
exportPath = Environ(“TEMP”) & “\”
Debug.Print “— PDF出力プロファイル開始: ” & Now & ” —”
‘ 各ページをループして個別に書き出し
For Each pg In doc.Pages
fileName = exportPath & “Page_” & pg.Index & “.pdf”
Debug.Print “処理中: Page ” & pg.Index & ” (” & pg.Name & “)”
startTime = Timer
‘ ページ単位でエクスポートを実行
‘ visFixedFormatPDF = 1
pg.ExportAsFixedFormat visFixedFormatPDF, fileName
endTime = Timer
‘ 経過時間をミリ秒単位で計算して出力
Debug.Print ” -> 完了: ” & Format((endTime – startTime), “0.000”) & “秒”
Next pg
Debug.Print “— PDF出力プロファイル終了: ” & Now & ” —”
MsgBox “計測完了!イミディエイトウィンドウを確認してください。”, vbInformation
End Sub
—
3. コードの「魂」を読み解く(解説)
1. `Timer` 関数の活用
VBAの `Timer` は、その日の午前0時からの経過秒数を返します。これの差分を取ることで、処理時間を非常に軽く、かつ正確に計測できます。
2. `pg.ExportAsFixedFormat`
`ActiveDocument.ExportAsFixedFormat` を使うと全ページまとめて書き出されますが、これでは「どのページで止まっているか」が分かりません。あえてページオブジェクトから `ExportAsFixedFormat` を呼び出すことで、切り分け(Decomposition) を行っています。
3. なぜ「イミディエイトウィンドウ」なのか
メッセージボックスに結果を出すと、その都度クリックが必要です。大量のページを扱う場合、[Ctrl + G] で開けるイミディエイトウィンドウにストリーミング形式で結果を吐き出すのが、エンジニアの鉄則です。
—
4. 陥りやすいエラーと対策
- 「ファイルが使用中です」エラー:
PDF出力中に同名ファイルが既に存在している、あるいはPDFビューワーで開いたままだと発生します。`Kill` ステートメントで既存ファイルを削除する処理をループ前に入れておくと安全です。
- ページ名に禁止文字が含まれる:
シート名に `\/` などのファイル名禁止文字が含まれていると、保存時にエラーになります。`pg.Name` をそのままファイル名に使わず、`pg.Index` を使うのが正解です。
—
5. 次のステップ:プロファイラーで見つけた「重いページ」をどうするか?
もし特定のページが異常に時間がかかっていることが判明したら、以下の手順で最適化してください。
1. 図形を選択して「グループ解除」→「再グループ化」: 内部的な計算キャッシュをリセットします。
2. 不要な隠し図形の削除: `Drawing Explorer` ウィンドウを開き、見えないゴミ図形を掃除します。
3. ビットマップの圧縮: 画像を選択し、[図のツール]タブから「図の圧縮」を行ってください。
—
最後に:自動化は「計測」から始まる
「なんとなく遅い」を解決するのは根性論ですが、「このページが〇〇秒かかっている」を特定するのはエンジニアリングです。
今回紹介したプロファイラーは、単なる計測ツールを超えて、あなたのVisio運用を「感」ではなく「データ」に基づいたものへと進化させます。ぜひ現場の巨大ファイルで試してみてください。
「ここをもっと詳しく知りたい」「特定の図形タイプを検知したい」といった要望があれば、またいつでも聞いてくださいね。あなたの自動化ライフを心から応援しています。
