こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身を見たら呪文のようで手が出せない……」そんな時期を過ごしていませんか?
今回は、Visio VBAの基礎でありながら、プロの現場でもっとも重要視される「パスの動的制御」についてお話しします。ここをクリアすれば、あなたの書くマクロは「おもちゃ」から「実用に耐える堅牢なシステム」へと一気に格上げされます。
肩の力を抜いて、優しく紐解いていきましょう。ここをクリアすれば、Visio VBAの基本はバッチリですよ!
—
1. なぜ「ハードコーディング」は悪なのか?
皆さんは、VBAの中でファイルを開くとき、こんな風に書いていませんか?
‘ 悪しきハードコーディングの例
Dim targetPath As String
targetPath = “C:\Users\Yamada\Documents\Visio\MyStencil.vssx”
Documents.Open targetPath
一見、動くので問題ないように思えますよね。しかし、このコードには「爆弾」が仕掛けられています。
もし、このVisioファイル(`.vsdx`)を同僚のPCに共有したらどうなるでしょうか? あるいは、会社のファイルサーバに移動させたり、来年フォルダ構成を変えたりしたら?
……そう、パスが見つからずにエラー(実行時エラー)で止まってしまいます。これがハードコーディング(固定値の埋め込み)の呪いです。
解決策:相対パスという「自立した」考え方
プロのエンジニアは、ファイルが「今どこに置いてあるか」を基準に考えます。
「今開いているVisioファイルと同じフォルダにある、あのファイルを読む」
このルール(相対パス)で作っておけば、フォルダ丸ごとUSBメモリで持ち歩こうが、クラウドで共有しようが、エラーを一切吐かずに動き続けます。
—
2. Visioオブジェクトモデルの主役たち
相対パスを実現するために、Visioの階層構造(オブジェクトモデル)の基本を確認しておきましょう。Visioの世界は、ロシアの民芸品「マトリョーシカ」のように綺麗に整理されています。
[Application] (Visioアプリ全体)
└─ [Documents] (開いている図面のコレクション)
└─ [ActiveDocument] = 【今、自分が操作している図面】
├─ .Path (今いるフォルダの場所)
└─ .Name (今のファイルの名前)
今回主役として使うのは、`ActiveDocument.Path` です。
これを使うと、今作業している `.vsdx` が保存されているフォルダのパス(例:`C:\Work\Projects\`)をノータイムで取得できます。
—
3. 実践!堅牢なファイル読み込みモジュール
それでは、実際に現場でそのまま使える、堅牢なパス管理&外部ステンシル読み込みのコードを見てみましょう。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Option Explicit
Public Sub LoadExternalStencilSafely()
‘ —————————————————-
‘ テーマ:ActiveDocument.Path を使った堅牢なパス管理
‘ —————————————————-
Dim currentDocPath As String
Dim stencilName As String
Dim targetStencilPath As String
Dim targetStencil As Document
‘ 1. 安全装置:まず図面が保存されているかチェックする
If ActiveDocument.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません!” & vbCrLf & _
“一度保存してからマクロを実行してください。”, vbExclamation, “保存エラー”
Exit Sub
End
‘ 2. ActiveDocument.Path から「現在地」を取得する
‘ ※末尾には自動的に “\” が付かない場合があるため、後続の結合に注意します
currentDocPath = ActiveDocument.Path
‘ 3. 読み込みたい外部ステンシルのファイル名
stencilName = “CustomShapes.vssx”
‘ 4. 現在地とファイル名を結合して「絶対パス」を動的に生成する
‘ (もしパスの末尾に “\” が無ければ補正する安全設計)
If Right(currentDocPath, 1) <> “\” Then
currentDocPath = currentDocPath & “\”
End
targetStencilPath = currentDocPath & stencilName
‘ 5. ファイルが本当に存在するかチェックする(FSOを使用)
If Not FileExists(targetStencilPath) Then
MsgBox “目的のステンシルが見つかりません!” & vbCrLf & _
“配置場所: ” & targetStencilPath, vbCritical, “ファイル不存在”
Exit Sub
End If
‘ 6. 外部ステンシルを安全に読み込む(ドキュメントとして開く)
‘ 既に開いている場合の重複エラーを防ぐため、存在チェックを挟むのがプロの技
On Error Resume Next
Set targetStencil = Documents.Item(stencilName)
On Error GoTo 0
If targetStencil Is Nothing Then
‘ 開いていなければ新しく開く
Set targetStencil = Documents.OpenEx(targetStencilPath, visOpenRO + visOpenHidden)
Debug.Print “ステンシルを新規に読み込みました: ” & stencilName
Else
Debug.Print “ステンシルは既にメモリ上に存在します。”
End If
MsgBox “外部ファイルの読み込みに成功しました!”, vbInformation, “完了”
End Sub
‘ — 【ヘルパー関数】指定したパスにファイルが存在するか確認する —
Private Function FileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
FileExists = fso.FileExists(filePath)
Set fso = Nothing
End Function
—
4. コードの注目ポイント(ここがプロの知見)
上記のコードには、現場で生き残るための「3つの防壁」が張られています。
1. 未保存チェック (`ActiveDocument.Path = “”` の検知)
新規作成しただけで一度も名前を付けて保存していない図面の場合、`Path` は空っぽになります。ここで処理を優しく止め、エラーを防ぐのが親切な設計です。
2. パスの区切り文字(`\`)の補正
Windowsのパスは `\` で区切られますが、環境やVisioのバージョンによって末尾のスラッシュの有無が揺らぐことがあります。`Right` 関数でチェックして補正するひと手間で、環境依存のエラーを完全にねじ伏せます。
3. ファイル存在確認(`FileSystemObject`)
「ファイルがない!」という理由でVBAが黄色くハイライトして停止するのを防ぎます。人間に対しても「どこに何がないのか」をメッセージボックスで優しく教えてあげましょう。
—
まとめ
いかがでしたでしょうか?
`ActiveDocument.Path` を味方につければ、あなたの作るVisioマクロは環境の変化に怯える必要がなくなります。コードを共有するときも、「同じフォルダに入れてね」と言い添えるだけで、誰でもすぐに動かせる美しいツールが完成します。
基礎の積み重ねこそが、最も強力な自動化への近道です。
ぜひ、あなたの日常業務のツールにもこの「相対パス設計」を取り入れてみてくださいね。それでは、また次の知見でお会いしましょう!
