こんにちは!Visioの図面自動化の世界へようこそ。
マクロの記録ボタンを押して「なんとなく動くコードはできたけれど、何百枚もの図面を一括処理させたら画面がチラつきまくって途中でフリーズした……」そんな壁にぶつかっていませんか?
もしあなたが今、大量のVisio図面を相手に悪戦苦闘しているなら、ここがターニングポイントです。
今回は、Visio VBAの真骨頂である「完全サイレントな超高速バッチ処理」の極意を伝授します。ここをクリアすれば、Visio VBAの基本と「プロの裏技」はバッチリですよ!
—
なぜVisioのバッチ処理は遅いのか?(オブジェクトモデルの本質)
私たちが普段何気なく操作しているVisioの画面。実は、裏側ではシェイプを1つ動かすたびに「画面の再描画」「UIの更新」「ウィンドウイベントの監視」など、目に見えない莫大な処理が走っています。
VBAで何百個ものシェイプを操作するとき、Visioは「ねえ、今こんな変更があったよ!画面を塗り直そうか?」と、一回一回律儀にユーザーインターフェース(UI)へ報告しているのです。これが、バッチ処理をカメのように遅くしている元凶です。
プロの自動化エンジニアは、この「おせっかいな報告機能」を完全にシャットアウトします。使うのは以下の3つの魔法のキーワードです。
1. `Application.ScreenUpdating = False` (画面描画の停止)
2. `Application.ShowChanges = False` (変更通知・内部イベントの遮断)
3. `Visio.InvisibleApp` または `Page.Slide` などの軽量化アプローチ
これらを組み合わせることで、Visioを完全に「無口な高速エンジン」へと変貌させることができます。
—
基礎知識:Visioオブジェクトモデルの階層構造を理解しよう
コードを書く前に、Visioの世界がどういうピラミッド構造になっているかを押さえておきましょう。迷子にならないための地図です。
- `Application` (Visioアプリ全体:一番偉い親分)
- └ `Document` (図面ファイル・ステンシル)
- └ `Page` (図面のページ。マルチページなら複数存在)
- └ `Shape` (ページ上の図形。グループ化されていると階層を持つ)
バッチ処理の基本は、「一番上の親分(Application)に目隠しと耳栓をさせ、その隙に下の子分たち(DocumentやShape)を猛スピードで働かせる」ことです。
—
実践!超高速・完全サイレントバッチ処理のテンプレートコード
それでは、実際に何百枚もの図面(または1つの巨大図面内の全ページ)を爆速で処理するプロ仕様のコードを見てみましょう。
開発環境のVBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けてみてください。
Option Explicit
Sub ExecuteBlazingFastBatch()
‘ 変数の宣言
Dim appVisio As Visio.Application
Dim docTarget As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim startTime As Double
startTime = Timer ‘ 実行時間計測用
‘ 親アプリケーションの取得
Set appVisio = Application
‘ ==========================================
‘ 【極限高速化フェーズ】UIとイベントの完全遮断
‘ ==========================================
On Error GoTo ErrorHandler ‘ エラー時に確実に元に戻すためのトラップ
With appVisio
.ScreenUpdating = False ‘ 1. 画面の描画を完全にストップ
.ShowChanges = False ‘ 2. 変更通知やUIの再描画をブロック
.Interactive = False ‘ 3. ユーザーからのマウス・キーボード操作を受け付けない
.AlertAndPromptBehavior = visProhibitUI ‘ 4. ダイアログの表示を禁止し、デフォルト値で強制突破
End With
‘ 対象図面の開く(例としてアクティブドキュメントを使用)
Set docTarget = appVisio.ActiveDocument
‘ ==========================================
‘ 【実務処理フェーズ】ここでは例として全ページのシェイプの色を変える
‘ ==========================================
Dim pageCount As Long
pageCount = docTarget.Pages.Count
Dim pIdx As Long, sIdx As Long
For pIdx = 1 to pageCount
Set pg = docTarget.Pages(pIdx)
‘ ページ内の全シェイプを高速走査
For sIdx = pg.Shapes.Count To 1 Step -1
Set shp = pg.Shapes(sIdx)
‘ — ここに実際の重い処理を記述 —
‘ 例: シェイプの塗りつぶし色を赤に変更する
‘ shp.CellsU(“FillForegnd”).ResultIU = RGB(255, 0, 0)
Next sIdx
Next pIdx
‘ 変更を保存して閉じる場合
‘ docTarget.Save
‘ ==========================================
جہ 【復元フェーズ】必ず設定を元に戻す!
‘ ==========================================
Call RestoreEnvironment(appVisio)
MsgBox “処理が完了しました! 処理時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub
ErrorHandler:
‘ エラーが発生しても、必ずVisioのUIロックを解除する(これ重要!)
Call RestoreEnvironment(appVisio)
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ — 環境復元用のヘルパープロシージャ —
Private Sub RestoreEnvironment(ByRef targetApp As Visio.Application)
With targetApp
.ScreenUpdating = True
.ShowChanges = True
.Interactive = True
.AlertAndPromptBehavior = visAlertsDefault
End With
End Sub
—
コードの解説:ここがプロの技!
1. `ShowChanges = False` の圧倒的な効果
`ScreenUpdating = False` だけでは、Visioのウィンドウ内部で「データが変わったぞ」というイベント通知が走り続けます。`ShowChanges = False` を組み合わせることで、Visioの心臓部(コアエンジン)に「余計なことは考えず、ひたすらメモリ上のデータを書き換えろ」と命令できます。
2. エラーハンドリング(`On Error GoTo`)の絶対厳守
ここが今回の記事で一番伝えたいポイントです。
もし `ScreenUpdating = False` や `Interactive = False` にした状態でコードがエラーを起こして止まってしまったらどうなるでしょう?
Visioの画面がフリーズしたまま操作を受け付けなくなり、タスクマネージャーから強制終了するハメになります。
プロのエンジニアは、必ずエラー発生時(あるいは処理の最後)に環境を元通りにする安全装置(`RestoreEnvironment`)をセットで実装します。
3. ループの向き:`For sIdx = pg.Shapes.Count To 1 Step -1`
シェイプを削除したり、特定の操作を行ったりする際、上から順(1からCountまで)に回すと、インデックスがズレてバグの温床になります。後ろから数えていく(逆順ループ)は、Visio VBAにおける鉄則テクニックです。
—
陥りやすい罠と注意点
- 「あれ、画面が真っ白になったまま固まった?」
処理中に `MsgBox` などを挟むと、`Interactive = False` や `ScreenUpdating = False` の状態とバッティングしてVisioがフリーズしたように見えます。バッチ処理中はデバッグ用の `MsgBox` や `Debug.Print` を極力排除し、一気に走り抜けましょう。
- 画面が見えない不安
処理が速すぎて本当に動いているか不安になるかもしれませんが、タスクマネージャーのCPU使用率を見てください。Visioが全力で働いているはずです。
—
まとめ:自動化の舞台裏を支配しよう
今回は、Visio VBAにおける完全サイレントな超高速バッチ処理の構築方法を解説しました。
- `ScreenUpdating` と `ShowChanges` でVisioの描画と通知を完全にブロックする
- エラー時でも必ず設定を復元する安全設計を怠らない
- 巨大なオブジェクトツリーを逆順ループなどで効率よく駆け抜ける
この基本アプローチをマスターすれば、何百枚もの図面修正もコーヒーを一杯飲んでいる間に終わるようになります。あなたのVisioライフが、劇的に快適なものになることを応援しています!
