Visio VBAの深淵へ:Applicationレベルの「タイマー処理」で自動化の境地を目指す
こんにちは。Visioの世界へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺める段階を卒業しようとしているあなたへ。今日は、Visioを単なる作図ツールから「自律的に動く業務自動化エンジン」へと進化させるための、最も重要な鍵をお渡しします。
それが、Applicationレベルのタイマー制御(OnTimeメソッド)です。
なぜVisioでタイマー処理が必要なのか?
Visioを使っているとき、こんな悩みを抱いたことはありませんか?
- 「長時間作業しているのに、うっかり保存を忘れてVisioがクラッシュした…」
- 「外部のExcelデータと図形情報を常に最新の状態に同期させたい」
通常のVBAマクロは「ボタンを押して実行」する受動的なものです。しかし、今回解説するタイマー処理を実装すれば、Visioが一定時間ごとに「お仕事の時間ですよ」と自律的に動き出し、バックアップや同期をこなしてくれるようになります。
—
Visioオブジェクトモデルの「階層構造」を理解する
タイマーを仕込む前に、Visioの心臓部を整理しておきましょう。
Visio VBAは、以下の階層で構成されています。
1. Application: Visioそのもの(ここがタイマーの司令塔になります)
2. Document: 開いている図面ファイル
3. Page: ページ
4. Shape: 図形
今回は、すべての頂点に君臨する `Application` オブジェクト に対して、「○分後にこの処理を実行せよ」と命令を下す手法を使います。
—
魔法のメソッド:OnTimeの実装
Visio VBAには `Application.OnTime` というメソッドがあります。これは「指定した時刻になったら、特定のプロシージャを起動する」という予約機能です。
実装のステップ:バックグラウンド自動保存マクロ
以下のコードを、標準モジュール(Module1など)にコピーして実装してみてください。
‘ — 標準モジュールに記述 —
Option Explicit
‘ 次の実行予定時刻を保持する変数
Public ScheduledTime As Date
‘ タイマーを開始するためのプロシージャ
Public Sub StartAutoSave()
‘ 5分後に “PerformBackup” を実行するよう予約
ScheduledTime = Now + TimeValue(“00:05:00”)
Application.OnTime ScheduledTime, “PerformBackup”
Debug.Print “自動保存を予約しました: ” & ScheduledTime
End Sub
‘ 実際に実行されるバックアップ処理
Public Sub PerformBackup()
On Error Resume Next ‘ エラーで止まらないように安全策を
‘ 現在のドキュメントを別名で保存(バックアップ)
Dim backupPath As String
backupPath = ThisDocument.Path & “Backup_” & Format(Now, “hhmm”) & “.vsdx”
ThisDocument.SaveAsEx backupPath, visSaveAsWS
Debug.Print “バックアップ完了: ” & backupPath
‘ 次の5分後を再予約(ループ処理の要)
StartAutoSave
End Sub
‘ タイマーを停止するためのプロシージャ
Public Sub StopAutoSave()
On Error Resume Next
Application.OnTime ScheduledTime, “PerformBackup”, , False
Debug.Print “自動保存をキャンセルしました。”
End Sub
コードの重要ポイント解説
1. 再帰的な呼び出し: `PerformBackup` の最後で再び `StartAutoSave` を呼ぶことで、半永久的に定期実行を繰り返す「心臓の鼓動」を作っています。
2. `OnTime` の第四引数: `False` を指定することで、予約を取り消すことができます。これを忘れると、ファイルを閉じてもVisioが勝手に再起動してバックアップしようとする「ゾンビ現象」が起きるので注意してください。
3. エラーハンドリング: 自動実行中に図面が読み取り専用になっていたり、ファイルパスが不正だったりしてもVisio全体が落ちないよう、`On Error Resume Next` でガードしています。
—
初学者が陥りやすい「3つの罠」
このコードを実装する際、多くの人が以下の壁にぶつかります。ここをクリアすれば、あなたはもう中級者です。
1. 「プロジェクトが壊れていませんか?」問題
タイマー予約中にVBAのコードを書き換えると、Visioのメモリ管理が混乱し、タイマーが暴走することがあります。修正を行う際は、必ず `StopAutoSave` を実行して予約をクリアしてからにしましょう。
2. 「どこに書くか?」問題
このコードは「標準モジュール」に記述してください。`ThisDocument`(Documentオブジェクトのイベントモジュール)に書くと、プロシージャの参照スコープの関係で `OnTime` が失敗することがあります。
3. 「Visioが閉じられたら?」問題
上記のコードはVisioが起動している間だけ有効です。Visio終了時にもタイマーを確実に止めるには、`ThisDocument` モジュール内の `Document_BeforeDocumentClose` イベントで `StopAutoSave` を呼ぶのが、伝説のエンジニアの流儀です。
—
まとめ:自動化の先にあるもの
今回紹介した `OnTime` は、単なる自動保存のための道具ではありません。これは、Visioという静的なキャンバスに「時間軸」を与える技術です。
- 特定の図形の変更を監視し、リアルタイムで外部DBへプッシュする。
- 営業開始時刻に合わせて、自動的に最新の構成図を書き出す。
Visio VBAの基礎をマスターした今、あなたは図形を描く人から、図形に命を吹き込む「自動化アーキテクト」へと一歩を踏み出しました。
まずはこのコードを動かし、コンソール(イミディエイトウィンドウ)に流れる「バックアップ完了」の文字を眺めてみてください。それが、エンジニアとしての確かな手応えになるはずです。
何か分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化ライフを応援しています!
