こんにちは! Visioの図面自動化やシェイプの海に溺れかけていませんか?
マクロの記録ボタンを押して図形を描くのは卒業したけれど、「複数のVisioファイルに同じVBAコードを配るのが面倒くさい」「コードを修正するたびに何個もファイルを開いてコピペして……って、やってられない!」と頭を抱えているそこのあなた。
今日は、そんな苦行から解放されるための極上の知見をお伝えします。
テーマは「VBAモジュールの自動インポート/エクスポート:`Document.VBProject`によるコード管理の自動化」です。
ここをクリアすれば、あなたのVisio VBAスキルは「お絵描きマクロ職人」から「真のシステム自動化エンジニア」へと一段階上に飛躍します。一緒にマスターしていきましょう!
—
1. なぜVisioのVBAコード管理はめんどくさいのか?
通常、VisioのVBAコード(マクロ)は、`.vsd`や`.vsdm`といったドキュメントの内部に閉じ込められています。
そのため、次のような問題が起きます。
- コードのバージョン管理ができない(Git等で差分が見にくい)
- 10個のファイルがあれば、10個すべてを開いてコードをコピペして回る必要がある
- 修正漏れやバージョンの混同が起きる
これを解決するのが、「外部のテキストファイル(`.bas`や`.cls`)から、プログラムの力で一瞬にしてVisioへコードを流し込む(あるいは抜き出す)」というテクニックです。
—
2. 扉を開く鍵:`Document.VBProject` との出会い
Visioの裏側では、VBE(Visual Basic Editor)という開発環境が動いています。
そして、そのVBEのプロジェクト(コードのまとまり)を司るのが、`VBProject` オブジェクトです。
Visioの文書オブジェクト (`Document`) から、この `VBProject` を叩くことで、コードの追加・削除・エクスポートがプログラムから自在に行えるようになります。
⚠️ 最重要:これを忘れると100%動かない「セキュリティの罠」
コードを書き始める前に、ExcelやVisioの歴史が生んだ最大の関所を越えなければなりません。
プログラムから `VBProject` を操作するには、ExcelやVisioのセキュリティ設定で「VBA プロジェクトへのプログラムからのアクセスを信頼する」にチェックを入れる必要があります。
1. Visioを開き、`ファイル` > `オプション` > `トラスト センター` を開く。
2. `トラスト センターの設定` ボタンをクリック。
3. `マクロの設定` 項目にある 「VBA プロジェクトへのプログラムからのアクセスを信頼する」 にチェックを入れる。
※これをやっていないと、後述するコードを実行した瞬間に、冷酷なエラー「プログラムから Visual Basic プロジェクトにアクセスできません」が返ってきます。現場で一番ハマるポイントなので最初に済ませておきましょう。
—
3. 実践!外部ファイルをVisioに一括インポートするVBAコード
それでは、外部フォルダ(例: `C:\VisioMacros\`)に置いてある標準モジュール(`.bas`)を、対象のVisioファイルへ自動でインポートする実用スクリプトを公開します。
このコード自体は、操作用の「親となるVisioファイル(あるいはExcelなど)」に書いて実行します。
Sub ImportModulesToVisio()
Dim targetDoc As Document
Dim targetPath As String
Dim modulePath As String
Dim vbComp As Object
‘ 1. インポート先のVisioファイルのパスを指定
targetPath = “C:\VisioWork\MyDrawing.vsdm”
‘ 2. インポートしたい.basファイルのパスを指定
modulePath = “C:\VisioMacros\MyUtilityModule.bas”
‘ 3. 対象のVisioドキュメントを開く
Set targetDoc = Application.Documents.Open(targetPath)
On Error GoTo ErrorHandler
‘ 4. VBProjectのVBComponentsコレクションに対してモジュールを追加
‘ ※ここで Document.VBProject を使用します
Set vbComp = targetDoc.VBProject.VBComponents.Import(modulePath)
‘ 5. 保存して閉じる
targetDoc.Save
targetDoc.Close
MsgBox “モジュールのインポートが完了しました!”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
If Not targetDoc Is Nothing Then targetDoc.Close False
End Sub
コードの解説
- `targetDoc.VBProject`: ここが今回の心臓部です。Visioドキュメントが抱えるVBAの庭(プロジェクト)にアクセスしています。
- `.VBComponents.Import(path)`: 指定したパスにあるテキストファイル(`.bas`や`.cls`)を読み込み、VBAのモジュールとして組み込んでくれる強力なメソッドです。
—
4. 逆にコードを吸い出す! エクスポートの極意
「現場で修正された最新のコードを、逆に回収してバックアップしたい」という場合は、エクスポート機能を使います。
Sub ExportModulesFromVisio()
Dim targetDoc As Document
Dim targetPath As String
Dim exportDir As String
Dim vbComp As Object
targetPath = “C:\VisioWork\MyDrawing.vsdm”
exportDir = “C:\VisioMacros\Exported\”
Set targetDoc = Application.Documents.Open(targetPath)
‘ プロジェクト内のすべてのコンポーネント(標準モジュール、クラス、フォーム等)を走査
For Each vbComp In targetDoc.VBProject.VBComponents
‘ 1 = 標準モジュール, 2 = クラスモジュール, 3 = フォーム
If vbComp.Type = 1 Or vbComp.Type = 2 Then
‘ Exportメソッドでファイルとして出力
vbComp.Export exportDir & vbComp.Name & IIf(vbComp.Type = 1, “.bas”, “.cls”)
End If
Next vbComp
targetDoc.Close False
MsgBox “すべてのコードのエクスポートが完了しました!”, vbInformation
End Sub
これを使えば、Visioファイルの実体とコードのテキストファイルを完全に切り離して管理できるようになります。チーム開発やバージョン管理(Gitなど)との相性も抜群に良くなりますね。
—
5. 現場でありがちなトラブルと知見
最後に、この手法を実務に導入した先輩たちが必ず直面する「罠」と、その回避策を共有しておきます。
1. 「同名のモジュールが既に存在する」エラー
- 現象: すでにVisio内にあるモジュールと同じ名前のファイルをインポートしようとするとエラーになります。
- 対策: インポートする前に、同名のコンポーネントが存在するかチェックし、存在する場合は `targetDoc.VBProject.VBComponents.Remove` で削除してからインポートするロジックを挟みましょう。
2. 拡張子の罠(`.vsd` vs `.vsdm`)
- 現象: 古いマクロなしフォーマット(`.vsd`)や、マクロ有効図面ではない形式に対してVBProject操作を行うと、容赦なくエラーが起きます。
- 対策: VBAを組み込むファイルは必ずマクロ有効図面(`.vsdm` または `.vstm`)を使用してください。
—
まとめ
いかがでしたでしょうか?
`Document.VBProject` を手懐けることができれば、何百個ものVisioファイルに散らばるマクロの一斉アップデートも、ボタン一つ、あるいはバッチ処理のように自動化できるようになります。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ!」
手作業でのコピペ地獄とは今日でサヨナラして、スマートでモダンな自動化ライフを手に入れましょう。あなたのエンジニアリングライフの躍進を応援しています!
