こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身がさっぱり分からない…」そんな時期を抜け出し、いよいよ本格的な自動化や堅牢なシステム構築に挑もうとしているあなたへ。
今回は、実務の現場で誰もが一度は絶望する「VSDXファイルの破損」をテーマに、Visio VBAを使った極限の自動リカバリー(復旧)システムを解説します。
「せっかく何時間もかけて描いた図面が、朝出社したら開かなくなった…!」
そんな悪夢を、スマートなVBAのコードで華麗に解決してみせましょう。ここをクリアすれば、あなたのVisio VBAスキルは間違いなくプロの領域へと一歩踏み出します。一緒にマスターしていきましょう!
—
なぜVisioファイルは壊れるのか?(そして、なぜVBAが必要なのか)
Visioのファイル(.vsdx)の実体は、実はZIP形式で圧縮された複数のXMLファイルの束です。
ネットワークの切断、保存中のPC強制終了、あるいは巨大すぎるシェイプのキャッシュエラーなどにより、この内部構造(ZIPの整合性やXMLのツリー)が崩れると、Visioは無情にもこう告げます。
> 「このファイルは破損しているため開くことができません。」
手動でバックアップから最新のものを探し、拡張子を直して……なんてやっている時間は、忙しいビジネスパーソンにはありませんよね。だからこそ、「ファイルを開く瞬間にエラーを検知し、自動的に安全なバックアップと差し替えて起動する」という防衛システムをVBAで構築しておく必要があるのです。
—
今回目指すアーキテクチャ
今回のスクリプトの動きは非常にシンプルかつ強力です。
1. ターゲットのファイルを開こうと試みる
2. もしファイル破損や何らかのエラーで開けなかった場合、VBAのエラーハンドラがそれをキャッチする
3. エラーを検知したら、あらかじめ用意した「バックアップフォルダ」から、最もタイムスタンプが新しい「正常なVSDXファイル」を探す
4. そのファイルを壊れたファイルの代わりに自動コピー&オープンし、ユーザーに警告を促す
言葉で書くと難しそうですが、VBAの「エラー捕捉機能(On Error)」とファイル操作を組み合わせれば、驚くほどスマートに実装できます。
—
実装コード:極限の自動復旧スクリプト
以下のコードを、VisioのVisual Basic Editor(VBE)の標準モジュールに貼り付けてください。実務でそのまま使えるよう、細部までガチガチにガードを固めています。
Option Explicit
‘ =================================================================================
‘ 処理名 : OpenVSDXWithAutoRecovery
‘ 概要 : VSDXファイルの破損を検知し、バックアップから自動復旧して開く
‘ =================================================================================
Public Sub OpenVSDXWithAutoRecovery()
Dim targetFilePath As String
Dim backupDir As String
Dim targetDoc As Visio.Document
‘ 【設定エリア】環境に合わせてパスを変更してください
targetFilePath = “C:\VisioData\NetworkLayout.vsdx”
backupDir = “C:\VisioData\Backup\”
‘ エラーが発生した場合は、ErrHandlerラベルへジャンプするように指定
On Error GoTo ErrHandler
‘ — 通常処理:ファイルを開く —
Debug.Print “対象ファイルを開きます: ” & targetFilePath
Set targetDoc = Visio.Documents.Open(targetFilePath)
‘ 正常に開けた場合の処理
MsgBox “図面ファイルが正常に開きました。”, vbInformation, “起動完了”
Exit Sub
ErrHandler:
‘ — 異常系処理:ファイルが破損している、または開けなかった場合 —
Dim userChoice As VbMsgBoxResult
MsgBox “警告: 対象のVisioファイルを開くことができませんでした。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “ファイルオープンエラー”
‘ ユーザーに自動復旧を試みるか確認
userChoice = MsgBox(“バックアップから最新の正常ファイルを復元して開きますか?”, _
vbYesNo + vbQuestion, “自動リカバリーの確認”)
If userChoice = vbYes Then
‘ 復旧ルーチンの呼び出し
Call RestoreLatestBackup(targetFilePath, backupDir)
Else
MsgBox “処理を中断しました。”, vbInformation, “キャンセル”
End If
End Sub
‘ =================================================================================
‘ 処理名 : RestoreLatestBackup
‘ 概要 : 指定フォルダから最新のVSDXファイルを特定し、ターゲットに上書きコピーする
‘ =================================================================================
Private Sub RestoreLatestBackup(ByVal destPath As String, ByVal srcDir As String)
Dim fso As Object
Dim srcFolder As Object
Dim fileItem As Object
Dim latestFile As Object
Dim maxDate As Date
‘ FileSystemObjectの生成(ファイル操作の王様です)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ バックアップフォルダの存在確認
If Not fso.FolderExists(srcDir) Then
MsgBox “バックアップフォルダが見つかりません: ” & srcDir, vbCritical, “復旧失敗”
Exit Sub
End If
Set srcFolder = fso.GetFolder(srcDir)
maxDate = 0
‘ フォルダ内のファイルを走査し、最も新しい.vsdxファイルを特定する
For Each fileItem In srcFolder.Files
If LCase(fso.GetExtensionName(fileItem.Name)) = “vsdx” Then
If fileItem.DateLastModified > maxDate Then
maxDate = fileItem.DateLastModified
Set latestFile = fileItem
End If
End If
Next fileItem
‘ 最新ファイルが見つかった場合
If Not latestFile Is Nothing Then
On Error GoTo CopyErr
‘ 壊れたファイルをバックアップで上書き(Overwrite = True)
fso.CopyFile latestFile.Path, destPath, True
MsgBox “以下のバックアップからの復元に成功しました。” & vbCrLf & _
latestFile.Name & ” (” & latestFile.DateLastModified & “)”, _
vbInformation, “復元完了”
‘ 復元したファイルを開き直す
Visio.Documents.Open destPath
Exit Sub
Else
MsgBox “有効なバックアップファイルが見つかりませんでした。”, vbCritical, “復旧失敗”
Exit Sub
End If
CopyErr:
MsgBox “ファイルのコピー中にエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
ジックリとコードの急所を解説していきましょう。
1. `On Error GoTo ErrHandler` の魔力
VBAで最も重要なのは「エラーが起きたときにプログラムを止めず、どうハンドリングするか」です。
通常、Visioで存在しないファイルや破損ファイルを `Documents.Open` しようとすると、そこでVBAは盛大にクラッシュします。しかし、事前にこの1行を仕込んでおけば、エラーが発生した瞬間にプログラムの制御を `ErrHandler:` ラベルへと優しくダイバート(回避)させることができます。
2. FileSystemObject (FSO) による堅牢なファイル操作
VBA標準の `Dir` 関数などでもファイル探索は可能ですが、日付の比較やフォルダの存在確認などをスマートに行うには、`Scripting.FileSystemObject` を使うのがプロの作法です。
`For Each fileItem In srcFolder.Files` を使って、バックアップフォルダ内にあるすべての `.vsdx` を総当たりし、`DateLastModified`(最終更新日時)を比較することで、「一番新しくて生きているファイル」を自動で特定します。
—
現場で陥りやすい罠とアドバイス
このスクリプトを運用するにあたって、現場のエンジニアがつまずきやすいポイントをいくつか共有しておきます。
- 罠1: ネットワークドライブ上の遅延
バックアップ先やターゲットファイルが社内のファイルサーバー(NAS)にある場合、ネットワークの応答速度によってファイルコピーが追いつかず、エラーになることがあります。必要に応じて `DoEvents` を挟むか、ローカルに一度キャッシュする設計を検討してください。
- 罠2: そもそもマクロを書いたファイル自体が壊れたら?
このコード自体を「破損したVSDX」の中に書いていると、ファイルが壊れた瞬間にこのコードも起動できなくなります。
【重要】 実務では、この自動復旧マクロは通常の業務図面とは切り離し、「マスターとなるアドイン(.vsl または .vsdm)」や、何もない空の起動用マクロブックに常駐させるのが、チーフアーキテクトとしての正しい設計です。
—
おわりに
今回は、Visio VBAにおけるファイル破損時の自動バックアップと復旧という、一歩進んだ実用的なテーマを解説しました。
「動くコード」を作るだけなら誰でもできます。しかし、「エラーが起きたときを見越して、システムが勝手に身を守る仕組み(フェイルセーフ)」までデザインできてこそ、真の業務自動化エンジニアです。
ここをクリアしたあなたなら、どんな巨大な図面ファイル群も、自信を持ってコントロールできるはずです。
日々の開発作業、ぜひ楽しんで進めてくださいね。あなたのVBAライフを、心から応援しています!
