【入門編】【初心者向け】Visioの「自動保存」と「回復用ファイル」をVBAで制御し、作業中のデータ消失を防ぐ – Visio VBA解析バイブル

スポンサーリンク

こんにちは、未来の自動化アーキテクトの皆さん。

Visio VBAの世界へようこそ。私はこれまで数え切れないほどの巨大なシステム図面やインフラ構成図を、プログラムの力で自動生成・管理してきました。

皆さんは、数時間かけて作り込んだ緻密な図面が、予期せぬフリーズやPCの再起動で露と消えた……という絶望を味わったことはありませんか?
「マクロを書く」ということは、単に作業を速くするだけではありません。「大切なデータを守る仕組みを、自らの手で組み込む」ということでもあるのです。

今回は、Visio VBAの第一歩として、図面ファイルの「新規作成・保存・PDF出力」という基本操作をマスターしつつ、万が一の事態からデータを守る「自作オートセーブ機能」の実装方法を伝授します。

ここをクリアすれば、あなたのVisio操作は「作業」から「運用」へと進化します。さあ、一緒に扉を開けましょう。

—

1. Visioの「心臓部」にアクセスする:ApplicationとDocument

Visio VBAを操作する上で、まず理解すべきは「Application(アプリケーション)」と「Document(ドキュメント)」の関係です。

  • Application: Visioというソフトそのもの。設定(オプション)などを司ります。
  • Document: 開いている1つひとつのファイル。保存や書き出しはここで行います。

初心者がまず覚えるべきは、Visio自体が持っている「自動回復(AutoRecovery)」の設定をVBAからコントロールする方法です。

自動回復の間隔をVBAで制御する

Visioのオプション画面を開かなくても、以下の1行で「何分おきに回復用情報を保存するか」を指定できます。

‘ 自動回復の間隔を5分に設定する
Application.AutoRecoverInterval = 5

※「0」を設定すると自動回復が無効になります。命綱を外すようなものですから、基本は5〜10分程度に設定しておくのがプロの作法です。

—

2. 実践:データを守り抜く「鉄壁の保存マクロ」

標準の自動回復機能は便利ですが、「ファイルが壊れた」場合には無力なこともあります。
そこで、「マクロを実行するたびに、現在の日時を付けてバックアップを保存する」という、より確実な手法を学びましょう。

以下のコードは、単なる保存ではなく「作業中のミス」もカバーできるプロ仕様の基本構成です。

【コード例】バックアップ作成・PDF出力・保存を一度に行う

Sub SecureSaveProcess()
Dim vsoDoc As Visio.Document
Dim filePath As String
Dim backupPath As String
Dim pdfPath As String
Dim timeStamp As String

‘ 1. 操作対象を「現在アクティブな図面」に設定
Set vsoDoc = ActiveDocument

‘ ファイルが一度も保存されていない(新規作成状態)場合は処理を中断
If vsoDoc.Path = “” Then
MsgBox “まずは一度、名前を付けて保存してください。”, vbExclamation
Exit Sub
End If

‘ 2. 準備:タイムスタンプとファイルパスの生成
‘ Format関数で「20231027_1530」のような文字列を作る
timeStamp = Format(Now, “yyyymmdd_hhnnss”)

‘ 元のファイルパスから拡張子を除いた部分を取得し、新しいパスを作る
filePath = vsoDoc.FullName
backupPath = Left(filePath, InStrRev(filePath, “.”) – 1) & “_backup_” & timeStamp & “.vsdx”
pdfPath = Left(filePath, InStrRev(filePath, “.”) – 1) & “_” & timeStamp & “.pdf”

On Error GoTo ErrorHandler ‘ エラーが起きた時の逃げ道を用意

‘ 3. 【実行】現在の状態を上書き保存
vsoDoc.Save
Debug.Print “通常保存完了: ” & vsoDoc.Name

‘ 4. 【実行】バックアップとして別名保存(Copyを作成)
‘ SaveAsCopyを使うと、現在の作業を邪魔せずに「分身」を保存できます
vsoDoc.SaveAsCopy backupPath
Debug.Print “バックアップ作成完了: ” & backupPath

‘ 5. 【実行】PDFとして書き出し(証跡を残す)
‘ 出力設定を細かく指定できるのがVBAの強みです
vsoDoc.ExportAsFixedFormat visFixedFormatPDF, pdfPath, visDocExIntentPrint, visDocExScopeAllPages
Debug.Print “PDF出力完了: ” & pdfPath

MsgBox “保存・バックアップ・PDF出力がすべて完了しました!”, vbInformation, “守護完了”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

このコードの「ここ」が重要!

1. `SaveAsCopy` の利用:
普通の `SaveAs`(名前を付けて保存)を使うと、作業中のファイル自体が新しい名前に切り替わってしまいます。`SaveAsCopy` を使えば、「作業中のファイルはそのまま、裏でこっそりバックアップを作る」ことができます。
2. `InStrRev` によるパス操作:
ファイル名から拡張子を切り離すテクニックです。これを覚えると、ファイル操作の自由度が格段に上がります。
3. PDF出力の同梱:
VisioファイルはVisioがないと見られませんが、PDFならスマホでも確認できます。クラッシュしてファイルが壊れたとしても、PDFさえあれば「何を描いていたか」は分かります。これが「二重の安全策」です。

—

3. 陥りやすい罠:Savedプロパティの挙動

Visio VBAを扱う上で、多くの初心者が「なぜか保存したのに『保存しますか?』と聞かれる」という現象に悩みます。

VisioのDocumentオブジェクトには `Saved` というプロパティがあります。

  • `vsoDoc.Saved = True` : 「このファイルは変更されていません」とVisioに言い聞かせる。
  • `vsoDoc.Saved = False` : 「変更があります」という状態。

マクロで何か操作(シェイプの色を変える、移動するなど)をすると、自動的に `Saved` は `False` になります。
もし、保存処理の後に「余計なプロパティ操作」をしてしまうと、Visioは「あ、また変更されたな」と判断して、閉じる時に保存ダイアログを出してしまいます。

プロの助言:
保存マクロの最後には、何も操作を加えないこと。もし閉じることが目的なら、`vsoDoc.Close` の直前に保存状態を確認するようにしましょう。

—

4. ステップアップ:自動実行の仕掛け

「マクロを自分で押すのを忘れたら意味がないじゃないか」

その通りです。真のエンジニアは「忘れること」を前提にシステムを組みます。
Visioには「イベント」という仕組みがあります。

例えば、「図面を印刷しようとした時に、自動でバックアップを取る」といった制御が可能です。これは `ThisDocument` というモジュールに記述します。

‘ ThisDocumentモジュールに記述
Private Sub Document_BeforePrint(ByVal doc As IVDocument)
‘ 印刷前に保存を実行する自作マクロを呼び出す
Call SecureSaveProcess
End Sub

このように、ユーザーの自然な動作にバックアップ処理を「潜り込ませる」のが、洗練された自動化への第一歩です。

—

最後に:道具に使われず、道具を支配する

お疲れ様でした。今回はVisioのファイル制御の基本と、実戦的なバックアップ手法について解説しました。

VBAは魔法の杖ではありません。しかし、今回のように「エラーハンドリング(On Error)」を入れ、「バックアップ(SaveAsCopy)」を作成し、「汎用形式(PDF)」で書き出すといった丁寧な設計を心がけることで、それは最強の盾となります。

「ここをクリアすれば、Visio VBAの基本はバッチリですよ」。
次からは、いよいよ図面の中身——シェイプ(図形)を自由自在に操る冒険に出かけましょう。

あなたの設計図が、永遠に失われないことを願って。

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