こんにちは!Visioでの図面作成、いつもお疲れ様です。複雑なネットワーク図やフロアマップを作り込んでいる最中に、「あ、前の状態に戻したいのに上書き保存しちゃった……!」なんて冷や汗をかいた経験はありませんか?
マクロの記録から一歩進んで、自分の手でVBAを操れるようになると、こうした日常のトラブルやヒューマンエラーを完全になかったことにできます。
今回は、Visio VBAの基本であるオブジェクトモデルを味方につけ、図面を保存するタイミングで自動的に日時と編集者名を刻んだ「タイムスタンプ付きのバックアップ」を裏側で生成する、堅牢な保存ラッパーマクロの作り方を解説します。
ここをクリアすれば、Visio VBAの基本構造はバッチリですよ!一緒にマスターしていきましょう。
—
1. Visio VBAの階層構造(オブジェクトモデル)を掴もう
VisioのVBAを語る上で絶対に外せないのが、「オブジェクトモデル」という考え方です。Visioの世界は、ロシアの民芸品「マトリョーシカ」のように、大きな入れ物の中に小さな入れ物が綺麗に収まる階層構造になっています。
まずは、今回主役として扱う主要なオブジェクトの顔ぶれを見ておきましょう。
- Application(アプリ全体):Visioというソフトウェアそのもの。
- Document(図面ファイル):今あなたが開いているVsd/Vsdxファイル。
- Page(ページ):図面の中にある個別のキャンバス(ページ1、ページ2など)。
- Shape(シェイプ):ページ上に配置された四角や矢印、マシーンのアイコンなどの図形個々。
今回のミッション:`Document` オブジェクトを操る
今回のテーマである「自動バックアップ」は、「今開いている図面(Document)を、別の名前でコピー保存(SaveAs)する」という作業になります。
プログラミング初心者がやりがちなのが、「手動で名前を付けて保存を頑張るマクロ」ですが、プロのエンジニアは `Document` オブジェクトが持つ `SaveAs` メソッドをラップ(包み込んで拡張)し、裏側で安全に別名保存を走らせます。
—
2. 陥りやすい罠:なぜ「ただの保存」ではダメなのか?
「上書き保存のボタンを押したときに、勝手にバックアップも作ってくれたら最高なのに」と思いますよね。
ここでVisio VBA初学者がよくハマる罠があります。
- 罠1:ファイルパスの結合ミス(フォルダの区切り文字 `\` が抜けてエラーになる)
- 罠2:未保存の新規図面(名前がまだ無い状態)でのエラー(`SaveAs` が必要なのにパスがないため怒られる)
- 罠3:バックアップ先フォルダが存在しないエラー
これらをスマートに回避し、実務で耐えうる堅牢なコードを書くには、「現在の図面が一度でも保存されているか?」をチェックする条件分岐が不可欠です。
—
3. 実装コード:タイムスタンプ付き自動バックアップ・ラッパー
それでは、実際のVBAコードを見ていきましょう。
以下のコードを、VisioのVBAエディタ(`Alt + F11` で起動)の「標準モジュール」に貼り付けてください。
Option Explicit
‘ =====================================================================
‘ 外部公開用ラッパー:安全な自動バックアップ保存
‘ =====================================================================
Public Sub SaveWithAutoBackup()
Dim targetDoc As Document
Set targetDoc = ActiveDocument
‘ 1. まだ一度も保存されていない新規図面の場合は、通常の「名前を付けて保存」を促す
If targetDoc.Path = “” Then
MsgBox “この図面はまだ保存されていません。” & vbCrLf & _
“まずは通常の手順で一度保存を行ってください。”, vbExclamation, “保存エラー”
Exit Sub
End If
On Error GoTo ErrorHandler
‘ 2. バックアップファイルのパスを生成して保存を実行
Call ExecuteBackup(targetDoc)
‘ 3. 本体の図面を上書き保存
targetDoc.Save
MsgBox “図面の上書き保存と、バックアップの作成が完了しました!”, vbInformation, “保存成功”
Exit Sub
ErrorHandler:
MsgBox “保存処理中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
‘ =====================================================================
‘ 内部処理:タイムスタンプ付きバックアップの生成実体
‘ =====================================================================
Private Sub ExecuteBackup(ByVal doc As Document)
Dim originalPath As String
Dim originalName As String
Dim ext As String
Dim backupDir As String
Dim timeStamp As String
Dim userName As String
Dim backupPath As String
‘ パスとファイル名の分解
originalPath = doc.Path ‘ 例: “C:\VisioWork\”
originalName = doc.Name F ‘ 例: “NetworkLayout.vsdx”
‘ 拡張子を除いたファイル名を取得するための処理
Dim dotPos As Long
dotPos = InStrRev(originalName, “.”)
If dotPos > 0 Then
ext = Mid(originalName, dotPos) ‘ 例: “.vsdx”
originalName = Left(originalName, dotPos – 1) ‘ 例: “NetworkLayout”
End If
‘ バックアップ保存先フォルダのパスを決定(同階層に “Backup” フォルダを作る)
backupDir = originalPath & “Backup\”
‘ フォルダが存在しなければ自動で作る
If Dir(backupDir, vbDirectory) = “” Then
MkDir backupDir
End If
‘ タイムスタンプの生成 (例: 20231025_143022)
timeStamp = Format(Now, “yyyymmdd_hhnnss”)
‘ 実行しているユーザー名を取得 (環境に合わせて変更可能)
userName = Environ(“USERNAME”)
‘ バックアップファイルのフルパスを組み立て
‘ 命名規則: [ファイル名]_[日時]_[ユーザー名].vsdx
backupPath = backupDir & originalName & “_” & timeStamp & “_” & userName & ext
‘ Document.SaveAs を使って別名(バックアップ用)で保存
‘ ※注意: SaveAsCopyメソッドを使うと「開いている図面を切り替えずに」コピー保存できます
doc.SaveAsEx backupPath, visSaveAsNoOpen
End Sub
—
4. コードのここがポイント!先輩エンジニアからの解説
今回のコードで、Visio VBAのスキルアップに直結する重要なポイントを3つ解説します。
① `doc.Path` でファイルの現在地を特定する
Visio VBAでは、アクティブな図面が「今PCのどこに保存されているか」を `doc.Path` で取得できます。これが空文字(`””`)であれば、まだ名前をつけて保存されていない新規ファイルだと判定できます。この水際対策がマクロの暴走を防ぎます。
② `MkDir` による自動フォルダ生成
バックアップファイルをバラバラに散らばらせず、元の図面と同じ階層に `Backup` という専用フォルダを自動で作らせています (`If Dir(…) = “” Then MkDir …`)。ユーザーに「フォルダをあらかじめ作ってください」と言わなくていい、親切設計の基本です。
③ `SaveAsEx` と `visSaveAsNoOpen` のコンボ
今回、バックアップを作るために `doc.SaveAsEx` というメソッドを使用し、引数に `visSaveAsNoOpen` を渡しています。
通常、VBAで `SaveAs` を実行すると、操作対象が「新しく保存したファイル」に切り替わってしまいます。しかし、このオプションを指定することで、「裏側でコッソリ別名ファイルを保存しつつ、いま編集しているメインの図面はそのまま作業を続けられる」という極めてスマートな挙動を実現できます。プログラミングの「非侵襲性(作業を邪魔しない)」を体現するテクニックです。
—
5. さらに実用性を高めるためのネクストステップ
このマクロを導入したら、次はリボンの「上書き保存ボタン」をこのマクロに置き換えたり、クイックアクセスツールバーに登録したりしてみましょう。
「マクロの記録」から一歩踏み出し、オブジェクトのライフサイクルを理解してコードを組むことで、あなたの業務自動化スキルは確実にプロの領域へと近づきます。
「ここをもっとこうしたい」「こんなエラーが出るんだけど」といった疑問があれば、いつでも先輩エンジニアに聞いてくださいね。あなたのVisioライフが、より快適で安全なものになりますように!
