Visio VBAの真髄:閉じる瞬間に「PDFを自動更新」するイベント駆動の極意
こんにちは。現場で泥臭く、かつエレガントな自動化を追求しているエンジニアです。
Visioを使っていると、よくある「PDFの書き出し忘れ」。図面を更新したのに、配布先には古いPDFが送られてしまう……。このヒューマンエラーに悩まされたことはありませんか?
今回は、Visioの「閉じる」という操作をトリガーにして、「未保存の変更があれば自動でPDFを更新する」という、実戦的なイベント駆動型の自動化手法を伝授します。
「マクロの記録」から一歩踏み出し、Visioのライフサイクルを操るエンジニアへの第一歩を一緒に踏み出しましょう。
—
1. なぜ「イベント駆動」なのか?
一般的なマクロは、ユーザーがボタンを押すことで動きます。しかし、プロフェッショナルな設計では、「ユーザーが意識しなくても、システムが勝手に正しく整えてくれる」ことが理想です。
Visioには、図面が開いたり、閉じたり、保存されたりする瞬間にコードを割り込ませる「イベント」という仕組みがあります。今回は `Document_BeforeDocumentClose` というイベントを使います。これは、「ドキュメントが閉じる直前」に発火する強力なフックです。
—
2. 実装のステップ:ThisDocumentに魂を込める
Visio VBAでは、標準モジュールではなく、図面オブジェクトそのものである `ThisDocument` モジュールにコードを書くのがセオリーです。
手順
1. Visioで `Alt + F11` を押してVBAエディタを開く。
2. 左側のプロジェクトウィンドウで `ThisDocument` をダブルクリック。
3. 以下のコードを貼り付ける。
‘ Document_BeforeDocumentClose: 図面を閉じる直前に実行されるイベント
Private Sub Document_BeforeDocumentClose(ByVal doc As IVDocument)
‘ 1. 保存されていない変更があるか確認
If doc.Saved = False Then
‘ 2. ユーザーにPDF更新を確認(誤動作防止のため)
Dim msg As String
msg = “未保存の変更があります。PDFを更新しますか?”
If MsgBox(msg, vbYesNo + vbQuestion, “PDF自動更新”) = vbYes Then
‘ 3. PDF出力パスの設定(現在のVSDXと同じ場所にPDFを生成)
Dim pdfPath As String
pdfPath = Left(doc.FullName, InStrRev(doc.FullName, “.”)) & “pdf”
‘ 4. PDFエクスポート実行
‘ FixedFormat: 0 = visFixedFormatPDF
On Error Resume Next ‘ エラー回避
doc.ExportAsFixedFormat 0, pdfPath
If Err.Number <> 0 Then
MsgBox “PDFの出力に失敗しました。” & vbCrLf & Err.Description
Else
MsgBox “PDFを更新しました:” & vbCrLf & pdfPath
End If
On Error GoTo 0
‘ 5. 保存を確定させる(警告を出さないように)
doc.Saved = True
End If
End If
End Sub
—
3. コードのポイント:ここが「プロの視点」です
このコードには、初心者が見落としがちな重要な要素が詰まっています。
- `doc.Saved` プロパティの活用:
このフラグは、ファイルに変更が加えられると自動的に `False` になります。これを使えば「無駄なPDF生成」を防げます。
- パスの動的生成:
`InStrRev` 関数を使って、ファイルの拡張子を `.pdf` に置き換えています。ハードコーディング(直書き)を避けるのは、保守性を高める鉄則です。
- `On Error Resume Next` の慎重な扱い:
ファイルが書き込み禁止だったり、別のアプリで開かれているとエラーになります。エラーで止まるのではなく、ユーザーに通知して正常に終了させるのが「止まらない自動化」の肝です。
—
4. 陥りやすい罠と対策
「イベントが動かない!」という時は
Visioの設定で「マクロを有効にする」ことが必須です。また、イベントが有効でない場合があります。一度ファイルを保存し、閉じてから再度開いてみてください。
PDF出力時の警告
`ExportAsFixedFormat` は非常に強力ですが、環境によってはダイアログが出る場合があります。本番運用では、オプション設定を細かく指定することで、完全にバックグラウンドで処理を完結させることも可能です。
—
まとめ:自動化の先にあるもの
今回紹介した「閉じる時にPDF更新」は、単なる便利機能ではありません。「図面とPDFの整合性を常に保つ」という品質管理の自動化です。
Visio VBAは、オブジェクト指向の考え方を少し知るだけで、世界がガラリと変わります。「マクロの記録」で生成された冗長なコードを卒業し、こうしたイベント駆動のロジックを書けるようになれば、あなたはもう中級者の入り口に立っています。
次は、保存時に自動で図面内の「版数」をインクリメントする処理などにも挑戦してみてください。
何か技術的に詰まったら、いつでも質問してくださいね。応援しています!
