こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押してコードを作ってみたものの、「実際に再生してみたら、画面がパカパカ点滅して遅いなぁ…」「処理の途中で『本当に削除しますか?』なんてダイアログが出て止まってしまう…」そんな壁にぶ,つかっていませんか?
今回は、Visio VBAの基礎でありながら、プロのエンジニアも必ず実装する「Applicationオブジェクトによる環境制御(画面描画と警告のコントロール)」について、優しく、そして本質的なところまでしっかり解説していきますね。
ここをクリアすれば、あなたの書くマクロは見違えるほど高速になり、完全な「自動運転」を実現できるようになりますよ。さあ、一緒にマスターしていきましょう!
—
1. なぜ「画面描画」と「警告」の制御が必要なのか?
Visioを起動すると、画面いっぱいに図面(ページ)が広がり、マウスを動かすとシェイプが選択できますよね。人間が操作する分には親切なこの「画面の表示更新」や「確認メッセージ」ですが、VBAに何千個ものシェイプをゴリゴリ処理させるときには、これが最大の足かせになります。
画面の点滅(カクカク・パカパカ)の正体
VBAで100個のシェイプを移動させるコードを書いたとします。通常の状態だと、Visioは「1個動かした! 画面を再描画するね!」「2個目動かした! また画面を再描画するね!」と、1回1回ご丁寧に見えている画面を塗り直します。
これが、処理が遅くなる原因であり、あの目に悪い画面の点滅の正体です。
突然現れる「ダイアログの呪縛」
バッチ処理の最中に「このファイルを上書きしますか?」「このレイヤーを削除しますか?」なんてポップアップが出たらどうなるでしょうか? そう、人間が「はい」を押すまで、プログラムは無限にフリーズしたかのように立ち止まってしまいます。 完全自動化を目指す私たちにとって、これは絶対に避けなければならない事態です。
ここで登場するのが、Visioの頭脳である `Application` オブジェクト です。
—
2. 魔法のプロパティ:`ScreenUpdating` と `AlertsEnabled`
Visioの `Application` オブジェクトには、Visio全体の挙動をコントロールする強力なスイッチが用意されています。
1. `ScreenUpdating`(画面描画の制御)
- `False` にすると、画面の再描画がピタッと止まります。裏側では猛烈なスピードで処理が進み、描き終わった瞬間に `True` に戻せば、一瞬で完成形が画面に現れます。
2. `AlertsEnabled`(警告・確認ダイアログの制御)
- `False` にすると、Visioからの確認ダイアログがすべて沈黙し、デフォルトの「安全な選択肢(通常は “はい” や “OK”)」が自動で選ばれるようになります。
—
3. 実践!安全で爆速なVBAコードの書き方
それでは、実際の現場でそのまま使える、極上のテンプレートコードを見てみましょう。
このコードは、大量のシェイプを一括して整列・変更するシーンを想定しています。「エラーが起きても確実に画面や警告を元の状態に戻す(クリーンアップする)」という、プロのエンジニアが絶対守る鉄則が組み込まれています。
Sub OptimizeVisioBatchProcess()
‘ 変数の宣言
Dim targetPage As Visio.Page
Dim shp As Visio.Shape
Dim startTime As Double
startTime = Timer ‘ 実行時間計測用
‘ —————————————————-
‘ 1. 環境設定の退避 & 爆速モードへの切り替え
‘ —————————————————-
Dim originalScreenUpdating As Boolean
Dim originalAlerts As Boolean
‘ 現在の状態をメモしておく(元の設定に戻すため)
originalScreenUpdating = Application.ScreenUpdating
originalAlerts = Application.AlertsEnabled
On Error GoTo ErrorHandler ‘ エラー時に設定戻しをスキップさせないためのトラップ
‘ 【核心】画面描画を止め、警告を黙らせる!
Application.ScreenUpdating = False
Application.AlertsEnabled = False
‘ —————————————————-
‘ 2. メインの処理(例:アクティブページの全シェイプを処理)
‘ —————————————————-
Set targetPage = ActivePage
For Each shp in targetPage.Shapes
‘ 例として、すべてのシェイプの幅を少し広げる重たい処理を想定
‘ 画面が描画されないため、このループが猛烈なスピードで駆け抜けます
shp.Cells(“Width”).ResultIU = shp.Cells(“Width”).ResultIU 1.1
Next shp
‘ 処理完了のメッセージ(AlertsEnabledがFalseの間は表示されずログに流れます)
Debug.Print “処理が正常に完了しました。”
‘ —————————————————-
‘ 3. 通常モードへの復元(正常終了時)
‘ —————————————————-
Application.ScreenUpdating = originalScreenUpdating
Application.AlertsEnabled = originalAlerts
MsgBox “処理が完了しました! 実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub
ErrorHandler:
‘ —————————————————-
‘ 4. 異常終了時の復元(ここが超重要!)
‘ —————————————————-
‘ 万が一コード内でエラーが起きた場合でも、必ず設定を元に戻します。
‘ これをサボると、Visioの画面がフリーズしたままになり、再起動するハメになります。
Application.ScreenUpdating = originalScreenUpdating
Application.AlertsEnabled = originalAlerts
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
4. 陥りやすい罠とエンジニアからの警告
ここで、先輩エンジニアから絶対に覚えておいてほしい「命綱のルール」を伝授します。
罠:エラー処理をサボって画面が真っ暗(フリーズ状態)になる
もしあなたが `Application.ScreenUpdating = False` と書いたコードを実行し、その途中でエラー(ゼロ除算やオブジェクトが存在しないエラーなど)が発生してコードが途中で止まったとします。
このとき `On Error GoTo` による復元処理を入れていないと、Visioは「画面を描画しないモード」のまま固まってしまいます。
画面上は何も変わらないのに、裏では動いている……ユーザーからすると「Visioが壊れた!」とパニックになる最悪の状況です。
> 黄金のルール
> `ScreenUpdating = False` を書いたら、必ずセットで `On Error GoTo` による復元ルートを用意すること。これがプロの作法です。
—
まとめ
いかがでしたでしょうか? 今回学んだ `Application` オブジェクトの制御は、Visio VBAで複雑な図面を扱う上での「基本にして極意」です。
- 画面描画(`ScreenUpdating`)を止めて、爆速かつスムーズな処理を手に入れる。
- 警告(`AlertsEnabled`)を制御して、人の手を介さない完全自動化を実現する。
- エラー時も必ず元の状態に戻す(`On Error`の活用)ことで、安全性を担保する。
ここをクリアできれば、あなたのVisioマクロ開発スキルは一気に中級者・上級者の領域へステップアップします。ぜひ次の開発から取り入れて、その圧倒的なスピードの違いを体感してみてくださいね。それでは、また次回の知見でお会いしましょう!
