Visio VBAを掌握する極限の知見:PDF/A自動出力とダイアログ完全抑制のアーキテクチャ
業務システムの中枢において、ドキュメントのPDF化は避けて通れない要件だ。特に長期保存や監査対応が求められる環境では、単なるPDFではなく「PDF/A形式」での出力が絶対条件となる。
しかし、Visioの標準メソッドである `ExportAsFixedFormat` は、開発者を罠に陥れることで悪名高い。引数の設定を少しでも誤れば、あの忌々しい「PDFのオプション」ダイアログが突然ポップアップし、夜間のバッチ処理や無人サーバーでの自動化を完全に沈黙させる。
本稿では、Visio VBAにおいてダイアログの表示を一切許容せず、完全なバックグラウンドでPDF/A準拠のドキュメントを生成するための極限の知見を公開する。
—
1. `ExportAsFixedFormat` の隠された仕様と罠
多くのプログラマは、ネット上の断片的なサンプルコードをコピペして実装を試みる。しかし、VisioのCOMオブジェクトモデルは、ExcelやWordのそれとは異なる独自の挙動を示す。
`Document.ExportAsFixedFormat` メソッドのシグネチャを直視せよ。
expression.ExportAsFixedFormat (FixedFormat, OutputFileName, Intent, PrintRange, PageFrom, PageTo, Item, CreateBookmarks, UseISO19005_1, [ColorDepth], [TargetPPI], [FixedFormatOptions])
この中で、今回最も重要な鍵を握るのが `UseISO19005_1` 引数である。
これを `True` に設定することで、ISO 19005-1規格、すなわち PDF/A-1a 形式での出力が強制される。
しかし、ここでシニアエンジニアが陥りがちな罠がある。
「ダイアログを出さずにサイレント保存したい」という目的のために、Visio自体の画面描画や警告を抑制しても無駄である という点だ。`Visio.Application.ScreenUpdating = False` や `DisplayAlerts = False` は、固定形式エクスポート時のダイアログを防げない。
ダイアログを完全に排除する唯一にして絶対の条件は、すべての必須引数型を厳密に一致させ、不正な組み合わせによる例外(あるいはフォールバックによるダイアログ表示)を防ぐこと である。
—
2. 実装コード:完全自動化 PDF/A 出力エンジン
以下に、実業務の耐えうる堅牢性を備えたプロシージャを示す。メモリリークを防ぎ、エラーハンドリングを徹底したプロダクションクオリティのコードだ。
Option Explicit
‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: Visio図面をダイアログ一切なしでPDF/A形式へエクスポートする
‘ ==============================================================================
Public Sub ExportVisioToPdfA(ByVal targetVsdPath As String, ByVal outputPdfPath As String)
Dim doc As Visio.Document
Dim currentAlerts As Boolean
‘ 念のため画面更新とアラートを抑制(VisioのCOM挙動安定化のため)
currentAlerts = Application.ShowXMLValidationErrors ‘ Visio固有の環境変数代用として状態保持
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ ファイルの存在確認
If Dir(targetVsdPath) = “” Then
Err.Raise 53, “ExportVisioToPdfA”, “指定された図面ファイルが存在しません: ” & targetVsdPath
ニend If
‘ 図面を非表示(あるいは通常)で開く
‘ サーバーサイドやバックグラウンド処理の場合は Visible:=False が推奨される
Set doc = Application.Documents.OpenEx(targetVsdPath, visOpenRO + visOpenNoUI)
‘ — 【核心】ExportAsFixedFormat による完全制御エクスポート —
‘ 引数の意味:
‘ 1. FixedFormat: 0 = visFixedFormatPDF
‘ 2. OutputFileName: 出力先パス
‘ 3. Intent: 1 = visIntentPrint (印刷品質) または 0 = visIntentScreen
‘ 4. PrintRange: 0 = visPrintAll (全ページ)
‘ 5, 6. PageFrom/PageTo: 全ページ出力時は 0
‘ 7. Item: 0 = visPrintCurrentDocument
‘ 8. CreateBookmarks: True = しおりを作成する
‘ 9. UseISO19005_1: True = 【重要】PDF/A-1a 形式で保存
‘ —————————————————————–
doc.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=outputPdfPath, _
Intent:=visIntentPrint, _
PrintRange:=visPrintAll, _
PageFrom:=1, _
PageTo:=1, _
Item:=visPrintCurrentDocument, _
CreateBookmarks:=True, _
UseISO19005_1:=True
‘ ドキュメントを保存せずに閉じる(変更を加えている場合は注意)
doc.Close
Set doc = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
‘ 異常系:オブジェクトの解放とエラー伝播
Application.ScreenUpdating = True
If Not doc Is Nothing Then
On Error Resume Next
doc.Close visDoNotSaveChanges
Set doc = Nothing
On Error GoTo 0
End If
MsgBox “PDF/A出力中に致命的なエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “Visio Automation Engine”
Err.Raise Err.Number, “ExportVisioToPdfA”, Err.Description
End Sub
—
3. シニアエンジニアが知るべきアーキテクチャの急所
オブジェクトのライフサイクルとCOMの解放
VBAにおいて `Set doc = Nothing` を怠ることは、ガベージコレクションに対する冒涜である。Visioのプロセス(`VISIO.EXE`)はメモリフットプリントが重く、COM参照がリークしたままループ処理などを回すと、瞬く間にメモリ枯渇(Out of Memory)を引き起こす。
例外発生時(`ErrorHandler`)も含め、確実にオブジェクトの参照を切断し、プロセスをゾンビ化させない配慮がシステム管理者としての最低限の責務である。
フォント埋め込みとPDF/Aの罠
`UseISO19005_1:=True` を指定すると、Visioエンジンは使用されているすべてのフォントをPDF内にサブセット埋め込みしようとする。
もし図面内で「環境依存フォント」や「サーバー側にインストールされていないフォント」が使われている場合、Visioは勝手に代替フォントに置き換えようとして処理が停止するか、最悪の場合ダイアログを出してユーザーの入力を待つ状態(ハングアップ)に陥る。
PDF/A出力を行う図面では、必ず使用フォントを標準的なもの(メイリオ、游ゴシック、Arial等)に統一し、ターゲット環境へ確実にデプロイしておくこと。 これがアーキテクチャ設計上の鉄則である。
—
総括
Visio VBAによるPDF/A自動出力は、単なるメソッドの呼び出しではない。COMのライフサイクル管理、例外処理、そしてフォント仕様の理解という、インフラストラクチャの知見が総動員されて初めて成立する高度なエンジニアリングである。
小手先のハックに頼るな。正確な引数設計と厳格なリソース管理によってのみ、完全無人の自動化システムは構築できる。
