Visio VBAを掌握せよ:図面を守り抜く「世代管理バックアップ」の実装術
こんにちは。現場で泥臭く、かつエレガントに自動化を極めるエンジニアです。
Visioで複雑な図面を編集している最中、「保存ボタンを押す瞬間にアプリが落ちた」「間違えて上書き保存してしまい、数時間前の作業が消えた」という経験はありませんか?
Visioのファイルは非常にデリケートです。今日は、「Visioの保存イベントを自動検知し、タイムスタンプ付きでバックアップを強制生成する」という、実務で死ぬほど役に立つテクニックを伝授します。マクロの記録から一歩踏み出し、Visioのオブジェクトモデルを支配する「エンジニアの入り口」へ一緒に足を踏み入れましょう。
—
1. Visioオブジェクトモデルの「階層構造」を理解する
コードを書く前に、Visioがどう世界を認識しているかを知る必要があります。これを知れば、エラーの8割は自分で解決できるようになります。
- Application: Visioそのもの。全ての親。
- Document: 開いている図面ファイル。
- Page: 図面の中の「ページ」。
- Shape: ページ上の図形。
今回使うのは、`Document`オブジェクトです。この「ドキュメント」には、保存(BeforeDocumentSave)というイベントが備わっています。これを利用して、保存の瞬間を「ハック」します。
—
2. 「イベントハンドラ」という強力な武器
通常のVBAは、こちらから呼び出す(ボタンを押すなど)のが基本ですが、「イベントハンドラ」はVisioの特定の動きを監視し、勝手にコードを割り込ませる仕組みです。
以下の手順で、自動バックアップを実装します。
手順:コードの配置場所
1. Visioで `Alt + F11` を押し、VBAエディタを開く。
2. 左側のツリーから `ThisDocument` をダブルクリック。
3. ここにコードを貼り付けます。
実装コード:世代管理バックアップ
‘ ———————————————————
‘ 目的: 保存時に自動でタイムスタンプ付きバックアップを作成
‘ ———————————————————
Private Sub Document_BeforeDocumentSave(ByVal doc As IVDocument)
Dim backupPath As String
Dim timeStamp As String
Dim folderPath As String
‘ バックアップの保存先(必要に応じて変更してください)
folderPath = “C:\VisioBackup\”
‘ フォルダが存在しなければ作成
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If
‘ 日時文字列を作成 (例: 20231027_143005)
timeStamp = Format(Now, “yyyymmdd_hhnnss”)
‘ バックアップファイル名を作成
backupPath = folderPath & Left(doc.Name, InStrRev(doc.Name, “.”) – 1) & _
“_” & timeStamp & “.vsdx”
‘ エラーハンドリング:保存に失敗しても作業自体は止めない設計
On Error Resume Next
doc.SaveCopyAs backupPath
If Err.Number <> 0 Then
Debug.Print “バックアップ失敗: ” & Err.Description
Else
Debug.Print “バックアップ完了: ” & backupPath
End If
On Error GoTo 0
End Sub
—
3. このコードの「賢いポイント」
- `SaveCopyAs` の使用:
`SaveAs`を使うと「今編集しているファイル」自体がバックアップ先に切り替わってしまうリスクがありますが、`SaveCopyAs`なら「今の状態を別名でコピーする」だけ。メインの編集作業を一切中断させません。
- `On Error Resume Next` の意味:
バックアップ先のフォルダが書き込み禁止だった場合などにマクロが停止すると、ユーザーはパニックになります。ここでは「バックアップはあくまで保険。失敗してもメインの保存作業は止めてはならない」というプロの判断で、あえてエラーを無視させています。
- タイムスタンプのフォーマット:
ファイル名に日時を入れることで、世代管理が容易になります。これだけで、数日前の状態にいつでも戻れる安心感が手に入ります。
—
4. 初学者が陥りやすい罠と解決策
1. 「マクロが動かない!」
- 原因: セキュリティ設定です。「ファイル」>「オプション」>「トラストセンター」で、マクロを有効にする設定を確認してください。
2. 「ファイル名が取れない!」
- 原因: まだ一度も保存していない新規ファイル(Document1.vsdxなど)の場合、保存パスが存在しないためエラーになります。コードを運用する際は、必ず一度「名前を付けて保存」してから実行してください。
3. 「コードをどこに書いたか忘れた」
- 解決: `ThisDocument` に書くのが鉄則です。標準モジュールと違い、そのファイルを開いた瞬間にイベントの監視が自動的に開始されます。
—
最後に:自動化は「安心」を買う行為である
自動化の本質は、単なる効率化ではありません。「ミスをしても致命傷にならない環境」を設計することです。今回作成したコードは、あなたの数時間分の作業を、たった十数行のコードで守り抜く盾になります。
ここをクリアしたあなたは、もう「マクロの記録ボタン」を押すだけのユーザーではありません。Visioの心臓部に直接命令を下せる「エンジニア」の第一歩を踏み出しました。
次は、図形のプロパティを自動的に抽出してExcelに書き出す、そんな「データドリブンな図面管理」に挑戦してみませんか?応援しています。
