【入門編】【上級者向け】Visio VBAで作成したツールをアドイン化し、リボンメニューからPDF出力や保存を制御する配布用パッケージング – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化を極める旅へようこそ。
これまで、個別の図面ファイル(.vsdm)にマクロを埋め込み、自分のパソコンだけで図面整理やPDF出力を自動化してきたことと思います。

「この便利なツール、チームのメンバーにも使ってもらいたいな」
そう思った時、マクロ入りのファイルをそのまま配ると、どうなるでしょう?
「マクロのセキュリティ警告が出て動かない」「誰かがコードをうっかり書き換えて壊してしまった」「新しいバージョンを配るたびに各人の設定がリセットされる」……現場のエンジニアなら誰もが頭を抱える悪夢の始まりです。

今回は、プロの現場で使われている「VSSM(マクロ有効ステンシル)を活用したアドイン化」と、「リボンメニューからのPDF出力制御」の極意を伝授します。
ここをクリアすれば、あなたの作ったVisioツールは、一気に「製品レベルの業務用パッケージ」へと生まれ変わります。一緒に本質をマスターしていきましょう!

—

1. なぜ「VSSMアドイン」なのか?(基本概念の整理)

多くの初学者が陥る罠は、`.vsdm`(マクロ有効図面)の中にコードを書き続けることです。しかし、配布用ツールを作るなら選択肢は一つ、`.vssm`(マクロ有効ステンシル)をVisioの起動時フォルダ(Startup)に配置する手法です。

アーキテクチャの比較

  • VSDM方式(個人用): ファイルごとにコードが依存。コードのアップデートが困難。
  • VSSMアドイン方式(配布用): Visio起動時にバックグラウンドで常駐し、どんな図面を開いていても「専用のリボン」と「共通の機能」を提供できる。

「ステンシルって、図形を置いておくパレットじゃないの?」と思った方、素晴らしい着眼点です。実はVisioのステンシルは、裏でVBAコードを保持し、イベントをフックし、独自のUI(リボン)を描画する最強のプログラムコンテナになり得ます。

—

2. 配布用パッケージの全体像

私たちが目指すゴールは以下の構成です。

1. マクロ有効ステンシル(`EnterpriseTools.vssm`)を作成する。
2. その中に、PDF出力や独自保存を制御する標準モジュール(`PdfExportModule`)を配置する。
3. RibbonX(XML)を用いて、Visioのリボンメニューに専用タブ「業務支援」を追加し、ボタンを押すとVBAが走るようにする。
4. このファイルを会社の共有サーバーやインストーラー経由で、全メンバーのVisioスタートアップフォルダに配布する。

—

3. 実装コード:堅牢なPDF出力エンジンの構築

まずは、エンジンの心臓部となるVBAコードを書きましょう。
ただPDFを出力するだけなら一行ですが、実務では「図面の保存先チェック」「レイヤーやページの制御」「エラーハンドリング」が不可欠です。

以下のコードを、VSSM内の標準モジュールに記述してください。

Option Explicit

‘ =========================================================================
‘ 業務標準:高品質PDFエクスポート&保存制御エンジン
‘ =========================================================================
Public Sub ExportActiveDocToStandardPDF()
Dim targetDoc As Visio.Document
Dim sourcePath As String
Dim pdfPath As String
Dim fso As Object

‘ エラーハンドリングの要
On Error GoTo ErrorHandler

‘ 1. アクティブな図面の取得と検証
If Visio.Application.Documents.Count = 0 Then
MsgBox “処理対象となる図面が開かれていません。”, vbExclamation, “PDF出力エラー”
Exit Sub
End If

Set targetDoc = Visio.Application.ActiveDocument

‘ 2. 未保存(新規作成のまま一度も保存されていない)図面のガード
If targetDoc.Path = “” Then
MsgBox “この図面はまだ保存されていません。” & vbCrLf & _
“一度名前を付けて保存してからPDF出力を行ってください。”, vbExclamation, “保存確認”
Exit Sub
End If

‘ 3. 出力パスの動的生成(同階層の「PDF」フォルダに自動保存)
Set fso = CreateObject(“Scripting.FileSystemObject”)
sourcePath = targetDoc.Path

‘ PDF格納用サブフォルダがなければ作成する
If Not fso.FolderExists(sourcePath & “PDF”) Then
fso.CreateFolder sourcePath & “PDF”
End If

‘ 拡張子を.vsdmから.pdfへ置換
Dim baseName As String
baseName = fso.GetBaseName(targetDoc.Name)
pdfPath = sourcePath & “PDF\” & baseName & “_” & Format(Now, “yyyymmdd_hhnnss”) & “.pdf”

‘ 4. VisioネイティブのPDFエクスポート実行
‘ (VisioのExportメソッドは、印刷設定やページ範囲を忠実に反映します)
targetDoc.ExportAsFixedFormat Visio.VisFixedFormatTypes.visFixedFormatPDF, _
pdfPath, _
Visio.VisPrintixen.visPrintAllPages, _
Visio.VisOpenDoc.visOpenHidden

MsgBox “PDFの出力が完了しました!” & vbCrLf & pdfPath, vbInformation, “成功”

Exit Sub

ErrorHandler:
‘ 予期せぬエラーの捕捉
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”

End Sub

コードのポイント解説

  • `targetDoc.Path = “”` のチェック: 初学者が最も踏みやすい地雷が、未保存のドキュメントに対するパス操作エラーです。ここで優しく弾くことで、ユーザーのイライラを防ぎます。
  • `Scripting.FileSystemObject`: VBAからファイルシステムを安全に操作するための定番オブジェクト。PDF専用の保存フォルダを自動生成するスマートな実装です。
  • タイムスタンプの付与: 同名ファイルの競合を防ぐため、出力ファイル名に `yyyymmdd_hhnnss` を付与しています。バージョン管理のトラブルが激減します。

—

4. リボンメニュー(UI)からの制御

VBAを書いただけでは、ユーザーは「Alt + F8」を開いてマクロを探さなければなりません。これでは一般のメンバーにとってハードルが高すぎます。
プロのツールは、「リボン」に専用のボタンを用意するのが鉄則です。

Visioのリボンカスタマイズには RibbonX(XML) を使用します。VSSMファイルのカスタムUIパーツに以下のXMLを埋め込みます。








タイトルとURLをコピーしました