【入門編】Visio VBAの描画パフォーマンスを極限まで高める:ScreenUpdatingとEventEnabledの制御術 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:描画パフォーマンスを極限まで高める「停止」と「無効化」の極意

こんにちは。現場でVisioを酷使し、数千個のシェイプを瞬時に操る自動化エンジニアです。

「マクロで図形を100個描こうとしたら、画面がカクカクして数分かかった…」
そんな経験はありませんか?

Visioは非常に強力なツールですが、デフォルトの状態では「シェイプが1つ増えるたびに画面を描き直し、イベントを監視し、計算を行う」という非常に律儀な挙動をします。これが大規模な描画処理における遅延の正体です。

今回は、この「律儀すぎるVisio」に少し休憩してもらい、処理速度を劇的に向上させるための「ScreenUpdating」と「EventEnabled」の制御術を伝授します。これを知れば、君のマクロは別次元の速さに到達します。

1. なぜVisioは遅くなるのか?

Visioの内部には、以下の3つの「負荷」が常に存在しています。

1. 描画更新(ScreenUpdating): シェイプが生成されるたびに、画面を再描画する処理。
2. イベント監視(EventEnabled): 「図形が動かされた」「値が変わった」という変化を常に監視し、連動するアドオンや機能を呼び出す準備をしている状態。
3. 計算・再計算: シェイプ同士の接続関係や数式の計算。

特に、数千個のオブジェクトをループで生成・編集する際、これらが毎回実行されるのは、例えるなら「料理を作るたびに店全体を掃除している」ようなもの。非効率極まりないのです。

2. 劇的改善:二大呪文を唱えよう

解決策はシンプルです。処理の開始時に「描画停止」と「イベント無効化」を行い、終了後に元に戻す。これだけです。

実践コード:高速化のテンプレート

以下の構造を、すべてのバッチ処理の基本として身につけてください。

Sub OptimizedProcess()
‘ 1. 現在のアプリケーションの状態を退避
Dim origScreenUpdating As Boolean
Dim origEventEnabled As Boolean

origScreenUpdating = Application.ScreenUpdating
origEventEnabled = Application.EventEnabled

‘ 2. 負荷のかかる処理をストップ(これが魔法の瞬間です)
Application.ScreenUpdating = False
Application.EventEnabled = False

On Error GoTo Cleanup ‘ エラー発生時に確実に元に戻すための保険

‘ — ここに大量の図形生成・編集処理を書く —
Dim i As Long
For i = 1 To 1000
ActivePage.DrawRectangle 0, 0, 1, 1
Next i
‘ ——————————————

Cleanup:
‘ 3. 必ず状態を元に戻す(忘れるとVisioが反応しなくなります!)
Application.ScreenUpdating = origScreenUpdating
Application.EventEnabled = origEventEnabled

If Err.Number <> 0 Then MsgBox “エラーが発生しました: ” & Err.Description
End Sub

3. コードの解説:ここがプロのこだわり

`ScreenUpdating = False`

これを設定すると、処理が完了するまで画面の更新が完全にストップします。視覚的なフィードバックは消えますが、CPUリソースは「図形の計算」のみに集中されるため、速度は文字通り桁違いになります。

`EventEnabled = False`

これが意外と盲点です。Visioにはシェイプの移動や変更をトリガーにするイベントが多数埋め込まれています。ループ処理中にこれらが動くと、無限ループや予期せぬエラーの温床になります。「大量処理時はイベントを遮断する」。これは自動化エンジニアの鉄則です。

`On Error GoTo` での「Cleanup」

最も重要なのは、「何があっても元の設定に戻すこと」です。もし途中でエラーが出て `EventEnabled = False` のままマクロが停止すると、Visioは「操作を受け付けないゾンビ状態」になります。`Cleanup` ラベルを用意し、どんな結末でも必ず設定を復元させる仕組みを組み込むのが、プロの作法です。

4. 初学者が陥りやすい罠

  • 「とりあえず最後に戻せばいいや」: ダメです。エラーが発生した時に元に戻らなければ、Visioを再起動する羽目になります。必ず `On Error` を使いましょう。
  • 「デバッグ中に画面が見えない」: その通りです。開発中はこれらをコメントアウトしてデバッグし、完成したコードに組み込むのが最も効率的です。
  • 「全部の処理をまとめて1つのループにする」: もし処理が重すぎるなら、適宜 `DoEvents` を挟むことも検討してください。ただし、`DoEvents` は処理を遅くするので「どうしても画面をフリーズさせたくない場合」のみに使用しましょう。

最後に:エンジニアとしてのマインドセット

Visio VBAを極めるということは、「Visioという巨人のリソースをどう管理するか」を知るということです。

今回学んだ「停止」と「復元」のテクニックは、どんなに複雑な自動化においても必ず登場する基礎体力の部分です。まずは既存のマクロにこのテンプレートを当てはめてみてください。実行速度が「数秒単位」から「瞬きする間」に変わる快感を、ぜひ体感してください。

ここをクリアすれば、君はもう「マクロの記録」に頼る初心者ではありません。Visioを意のままに操る、最初のステップを踏み出しましたね。

それでは、また次の現場でお会いしましょう。ハッピーコーディング!

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