【入門編】【上級者向け】大規模図面におけるページ操作の高速化:画面描画を停止して処理時間を短縮する最適化テクニック – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と喜んでいた時期を通り越し、いざ実務で「数百ページもある巨大な図面を一括生成・整理したい!」となったとき……あなたは何に直面しましたか?

そう、「画面がバチバチと激しく点滅し、終わらないプログレスバーを眺めながらコーヒーが冷めていく現象」ですね。

今回は、大規模図面を扱うプロのエンジニアなら絶対に知っておくべき、Visio VBAパフォーマンスチューニングの極意「画面描画の完全制御による爆速化テクニック」を伝授します。ここをクリアすれば、あなたのマクロは見違えるほどのスピードスターに生まれ変わりますよ。

—

なぜVisioのページ操作は遅くなるのか?

何十、何百というページをVBAで追加・削除・レイアウト変更するとき、デフォルトのままだとVisioは非常に「真面目」に仕事をしてしまいます。

1. 1ページ増やすごとにウィンドウを再描画する
2. 図形や接続関係の再計算を走らせる
3. UI(ユーザーインターフェース)の表示を更新する

これらの一連の処理が、VBAのコード1行実行されるたびに裏で行われています。人間には認識できないほどの速度とはいえ、100回、1000回と積み重なれば、数分単位の致命的なタイムロスになるのです。

ここで登場するのが、今回マスターする`Application.ScreenUpdating`(画面描画の抑止)です!

—

爆速化の鍵:ScreenUpdatingの作法

プログラミングの基本は「Visioに余計な仕事をさせないこと」。
処理の開始時に画面の更新をピタッと止め、すべての裏方作業が終わってから、一気に画面を最新の状態に描き直させます。

基本のコードパターン

まずは、実際のコードの流れを見てみましょう。

Sub FastPageGeneration()
Dim startTime As Double
startTime = Timer ‘ 処理時間計測用

‘ ==========================================
‘ 1. 最重要:画面描画とイベントの停止
‘ ==========================================
Application.ScreenUpdating = False
Application.ShowChanges = False ‘ ※必要に応じて図形の視覚的更新も切る

On Error GoTo ErrorHandler ‘ エラー時の復帰を担保するお呪い

‘ ==========================================
‘ 2. 大量のページ操作・重い処理を実行
‘ ==========================================
Dim i As Long
For i = 1 to 50
Dim vsoPage As Visio.Page
Set vsoPage = ActiveDocument.Pages.Add()
vsoPage.Name = “自動生成ページ_” & i
‘ ここに図形の配置などの処理が入る
Next i

‘ ==========================================
‘ 3. 正常終了時の処理:描画の再開
‘ ==========================================
Application.ScreenUpdating = True
Application.ShowChanges = True

MsgBox “処理が完了しました。経過時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub

ErrorHandler:
‘ ==========================================
‘ 4. 必須:エラー時の安全装置
‘ ==========================================
Application.ScreenUpdating = True
Application.ShowChanges = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

—

ここで絶対につまづいてはいけない!「陥りやすいエラーと罠」

先輩エンジニアとして、現場で後輩たちがやりがちな「やってはいけないミス」を共有しておきますね。ここが今回の最重要ポイントです。

罠その1:エラー時に画面が凍結したままになる

コードの途中で何らかのエラー(例えば「同名のページが既に存在します」など)が発生してVBAが中断したとき、`ScreenUpdating = False` のままコードが止まるとどうなるでしょうか?

……なんと、Visioの画面が真っ白、あるいは操作を受け付けないフリーズ状態(幽霊状態)になります。ユーザーはVisioをタスクマネージャーから強制終了するハメになります。

> 【対策】
> 必ず `On Error GoTo ErrorHandler` などのエラーハンドラを記述し、どんな例外が発生しようとも、出口(ExitまたはErrorHandler)では必ず `ScreenUpdating = True` に戻す鉄の掟を守ってください。

罠その2:Debug.Print や MsgBox をループ内に挟む

「今何ページ目を処理しているか確認したいから」といって、処理の最中に `Debug.Print` や `MsgBox` を挟んでいませんか?
画面描画を止めている意味が完全に失われ、OSとのコンテキストスイッチが発生して逆に動作が激重になります。進捗を出したい場合は、ステータスバーを使いましょう。

‘ ステータスバーへの軽量な進捗表示
Application.StatusBar = “処理中… ” & i & ” / 50 ページ”

—

さらにパフォーマンスを絞り込むプロの技

`ScreenUpdating = False` 以外にも、大規模図面を操る際には以下のプロパティを併用すると、さらに動作が軽快になります。

  • `Application.ShowChanges = False`

画面上の変更をVisioウィンドウに反映させないようにします。`ScreenUpdating` とセットで使うことで効果が倍増します。

  • `ActiveDocument.EventList.Enabled = False`

図形の追加や削除に伴うアドインやVisio内部のイベント発火を一時的に止めます。イベントドリブンな複雑な図面で真価を発揮します(※戻し忘れに注意!)。

—

まとめ:ここをクリアすれば、Visio VBAの基本はバッチリですよ!

大規模図面の自動化において、「いかにVisioのGUIエンジンを休ませるか」はエンジニアの腕の見せ所です。

1. 処理の最初に `ScreenUpdating = False` で描画を止める
2. エラーが起きても必ず `True` に戻す仕組み(エラーハンドラ)をセットにする
3. ループ内での無駄なUI操作(MsgBox等)を排除する

この3つを意識するだけで、あなたの作るマクロは「遅くてイライラするもの」から「一瞬で仕事を終わらせる優秀な相棒」へと生まれ変わります。

大規模データやページ数の多い図面を扱う現場に立ったとき、この知識が必ずあなたを救ってくれます。ぜひ、次の自動化タスクから取り入れてみてくださいね。応援しています!

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