【入門編】Document.NameとDocument.FullNameの違いを活用した未保存ドキュメントの安全な検出と自動退避処理 – Visio VBA解析バイブル

スポンサーリンク

こんにちは。Visioの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺め、「なぜか動かない」「なぜかエラーで止まる」と頭を抱えたことはありませんか?

Visio VBAをマスターするコツは、ただコードを書くことではありません。「Visioが今、どのオブジェクト(対象物)をどう扱っているか」というライフサイクルを掌握することにあります。

今回は、多くの初心者が必ず一度は踏み抜く「未保存ドキュメントの罠」を回避し、堅牢な自動退避ロジックを組むための極意を伝授します。ここをクリアすれば、あなたはもう「マクロ記録の奴隷」ではありません。

1. なぜ「Name」と「FullName」を区別しなければならないのか?

Visioのオブジェクトモデルにおいて、`Document`オブジェクトには2つの重要な名前属性があります。

  • `Document.Name`: 「Drawing1.vsdx」のような、ファイル名そのもの。
  • `Document.FullName`: 「C:\Users\Documents\Drawing1.vsdx」のような、ディスク上の絶対パス。

ここが重要です。新規作成したばかりのドキュメントは、まだディスク上に存在しません。 そのため、`FullName`を参照しようとすると、Visioは「保存先がない!」とパニックを起こし、実行時エラーを吐き出すのです。

現場でよくある失敗パターン

「とりあえず`ActiveDocument.FullName`で保存先のパスを取得して、バックアップを取ろう」
これを行うと、未保存ファイルの場合に例外が発生し、せっかく書いたマクロが強制終了します。プロの現場では、「パスが存在するかどうか」を事前に確認するのが鉄則です。

2. 安全な自動退避ロジックの構築

以下のコードは、ドキュメントの状態をスマートに判定し、未保存ならデスクトップへ、保存済みなら元のフォルダのサブディレクトリへ退避する、現場でそのまま使える実用的なメソッドです。

Public Sub SafeBackupCurrentDocument()
Dim doc As Document
Dim targetPath As String
Dim backupFolder As String

Set doc = ActiveDocument

‘ 1. 名前からパスの有無を判定(パスが空なら未保存とみなす)
‘ InStr関数でパス区切り文字’\’が含まれているかチェックする高等テクニック
If InStr(doc.FullName, “\”) = 0 Then
‘ 【ケースA】未保存ドキュメントの場合:デスクトップへ退避
backupFolder = Environ(“USERPROFILE”) & “\Desktop\VisioBackup\”
targetPath = backupFolder & doc.Name & “.vsdx”
Else
‘ 【ケースB】保存済みドキュメントの場合:同一階層のBackupフォルダへ
backupFolder = Left(doc.FullName, InStrRev(doc.FullName, “\”)) & “Backup\”
targetPath = backupFolder & doc.Name
End If

‘ 2. バックアップフォルダの存在確認と作成(FSOを使わずにmkdirで簡潔に)
If Dir(backupFolder, vbDirectory) = “” Then
MkDir backupFolder
End If

‘ 3. ドキュメントの保存実行
On Error Resume Next ‘ 万が一のロック回避
doc.SaveAsEx targetPath, visSaveAsWS

If Err.Number = 0 Then
Debug.Print “バックアップ成功: ” & targetPath
Else
MsgBox “保存に失敗しました: ” & Err.Description
End If
On Error GoTo 0
End Sub

3. このコードが「プロ仕様」である理由

① `InStr` によるパス判定の美学

`doc.Path` が空かどうかを判定する手法もありますが、実は`FullName`の中に`\`が含まれているかをチェックする方が、Visioの内部仕様に対してより直接的で高速です。オブジェクトの境界線を意識した書き方と言えます。

② `MkDir` の活用とエラーハンドリング

フォルダが存在しない場合、プログラムはエラーで落ちます。`Dir`関数でフォルダの存在を確認し、なければ`MkDir`で作る。この「環境を自己修復する」意識が、堅牢な自動化には不可欠です。

③ `SaveAsEx` の選択

単なる `SaveAs` ではなく、`SaveAsEx` を使うことで、保存時のオプション(`visSaveAsWS` など)を細かく制御できます。これもまた、上位エンジニアが好んで使うテクニックです。

4. ステップアップへのアドバイス

Visio VBAを使いこなすために、まずは以下のステップを意識してください。

1. 「記録」を卒業する: マクロの記録で生成されたコードは、あくまで「ヒント」です。そのまま使わず、今回のように`ActiveDocument`や`ActivePage`を明示的に変数に格納する癖をつけましょう。
2. オブジェクトの「生存確認」をする: `If Not doc Is Nothing Then …` といったチェックを挟むだけで、予期せぬクラッシュは劇的に減ります。
3. VBEの「イミディエイトウィンドウ」を愛する: `Debug.Print` を使い、変数の状態を常に可視化してください。見えないものは制御できません。

今回の知識を身につければ、あなたはもう「動けばいいコード」を書くレベルから、「運用に耐えうるツール」を作れるエンジニアの入り口に立っています。

Visioという広大なキャンバスを、あなたのコードで自在に操ってください。応援していますよ。

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