【Visio VBA極限活用】VSDMの限界を超えろ!VSSMアドインとリボンカスタマイズで実現する「配布用PDF出力パッケージ」の極意
こんにちは。チーフアーキテクトの私だ。
これまで、個人のマクロ有効図面(.vsdm)にVBAを書き込み、社内ニートのように「図面を開くたびにマクロを有効化してください」とポップアップと格闘してきた開発者に告ぐ。
その設計、今日で終わりだ。
実務において、VBA製ツールを他部門へ展開する際、`.vsdm`のままでのファイル共有は悪夢でしかない。リンク切れ、マクロのセキュリティブロック、勝手にコードを書き換えられるリスク、そしてバージョンアップ時の全ファイル差し替え地獄。
プロのエンジニアが選ぶべき道は一つ。
「Visioステンシルアドイン(.vssm)」によるコードの集中管理と、リボンUI(CustomUI)からのシームレスなPDF出力制御だ。
今回は、全ユーザーのVisioに強制常駐させ、リボンメニューから一撃で厳密なレイアウト制御付きPDFを出力する「配布用パッケージング」の全技術を叩き込む。
—
1. なぜ `.vsdm` 配布は現場を崩壊させるのか?
現場の担当者にVBA入り図面を配ると、決まって以下の問題が発生する。
1. セキュリティの壁:Microsoftの厳格化により、ネットワーク上の`.vsdm`のマクロはデフォルトでブロックされる。
2. コードの分散と陳腐化:テンプレートがコピーされるたびにマクロが分岐し、修正が入るたびに全ファイルを回収・上書きする羽目になる。
3. UIの欠如:ショートカット(`Alt + F8`)を開かせたり、クイックアクセスツールバーに頼るなど、エンドユーザービリティが最低最悪になる。
解決策:VSSMマスターステンシルによる「一元管理」
Visioのステンシルファイル(`.vssm`)にVBAコードを内包させ、それを「起動時アドインフォルダ(Startup)」に配置する。これにより、ユーザーがどの図面を開いていようとも、バックグラウンドでマクロが常駐し、リボンに独自のメニューを出現させることが可能になる。
—
2. アーキテクチャ全体像
今回の実装パッケージは以下の構成で構築する。
- `EnterprisePDFTool.vssm`(本体ステンシル兼アドイン)
- `ThisDocument`モジュール:リボンのコールバックとイベント監視
- 標準モジュール(`modExport`):PDF出力の厳密な座標計算とエクスポートロジック
- `CustomUI.xml`(リボン定義)
- 標準のVisioリボンに「業務ツール」タブを追加し、「社内標準PDF出力」ボタンを配置。
—
3. 実装ステップ:プロダクションコード
ここから先は、妥協のない実務レベルのコードだ。そのままプロジェクトに組み込んでほしい。
① リボン定義(CustomUI.xml)
まず、VSSMファイル内にカスタムUIを埋め込むためのXMLを定義する。VisioのリボンカスタマイズはExcelやWordと同様にOffice Fluent UIを採用している。
※注:このXMLはCustomUI Editor等のツールを使用してVSSMコンテナにインジェクトすること。
—
② イベントとライフサイクルの管理(`ThisDocument` モジュール)
アドインとしてロードされた瞬間からリボンやイベントをフックし、メモリリークや意図せぬ二重起動を防ぐ堅牢な実装を行う。
‘ Option Explicitはプロの絶対的戒律である
Option Explicit
‘ Visioアプリケーションイベントをキャッチするための変数
Private WithEvents visApp As Visio.Application
Private Sub Document_Open()
‘ VSSMがアドインとしてロードされた瞬間に走る初期化処理
Set visApp = Visio.Application
Debug.Print “Enterprise PDF Tool: Loaded successfully.”
End Sub
Private Sub Document_Close()
‘ クリーンアップ
Set visApp = Nothing
End Sub
‘ ==========================================
‘ リボンコールバック関数
‘ ==========================================
Public Sub OnExportPDFClicked(control As IRibbonControl)
On Error GoTo ErrorHandler
‘ 実行コンテキストの最適化(描画停止による爆速化)
With Visio.Application
.ScreenUpdating = False
.ShowAlerts = visAlertsNone
End With
‘ メインのPDFエクスポート処理を呼び出し
Call modExport.ExecuteStandardPDFExport
‘ 復元
With Visio.Application
.ScreenUpdating = True
.ShowAlerts = visAlertsDefault
End With
MsgBox “PDFのエクスポートが正常に完了しました。”, vbInformation, “出力完了”
Exit Sub
ErrorHandler:
‘ 障害発生時も必ず画面描画フラグを戻すこと。これを怠るとVisioがフリーズしたまま死ぬ。
Visio.Application.ScreenUpdating = True
Visio.Application.ShowAlerts = visAlertsDefault
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & Err.Description, vbCritical, “致命的エラー”
End Sub
—
③ 堅牢なPDFエクスポート・ロジック(標準モジュール: `modExport`)
単に `.ExportAsFixedFormat` を叩くだけのコードは素人だ。プロは、「保存先の自動生成」「ページサイズの動的最適化」「図面外のゴミの除外」を担保する。
Option Explicit
Public Sub ExecuteStandardPDFExport()
Dim docTarget As Visio.Document
Dim strPath As String, strFileName As String, strFullPath As String
Dim fso As Object
‘ アクティブなドキュメントを取得。無ければ即座に弾く。
On Error Resume Next
Set docTarget = Visio.ActiveDocument
On Error GoTo 0
If docTarget Is Nothing Then
Err.Raise 9999, “PDFExport”, “アクティブな図面が存在しません。PDF化する図面を開いてください。”
End If
‘ データベースやファイル保存パスの決定(ここではデスクトップへ自動出力する例)
Set fso = CreateObject(“Scripting.FileSystemObject”)
strPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\”
‘ 拡張子を除いたファイル名を取得
strFileName = fso.GetBaseName(docTarget.Name)
If strFileName = “” Then strFileName = “Untitled_Drawing”
‘ タイムスタンプ付与による上書き防止とトレーサビリティの確保
strFullPath = strPath & strFileName & “_” & Format(Now, “yyyymmdd_hhnnss”) & “.pdf”
‘ ==========================================
‘ Visio PDFエクスポートの核心処理
‘ ==========================================
‘ 参数:
‘ FixedFormatType: 1 (visFixedFormatPDF)
‘ FileName: 出力先パス
‘ Intent: 0 (visRasterized – 印刷用なら1 visPublish)
‘ PrintRange: 0 (visPrintAll) -> 全ページ出力
‘ PageIndexFrom / PageIndexTo: 範囲指定時のみ有効
‘ OpenAfterExport: True (出力後に自動プレビュー)
‘ IncludeProperties: True
‘ BeepOnComplete: False
docTarget.ExportAsFixedFormat _
visFixedFormatPDF, _
strFullPath, _
visRasterized, _
visPrintAll, , , _
True, _
True, _
False
Set fso = Nothing
End Sub
—
4. チーフアーキテクトからの実務運用アドバイス
1. アドインの配布パスの自動化
VSSMファイルを全ユーザーのローカル環境にある `C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Visio\STARTUP`(または組織の共通ネットワークドライブ上のVisioスタートアップパス)に強制配置するバッチファイル(`.bat`)やPowerShellスクリプトを情シス部門と連携して配れ。これにより、Visio起動時に自動ロードされる。
2. バージョン管理の極意
VSSMはバイナリファイルのためGit管理しにくい。コード本体は必ずテキストとしてエクスポート(`.bas`, `.cls`)してバージョン管理システム(Gitなど)に保存し、リリース時のみVSSMへインポートしてビルドするパイプラインを組め。
3. エラーハンドリングの徹底
Visio VBAはCOMの例外を吐きやすい。特にマルチページ図面や巨大なCAD図面をインポートした図面をPDF化する際、メモリ不足(Out of Memory)で落ちることがある。`On Error` による多重防御と、描画停止(`ScreenUpdating = False`)は絶対に忘れるな。
まとめ
コードを`.vsdm`のなかに閉じ込めて消耗する時代は終わった。
VSSMによるアドイン化とリボン制御を組み合わせることで、あなたは単なる「マクロが書ける人」から、「全社の図面業務をインフラレベルで支えるソリューション・アーキテクト」へとランクアップする。
さあ、その古い `.vsdm` をゴミ箱に捨て、次世代のパッケージングを構築したまえ。
