Visio VBAの「画面フリーズ」を撲滅せよ!極限の堅牢性を実現する例外処理パターン
こんにちは。自動化の深淵へようこそ。
普段、Visioでマクロを書いていると、一度は経験しませんか?
「あれ、マクロが止まったのに画面が真っ白(あるいは固まったまま)で操作を受け付けない……」
これ、実は`Application.ScreenUpdating = False`(画面描画の停止)を使っているときに最もよく起こる「初心者殺し」の罠なんです。描画を止めたままエラーで落ちると、Visioは「再開の合図」を永遠に待ち続けることになります。
今日は、プロの現場で「当たり前」として使われている、絶対に画面をフリーズさせない例外処理のテンプレートを伝授します。これさえ覚えれば、あなたのコードの格は一気に「素人」から「エンジニア」へと昇華されますよ。
—
なぜ画面がフリーズするのか?
Visio VBAの`ScreenUpdating`プロパティは、描画処理をスキップすることでコードを劇的に高速化させる魔法のスイッチです。しかし、この魔法には代償があります。
1. `ScreenUpdating = False` を実行する。
2. 処理中にコードがエラーで中断する。
3. `ScreenUpdating = True` に戻るコードが実行されない。
4. Visioが「描画停止モード」のまま幽閉される。
これを防ぐには、「どんなエラーが起きても、最後は必ず画面をONに戻す」という強い意志をコードに組み込む必要があります。
—
現場で通用する「堅牢な例外処理」パターン
VBAにはVB.NETのような`Try-Catch-Finally`構文は存在しません。しかし、`On Error GoTo`を使うことで、実質的に同じ「終了処理の強制実行」を実現できます。
以下のテンプレートを、あなたのコードの「標準装備」にしてください。
Public Sub RobustShapeOperation()
‘ 1. エラーハンドラの定義:エラーが発生したら「ErrorHandler」ラベルへ飛ぶ
On Error GoTo ErrorHandler
‘ 2. 画面更新の停止(高速化の要)
Application.ScreenUpdating = False
‘ — ここからメインの処理 —
Dim shp As Visio.Shape
Set shp = ActivePage.DrawRectangle(0, 0, 5, 5)
‘ わざとエラーを起こすような処理(例:存在しないプロパティへのアクセスなど)
‘ shp.Cells(“InvalidProperty”).Formula = “1”
Debug.Print “処理完了”
‘ — メイン処理ここまで —
CleanExit:
‘ 3. 正常終了でもエラー終了でも、必ずここを通る
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
‘ 4. エラー発生時のログ出力など
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
‘ 5. 後始末をして終了へ
Resume CleanExit
End Sub
—
コードの「魂」を読み解くポイント
このテンプレートには、エンジニアとしての知恵が詰まっています。
① `On Error GoTo ErrorHandler`
これがVBAにおける「守護神」です。エラーが発生した瞬間、コードの実行は即座に`ErrorHandler`ラベルへジャンプします。これにより、予期せぬ挙動を制御下におくことができます。
② `CleanExit` ラベルの役割
ここが一番重要です。`Exit Sub`の直前に配置することで、正常に処理が終わった場合も、エラーで中断した場合も、必ずここを通って画面更新をONに戻すという「二重のガード」を敷いています。
③ `Resume CleanExit`
エラーハンドラ内で処理が終わったら、`Resume`を使って正常終了用の出口(CleanExit)へと強制送還します。これで、どんな状況下でも確実に画面描画が再開されます。
—
まとめ:マクロの「品質」は後始末で決まる
マクロを書くとき、初心者は「どう動かすか(メイン処理)」に全神経を注ぎます。しかし、一流のエンジニアは「どうやって綺麗に終わらせるか(終了処理)」にこそ魂を込めます。
- 画面更新を止めるなら、必ずセットで解除コードを書く。
- エラー時は、例外処理で確実に後始末へ誘導する。
この2点を守るだけで、あなたのツールは「自分しか使えない不安定なマクロ」から「職場で信頼される堅牢なツール」へと生まれ変わります。
ここをクリアしたあなたは、もうVisio VBAの基礎を完全に掌握したと言っても過言ではありません。次は、`Page`オブジェクトや`Document`のイベントハンドラを使いこなし、よりダイナミックな自動化の世界へ足を踏み入れてみてくださいね。
困ったことがあれば、いつでも聞きに来てください。応援していますよ!
