【入門編】Applicationオブジェクトのグローバル設定:UIやアラートの表示状態をVBAで制御する作法 – Visio VBA解析バイブル

スポンサーリンク

こんにちは! 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マクロ開発スキルは一気に中級者・上級者の領域へステップアップします。ぜひ次の開発から取り入れて、その圧倒的なスピードの違いを体感してみてくださいね。それでは、また次回の知見でお会いしましょう!

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