こんにちは! Visioでの図面作成業務、いつもお疲れ様です。
「マクロの記録」を使って自動化の一歩を踏み出したものの、いざ他の人のPCで動かしてみたら「ステンシルが見つかりません!」というエラーに直面して頭を抱えていませんか?
「自分のPCでは動くのに、共有フォルダーに入れた途端に止まる……」
これは、VBA初学者が必ず通る最初の壁であり、同時に「プロのエンジニア」への分かれ道でもあります。
今回は、絶対パスのハードコードという悪習を断ち切り、ユーザーごとのローカル環境や社内共有ネットワークをスマートに自動探索してドキュメントを読み込む「堅牢なパス解決テクニック」を、優しく、そして本質的なところまで徹底解説します。
ここをクリアすれば、あなたのVisio VBAの基礎力は一気にプロの領域へ到達します。さあ、一緒に扉を開きましょう!
—
なぜ「絶対パスのハードコード」は地獄を生むのか?
皆さんは、VMや共有フォルダーにあるステンシルを開くとき、こんなコード書いていませんか?
‘ ──【やってはいけないアンチパターン】──
Dim st1 As Visio.Document
Set st1 = Documents.OpenEx(“C:\Users\Yamada\Documents\My Shapes\MyCustom.vssx”, visOpenDocked)
このコードの何が問題か、もうお気づきですね。
1. 担当者の名前が変わったらエラー(`Yamada`の部分)
2. PCが換わったらエラー
3. 社内共有ネットワークのドライブレター(`Z:` や `Y:` など)が人によって違うとエラー
これでは、あなた以外の誰も使えない「お蔵入りマクロ」になってしまいます。
業務自動化の鉄則は「環境差異をコードで吸収すること」です。これをVisioのオブジェクトモデルを使ってスマートに解決していきましょう。
—
Visioが持つ最強の武器:`Application.MyShapesPath`
Visioには、ユーザーが自分用のステンシルやテンプレートを保存する標準フォルダーのパスを教えてくれるプロパティが用意されています。それが `Application.MyShapesPath` です。
これを使えば、`C:\Users\[Windowsログイン名]\Documents\マイドキュメント\図形描画` のようなパスを、VBA側が勝手に(しかも環境を問わず正確に)取得してくれます。
まずは、そのパスがどうやって取れるのか、イミディエイトウィンドウで確認するコードを見てみましょう。
Sub CheckMyShapesPath()
‘ Visioが認識している「マイ シェイプ」のパスを表示する
Debug.Print “MyShapesPath: ” & Visio.Application.MyShapesPath
End Sub
これを実行すると、現在Visioを操作しているユーザー専用のパスが瞬時に取得できます。
しかし、実務では「自分のMy Shapes」だけでなく、「総務部が管理する社内共有サーバーの共通ステンシル」も同時に扱いたいケースがほとんどですよね。次はその動的解決の本丸に迫ります。
—
実践! 共有フォルダー&ローカルを自動探索する堅牢コード
ここからが本記事のメインディッシュです。
「共有サーバーのパス」と「ローカルのMy Shapes」の両方を網羅し、ファイルが存在するかどうかを事前にチェック(FSOを使用)してから安全に開く、実務レベルのプロシージャを公開します。
以下のコードを、あなたのVisioの標準モジュールにそのまま貼り付けてみてください。
Option Explicit
Sub OpenStencilRobustly()
Dim stencilName As String
Dim sharedFolder As String
Dim targetPath As String
Dim fso As Object
Dim stnDoc As Visio.Document
‘ 探索したいステンシルファイル名
stencilName = “CorporateStandard.vssx”
‘ 1. 社内共有フォルダーのパス(例:総務部共通ドライブなど)
‘ ※実際の環境のパスに書き換えてください
sharedFolder = “\\Server01\Public\VisioStencils\”
‘ 2. ファイルシステムオブジェクトの生成(ファイルの存在確認用)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ —————————————————-
‘ 探索ロジック①:まずは社内共有フォルダーを探す
‘ —————————————————-
targetPath = sharedFolder & stencilName
If fso.FileExists(targetPath) Then
GoTo OpenTheFile
End If
‘ —————————————————-
‘ 探索ロジック②:共有になければ、ローカルのMy Shapesを探す
‘ —————————————————-
targetPath = Visio.Application.MyShapesPath & stencilName
If fso.FileExists(targetPath) Then
GoTo OpenTheFile
End If
‘ —————————————————-
‘ どちらにもなければ、親切にエラーを通知して終了
‘ —————————————————-
MsgBox “必要なステンシルが見つかりませんでした。” & vbCrLf & _
“ファイル名: ” & stencilName, vbCritical, “パス解決エラー”
Exit Sub
OpenTheFile:
‘ —————————————————-
‘ 安全にステンシルをドッキング表示で開く
‘ —————————————————-
‘ すでに開いているかどうかの重複チェックを挟むとさらに完璧ですが、
‘ OpenExのドッキングオープンは堅牢です。
Set stnDoc = Visio.Documents.OpenEx(targetPath, visOpenDocked)
MsgBox “ステンシルを正常に読み込みました!” & vbCrLf & “パス: ” & targetPath, vbInformation, “成功”
‘ クリーンアップ
Set fso = Nothing
End Sub
—
コードのポイントと知っておくべき技術的背景
上記のコードには、現場で「絶対にバグらせない」ためのエンジニアの知恵がいくつか詰まっています。
1. `Scripting.FileSystemObject` による事前チェック
VBAで `Documents.OpenEx` を実行してファイルがない場合、容赦なく「実行時エラー(ファイルが見つかりません)」が発生し、マクロが強制終了します。
これを防ぐために、開く前に `fso.FileExists(targetPath)` でファイルの存在を「ゼロコスト(※極めて低負荷)」で確認しています。エラーハンドリング(`On Error Resume Next`)に頼るよりも、コードの意図が明確になり、デバッグも容易になります。
2. フォルダーパスの「スラッシュ・バックスラッシュ」の罠
共有フォルダーのパス(`\\Server01\…`)や `MyShapesPath` を扱う際、パスの末尾に `\`(バックスラッシュ)がついているかどうかは非常に重要です。
Visioの `MyShapesPath` は通常、末尾に `\` を含んだ文字列を返します。そのため、ファイル名を結合するときに `& “\” & stencilName` とすると `\\` が重複してエラーの原因になります。上記のコードでは、共有フォルダー側(`sharedFolder`)の末尾に確実に `\` を含める設計にすることで、このトラブルを未然に防いでいます。
—
挫折しないためのワンポイント・アドバイス
Visio VBAを書き始めの頃は、「いかに綺麗に書くか」よりも「いかに環境の変化に耐えられるか(=堅牢性)」が何倍も大切です。
今回ご紹介した `Application.MyShapesPath` と `FileSystemObject` の組み合わせは、WordやExcelのVBAでもそのまま応用できる、業務自動化の「黄金パタン」の一つです。
「パスのハードコードをなくす」
たったこれだけの意識改革で、あなたの書くマクロは「自分専用のおもちゃ」から「チーム全員を救う社内インフラ」へと生まれ変わります。
ここをクリアしたあなたなら、もうVisio VBAの基礎はバッチリです!
自信を持って、次の自動化のステップへ進んでくださいね。それでは、また次回のテックコラムでお会いしましょう!
