【入門編】【全対象】VSDXの保存先パスに日本語や特殊文字が含まれる場合のパスエンコード対策 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が呪文のようで手が出せない…」そんな時期を過ごしていませんか?

今回は、多くの開発者が現場で涙を飲む「ファイルパスの罠」について、徹底的に解説していきます。
特に、共有サーバーやクラウドストレージ(OneDriveやSharePointなど)、そして日本語のフォルダ名が絡むパスを扱うとき、Visioは突然機嫌を損ねてエラーを吐き出します。

ここをクリアすれば、あなたのVBAスキルは「初心者」を完全に脱却し、現場で頼られる自動化エンジニアの仲間入りです。一緒に本質をマスターしていきましょう!

—

1. なぜ、日本語や特殊文字のパスでVisioは機嫌を損ねるのか?

Visioで作成した図面ファイル(.vsdx)を保存しようとしたとき、次のような経験はありませんか?

  • 「ファイルが見つかりません」という謎のエラーが出る
  • ローカルPCでは動くのに、ネットワークドライブ(`\\server\share\…`)やOneDrive上のフォルダを指定すると保存できない
  • 日本語のフォルダ名が含まれていると、突然マクロが沈黙する

これには、Windowsのファイルパス処理の歴史と、VisioのCOMコンポーネントが抱える文字コードの解釈の癖が深く関わっています。

初学者が陥りがちな「生のパス」の罠

例えば、次のようなコードを書いたとします。

‘ 【やってはいけない例】
ActiveDocument.SaveAs “C:\Users\管理者\OneDrive – 会社名\ドキュメント\構成図.vsdx”

一見、何の問題もなさそうに見えますよね。しかし、ここにはいくつかの「地雷」が埋まっています。
1. 日本語(全角文字):Windowsの内部処理やAPIによっては、マルチバイト文字の解釈でズレが生じることがあります。
2. スペースや特殊文字:`OneDrive – 会社名` に含まれるハイフンやスペースは、URLエンコード的な解釈やコマンドライン的な処理において誤作動の原因になります。
3. UNCパス(ネットワーク上のパス):`\\` から始まるパスは、Visioの古いファイルダイアログ系メソッドが正しく解釈できないケースがあります。

これを回避するためには、「VBAにパスを正しく翻訳・エスケープして伝える技術」が必要なのです。

—

2. 【極意】安全なパス処理を実現する3つのステップ

現場で絶対に失敗しないためのアプローチは、以下の3つです。

1. FileSystemObject (FSO) を活用する
文字列の連結でパスを作ると、スラッシュの抜けや全角・半角のミスが起きます。FSOを使ってパスをオブジェクトとして安全に結合します。
2. ファイル名とフォルダパスを分離して扱う
一気に長いパスを渡すのではなく、「どこに」「どんな名前で」保存するのかを明確に切り分けます。
3. エラーハンドリング(網の目)を張る
万が一、パスが無効だったりアクセス権がない場合に、VBAが強制終了するのを防ぎます。

—

3. 実践!コピペで使える「堅牢なVSDX保存プロシージャ」

それでは、実際の現場でそのまま使える、極めて安全なVSDX保存のサンプルコードをお見せします。
先輩エンジニアからのプレゼントだと思って、ぜひあなたのVBAエディタ(VBE)に貼り付けて動かしてみてください。

Option Explicit

Sub SaveVsdxSafely()
‘ —————————————————-
‘ 目的: 日本語やクラウドパスを含む環境でも確実にVSDXを保存する
‘ —————————————————-

Dim targetDir As String
Dim fileName As String
Dim fullPath As String

‘ FileSystemObjectを使うための変数を宣言
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

On Error GoTo ErrorHandler

‘ ① 保存先のディレクトリを指定(例としてデスクトップやOneDriveを想定)
‘ ※実際の環境に合わせて書き換えてください
targetDir = “C:\Users\” & Environ(“USERNAME”) & “\Documents\VisioWork”

‘ ② フォルダが存在しなければ、FSOを使って自動作成する(日本語対応)
If Not fso.FolderExists(targetDir) Then
fso.CreateFolder targetDir
Debug.Print “フォルダを新規作成しました: ” & targetDir
End If

‘ ③ ファイル名を設定(日本語やスペースを含めても安全なように分離管理)
fileName = “ネットワークインフラ構成図_2023.vsdx”

‘ ④ FSOの BuildPath を使って、スラッシュの重複などを防ぎながらパスを結合
fullPath = fso.BuildPath(targetDir, fileName)

‘ ⑤ ドキュメントの保存実行
‘ ※すでに同名ファイルがある場合の上書き確認なども考慮
If ActiveDocument.Path = “” Then
‘ まだ一度も保存されていない新規図面の場合
ActiveDocument.SaveAs fullPath
Else
‘ すでに保存されている場合は上書き保存、または名前を付けて保存
ActiveDocument.SaveAs fullPath
End If

MsgBox “ファイルの保存に成功しました!” & vbCrLf & “保存先: ” & fullPath, vbInformation, “保存完了”

GoTo Finally

ErrorHandler:
‘ エラーが発生した場合の優しい救済措置
MsgBox “保存中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “エラー発生”

Finally:
‘ オブジェクトの解放(メモリリーク防止のプロの作法)
Set fso = Nothing
End Sub

コードのここがポイント!

  • `Environ(“USERNAME”)`

ログインしているユーザー名を手動でハードコーディングせず、動的に取得することで、PCが変わってもコードが壊れません。

  • `CreateObject(“Scripting.FileSystemObject”)`

これが今回の最大のキモです。FSOを使うことで、Windowsのファイルシステムと安全に対話し、日本語パスや深い階層のパスを正しく解釈させることができます。

  • `fso.BuildPath`

「`C:\Folder`」と「`file.vsdx`」を結合するとき、「`\`が足りない」「二重についてしまった」というパス結合のバグを完全に防いでくれます。

—

4. さらに上を目指すあなたへ(クラウドストレージの注意点)

OneDriveやSharePoint上にファイルを保存する場合、同期ズレやファイルロック(他の人が開いているなど)が原因で、VBAから保存命令を出した瞬間にエラーになることがあります。

もしクラウド環境がメインの現場であれば、保存直前に以下の一行を挟んで、Visioに「少し待ってあげる(処理を落ち着かせる)」配慮をすると、さらに安定性が増します。

‘ 保存処理の直前にCPUに少し息をつかせる(必要に応じて)
DoEvents

また、ネットワークドライブのパス(UNCパス:`\\server\folder\…`)を指定する場合は、VBAがそのパスを認識するまでにわずかなタイムラグがあるため、FSOの `FolderExists` で事前に接続確認(存在確認)を行うのが、プロのエンジニアの鉄則です。

—

まとめ

いかがでしたでしょうか?
今回は、VSDXの保存パスに潜む日本語や特殊文字の罠と、それを華麗に回避する `FileSystemObject` を使ったアプローチを解説しました。

  • パスは文字列として力技で繋がず、`FileSystemObject` を使って安全に組み立てる。
  • フォルダの有無を自動でチェック・作成するロジックを組み込む。
  • エラーハンドリングとオブジェクトの解放を忘れない。

ここさえ押さえておけば、どんな複雑なネットワーク環境やクラウドストレージが相手でも、もうVisio VBAで慌てることはありません。
ぜひ明日の業務から、この「ワンランク上のコード」を取り入れてみてくださいね。あなたの自動化ライフを、心から応援しています!

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