こんにちは!Visioの自動化の世界へようこそ。
「マクロの記録」ボタンを押して図面をPDFに保存してみたものの、毎回あの面倒な「PDFのオプション」ダイアログが表示されて、手が止まってしまった……そんな経験はありませんか?
「よし、完全に自動でPDFを出力するぞ!」と意気込んで実行したのに、突然画面がフリーズしたかのようにダイアログがポップアップし、キーボードやマウスに手を伸ばさざるを得ない。あの瞬間ほど、エンジニアとして無力感を覚えることはありませんよね。
大丈夫。今日はそのストレスを綺麗すっぱり解消し、コード一発でダイアログを完全無視し、さらに業界標準である「PDF/A形式」で完璧なPDFを出力する極意を伝授します。
ここをクリアすれば、あなたのVisio VBAスキルは「記録頼みの初心者」から「システムを意図通りに操るエンジニア」へと一気にランクアップします。一緒にマスターしていきましょう!
—
なぜ「マクロの記録」だけではPDF保存が自動化できないのか?
Visioの「開発」タブにある「マクロの記録」は、私たちにとって強力な味方です。しかし、この機能には大きな罠があります。
「ファイル > 名前を付けて保存 > PDF」という一連の操作を記録すると、生成されるコードはだいたい以下のようになります。
‘ マクロの記録が吐き出す典型的なコード
ActiveDocument.SaveAsEx “C:\Work\sample.pdf”, visSaveAsPDF
このコードを実行するとどうなるか?
……お察しの通り、「PDFのオプション」ダイアログがガッツリ画面に現れます。
なぜか? `SaveAsEx` メソッドは、ファイルフォーマットの変換時に「ユーザーに詳細設定を確認させる」というデフォルトの挙動(UIの表示)を持っているからです。バックグラウンドで黙々と仕事をさせたいエンジニアにとって、このポップアップは最大の敵です。
この壁を突破するために使うのが、Visioが持つ真のPDF出力エンジン―― `ExportAsFixedFormat` メソッド です。
—
救世主:`ExportAsFixedFormat` メソッドの全貌
ダイアログを出さずに、出力範囲や画質、そして「PDF/A形式」までを完全にコードで制御したい。そのすべての願いを叶えるのが `Document.ExportAsFixedFormat` です。
まずは、実務でそのまま使える「完全版のコード」をお見せします。これをあなたのVBAエディタ(`Alt + F11` で開く画面)に貼り付けてみてください。
Sub ExportVisioToPdfA()
Dim targetPath As String
‘ 出力先のパスを定義(デスクトップの「Sample.pdf」を指定する場合の一例)
targetPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\Automated_Sample.pdf”
On Error GoTo ErrorHandler
‘ 【核心】ダイアログを出さず、一発でPDF/A形式を出力する
ActiveDocument.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=targetPath, _
Intent:=visDocIntentPrint, _
PrintRange:=visPrintAllPages, _
UseISO19005_1:=True ‘ ←ここがPDF/A形式を指定する魔法の引数!
MsgBox “PDF/A形式での出力が完了しました!” & vbCrLf & targetPath, vbInformation, “自動化成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
どうですか?たったこれだけの行数で、あの鬱陶しいダイアログが二度と現れなくなります。
—
コードの急所を解剖する:引数たちの役割
上のコードで使われている重要な引数を、先輩エンジニアの視点で一つずつ噛み砕いて解説します。ここを押さえておけば、どんなレイアウトの要求にも応えられます。
1. `FixedFormat:=visFixedFormatPDF`
「今回はXPSじゃなくてPDFを作るんだよ」とVisioに教える基本設定です。
2. `OutputFileName:=targetPath`
保存先のフルパスを指定します。もし既に同名のファイルが存在する場合、確認なしで上書きされるので注意してください(必要に応じて事前に `Kill` 関数などでファイル存在チェックを入れるとより堅牢になります)。
3. `Intent:=visDocIntentPrint`
出力の「目的」を指定します。
- `visDocIntentPrint` (印刷品質・高解像度)
- `visDocIntentScreen` (画面表示用・軽量)
図面の中に細かい文字や図形が多い場合は、必ず `visDocIntentPrint` を選んでください。
4. `UseISO19005_1:=True` ★今回の最重要ポイント!
ここが今回のテーマの核心です。
`ISO 19005-1` とは、長期保存用PDFの国際標準規格である 「PDF/A」 のこと。これを `True` に設定することで、フォントの埋め込みや色空間の厳密な規定を満たした、将来世代でも色褪せない高品質なPDFが自動生成されます。「PDFのオプション」ダイアログでチェックボックスをカチカチと手動で弄っていたあの作業は、この1行に凝縮されていたのです。
—
初学者がハマりやすい「3つの罠」と回避策
現場でこのコードを実装する際、多くの人が以下のトラップに引っかかります。先回りして回避策を伝授しておきますね。
罠1: 保存先のフォルダが存在しない
`C:\MyFolder\SubFolder\sample.pdf` のように指定したとき、`SubFolder` がそもそも存在しない場合、VBAは無情にも実行時エラー(エラー番号:-2147352567 など)を吐いて止まります。
- 回避策: ファイル出力の前に、フォルダの存在確認(`Dir`関数など)を行うか、確実に存在するパス(デスクトップやドキュメントフォルダ)を動的に取得するようにしましょう(上記のサンプルコードでは `WScript.Shell` を使って安全にデスクトップを取得しています)。
罠2: 対象の図面(ActiveDocument)が保存されていない
一度も名前を付けて保存していない新規作成直後のドキュメント(「図面1.vsdx」など)に対してパスなしで実行すると、Visioが混乱してエラーを起こすことがあります。
- 回避策: 自動化スクリプトを走らせる前に、最低一度は元となる `.vsdx` ファイルを適当な場所に保存しておくか、コード内で `ActiveDocument.Save` を挟む習慣をつけましょう。
罠3: ファイルが他のアプリ(Adobe Reader等)で開かれている
出力先のPDFをすでに別ウィンドウで開いたままマクロを実行すると、「ファイルを上書きできません」というエラーになります。
- 回避策: エラーハンドラー(`On Error GoTo ErrorHandler`)を必ず仕込み、予期せぬエラー時にもVBAがクラッシュせず優しくメッセージを出してくれる設計にしてください。
—
ここをクリアすれば、Visio VBAの基本はバッチリですよ!
お疲れ様でした!
「マクロの記録」の呪縛から離れ、自分の手でメソッドの引数をコントロールしてPDF/A出力を作り上げる感覚、いかがだったでしょうか?
この `ExportAsFixedFormat` を使いこなせるようになると、例えば以下のような「真の業務自動化」へステップアップできます。
- フォルダ内にある数百個の `.vsdx` ファイルを、夜間バッチで一斉にPDF/A化する
- 担当者の名前や日付を動的に図面に埋め込みつつ、指定のサーバーに自動保存する
面倒な定型作業はすべてコードに押し付け、私たち人間は「よりクリエイティブな設計や業務改善」に集中する。これこそが、エンジニアの目指すべき姿です。
あなたのVisio自動化ライフが、今日からさらに快適でスマートなものになることを応援しています!
