こんにちは!Visio VBAの奥深い世界へようこそ。
マクロの記録ボタンを押して図形を動かすだけのステージから、「Visioそのものを自在にプログラミングで操る」という次のステージへ進む準備はできていますか?
今回は、Visio VBAの真骨頂とも言える「Document.VBProjectを用いたVBAモジュールの動的挿入」、そしてそれを用いた「自己拡張型ツール(自動ビルダー)の開発」について徹底解説します。
「他の人にマクロ入りのVisio図面を配りたいけれど、毎回手動でVBAのコードをインポートするのは面倒……」
「ボタン一つで、プログラム自身がコードを組み込み、最新の機能を持った配布用ファイルを生成させたい!」
そんな現場の悩みを一発で解決するテクニックを、私の経験を交えながら優しく、そして深く伝授しましょう。ここをクリアすれば、あなたのVisio自動化スキルは間違いなくプロの領域に達します。
—
1. なぜ「コードからコードを挿入する」必要があるのか?
通常、VisioでVBAを書くときは、VBAエディタ(Alt + F11)を開いて手動でモジュールを追加し、コードを貼り付けますよね。
しかし、企業で数十人のメンバーに業務ツールを配布する場合や、システムから動的に図面テンプレートを生成する場合、手動でのインポート作業はヒューマンエラーの元になります。
ここで登場するのが、Visioドキュメントが持つ `VBProject` オブジェクトです。これを利用すると、VBAのプログラム自身に別のモジュールファイルを読み込ませ、新しい図面ファイルに機能を「移植(自己拡張)」させることができるのです。
—
2. 開発の前に:絶対に避けて通れない「セキュリティの壁」
コードを書く前に、Visio VBAで最も重要な前提条件をお話ししておきます。これを忘れると、どんなに正しいコードを書いてもエラーで撃墜されます。
⚠️ 開発者向け必須設定
Visio(およびOffice製品)のセキュリティ設定により、デフォルトでは外部からVBAのプロジェクト(VBProject)へプログラムでアクセスすることが禁止されています。
1. Visioを起動し、[ファイル] > [オプション] > [トラスト センター] を開きます。
2. [トラスト センターの設定] ボタンをクリックします。
3. [マクロの設定] から、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」 にチェックを入れます。
※この設定がないと、後述するコードを実行した瞬間に「プログラムによる Visual Basic プロジェクトへのアクセスは信頼されていません。」というエラー(実行時エラー 1004)が発生します。実務では必ず確認しておきましょう。
—
3. 実装:VBAモジュールを動的にインポートするコード
それでは、実際に別の場所にある `.bas`(標準モジュールファイル)を、実行中のVisioドキュメントにプログラムからインポートするコードを見てみましょう。
このコードは、現在アクティブなドキュメントに新しい標準モジュールを突撃させる魔法のスクリプトです。
Sub InjectModuleDynamically()
Dim targetDoc As Visio.Document
Dim vbProj As Object ‘ VBIDE.VBProject
Dim vbComp As Object ‘ VBIDE.VBComponent
Dim moduleFilePath As String
‘ 1. 操作対象のドキュメントを定義(今回はアクティブドキュメント)
Set targetDoc = ActiveDocument
‘ 2. インポートしたいVBAモジュール(.basファイル)のパスを指定
‘ ※あらかじめPC上にエクスポート済みのモジュールファイルを用意しておきます
moduleFilePath = “C:\VisioTools\MyAwesomeModule.bas”
‘ ファイルが存在するか簡易チェック
If Dir(moduleFilePath) = “” Then
MsgBox “指定されたモジュールファイルが見つかりません: ” & moduleFilePath, vbCritical
Exit Sub
End If
On Error GoTo ErrorHandler
‘ 3. ドキュメントからVBProjectを取得
‘ ※VisioのVBProjectにアクセスするには、前述のトラストセンター設定が必須です
Set vbProj = targetDoc.VBProject
‘ 4. モジュールのインポート実行
‘ VBProject.VBComponents.Importメソッドを使用します
Set vbComp = vbProj.VBComponents.Import(moduleFilePath)
MsgBox “モジュール ‘” & vbComp.Name & “‘ の動的インポートに成功しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description & ” (エラー番号: ” & Err.Number & “)”, vbCritical
End Sub
コードのポイント解説
- `targetDoc.VBProject`: Visioのドキュメント(`.vsdm` などのマクロ有効ドキュメント)の裏側にあるVBAプロジェクト実体です。
- `VBComponents.Import(path)`: 指定したパスにあるテキストベースのVBAコードファイル(`.bas` や `.cls`)を読み込み、プロジェクトに組み込みます。これだけで、手動でインポートしたのと全く同じ状態になります。
—
4. 応用:自己拡張型ツール(配布用ファイルの全自動生成)
ここからが本番です。
「マスターとなる母艦ツール」が、ボタン一つで新規図面を作成し、そこにコードを自動インポートした上で、「業務配布用ファイル(.vsdm)」として別名保存する、という自己拡張型ツールの全体像です。
以下のコードを、母艦ツールの標準モジュールに貼り付けて実行してみてください。
Sub CreateAndDistributeTool()
Dim srcDoc As Visio.Document
Dim newDoc As Visio.Document
Dim savePath As String
Dim modulePath As String
Set srcDoc = ActiveDocument
modulePath = “C:\VisioTools\AutoProcessLogic.bas” ‘ 組み込む機能のコード
savePath = “C:\VisioTools\Distribute\AutoGeneratedTool.vsdm”
‘ 1. 新規のマクロ有効ドキュメントをテンプレートなしで作成
‘ ※必ずマクロが保存できる形式(.vsdm)を意識します
Set newDoc = Documents.Add(“”)
‘ 2. 新規ドキュメントのVBProjectにロジック(モジュール)を流し込む
On Error GoTo CleanUp
newDoc.VBProject.VBComponents.Import modulePath
‘ 3. ついでに、操作用のボタン(シェイプ)をページ上に自動配置してみる
Dim shp As Visio.Shape
Set shp = newDoc.Pages(1).DrawRectangle(1, 5, 4, 4)
shp.Text = “ここを押して実行”
‘ ※シェイプにマクロ(Action)を割り当てる高度な設定もここで可能ですが、今回は割愛します
‘ 4. 自動生成されたファイルを指定パスに保存
newDoc.SaveAs savePath
MsgBox “配布用ツールの自動生成が完了しました!” & vbCrLf & “保存先: ” & savePath, vbInformation, “ビルダー完了”
Exit Sub
CleanUp:
MsgBox “生成プロセスでエラーが発生しました: ” & Err.Description, vbCritical
If Not newDoc Is Nothing Then
‘ 保存せずに閉じる
newDoc.Close
End If
End Sub
—
5. 陥りやすい罠とエンジニアの知見(トラブルシューティング)
この「動的モジュール挿入」を実務で使い始めると、いくつかの「Visioならではの罠」に遭遇します。私の失敗から得た知見をシェアしておきますね。
1. ファイル形式は必ず「.vsdm」または「.vsd」(マクロ有効)にすること
- 通常の `.vsdx`(マクロなし形式)に対して `VBProject` を操作しようとすると、プロジェクト自体が存在しないためエラーになります。必ずマクロ有効図面として新規作成、または保存してください。
2. 同名モジュールのコンフリクト(競合)
- すでにインポート済みのモジュール名と同じ名前の `.bas` ファイルをインポートしようとすると、「同名のモジュールが既に存在します」というエラーになります。動的インポートを行う前に、既存のコンポーネントを削除(Remove)するガードロジックを入れておくと完璧です。
- (例: `vbProj.VBComponents.Remove vbProj.VBComponents(“ModuleName”)`)
3. セキュリティソフトや組織のグループポリシー(GPO)
- 大規模な組織では、「VBA プロジェクト オブジェクト モデルへのアクセス信頼」がGPOによってレジストリで強制ロックされている場合があります。この場合、手動でもチェックボックスが触れないため、IT部門に例外申請が必要になるケースがあります。
—
おわりに:ここをクリアすれば、Visio VBAはあなたのもの
今回は、`Document.VBProject` を使ったVBAモジュールの動的挿入と、自己拡張型ツールの開発について解説しました。
「マクロを書く人」から「マクロを生み出す仕組みを作る人」へ。
このアプローチをマスターすると、Visioを使った業務自動化の可能性は無限大に広がります。定型的な図面生成システムや、自動レポート配布ツールの裏側で、この技術が静かに、しかし確実に働いてくれます。
「ここがちょっと分かりにくかった」「こういう応用はできる?」といった疑問があれば、いつでも先輩エンジニアに聞いてくださいね。あなたのVBAライフを心から応援しています!
