Visio VBAを極める:描画処理を劇的に高速化する「DiagramServicesEnabled」の全貌
こんにちは。自動化の現場でVisioと格闘していると、「なぜか大量の図形を配置すると、マクロの動作が極端に重くなる」という壁にぶつかるはずです。
実はそれ、あなたのコードが悪いのではありません。Visioの「おせっかい機能」が裏で暴走しているからなのです。
今日は、Visio VBAをマスターするための第一歩として、この「おせっかい」をスマートに黙らせ、処理速度を限界まで引き上げる禁断のテクニックを伝授します。
—
1. なぜVisioは図形配置のたびに「重く」なるのか?
Visioには「自動接続(AutoConnect)」や「自動整列(AutoAlign)」といった強力な機能が備わっています。ユーザーがマウスで図形を動かすときには非常に便利ですが、VBAで数千個の図形をループ処理で配置する場合、この機能が仇となります。
VBAが図形を1つ置くたびに、Visioは「お、近くに図形があるな!線で繋ぐか?」「位置はここでいいかな?」と、都度計算を行っているのです。これがオーバーヘッドとなり、処理時間を指数関数的に増大させます。
この「おせっかいなエンジン」を司っているのが、`Document.DiagramServicesEnabled` プロパティです。
—
2. 魔法のスイッチ:DiagramServicesEnabled の完全制御
このプロパティは、Visioの「ダイアグラムサービス」をビットマスク形式で管理しています。これを「0」に設定することで、全ての自動演算を一時停止させることが可能です。
実装のテンプレート
まずは、以下のコードをコピペして、あなたのプロジェクトの「骨組み」に組み込んでください。
Sub SpeedUpDrawing()
Dim doc As Visio.Document
Dim originalServices As Long
Set doc = ActiveDocument
‘ 1. 現在の設定を退避しておく(終了時に戻すため)
originalServices = doc.DiagramServicesEnabled
‘ 2. 全てのダイアグラムサービスを無効化(0を指定)
doc.DiagramServicesEnabled = 0
‘ — ここに高速化したい大量の描画処理を書く —
On Error Resume Next ‘ 万が一のエラーで復旧処理が飛ばないように
Call MassiveShapeCreation(doc)
‘ 3. 処理が終わったら必ず元の状態に戻す
doc.DiagramServicesEnabled = originalServices
MsgBox “処理が完了しました!”
End Sub
Sub MassiveShapeCreation(doc As Visio.Document)
‘ ここに数千個の図形を配置するような重い処理を記述
‘ 驚くほど軽快に動作するはずです
End Sub
コードの解説
- `originalServices` への退避: 非常に重要です。処理が終わった後、元に戻さないとユーザーが手動で編集する際に「自動接続が効かない!」と混乱を招きます。
- `doc.DiagramServicesEnabled = 0`: これが魔法の行です。Visioの脳内に「今は俺が計算しているから、お前は余計なことをするな」と命令するようなものです。
—
3. 陥りやすいエラーと注意点
「VBAはコピペで動けばOK」という段階から脱却するため、以下のポイントだけは必ず覚えておいてください。
① 「処理中のエラー」による設定の放置
もし、`MassiveShapeCreation` の中でエラーが発生して処理が中断されると、`DiagramServicesEnabled` が「0」のまま固定されてしまいます。
現場のプロは、必ず `Err` オブジェクトを監視する「例外処理(Error Handling)」 を実装します。
On Error GoTo Cleanup
‘ 描画処理
Cleanup:
‘ エラーが起きても起きなくても、ここを通って設定を戻す
doc.DiagramServicesEnabled = originalServices
If Err.Number <> 0 Then MsgBox “エラー発生: ” & Err.Description
② マクロの記録には頼らない
マクロの記録機能は便利ですが、これらは画面描画を伴うため、今回のような「裏側での制御」は記録されません。プロを目指すなら、必ず `Application` -> `Document` -> `Page` -> `Shape` というオブジェクトの階層構造を意識してコードを書いてください。
—
4. 最後に:エンジニアとしての心得
Visio VBAを扱うということは、「図形というオブジェクトのライフサイクル」を管理するということです。
今回紹介した `DiagramServicesEnabled` は、その第一歩に過ぎません。他にも `Application.ScreenUpdating`(画面更新の停止)を組み合わせれば、描画速度はさらに向上します。
「動くコード」を書くのはスタートラインです。「速く、美しく、そして何より壊れないコード」を書くこと。それが世界最高峰の自動化エンジニアへの道です。
さあ、あなたのVisio環境で、この「魔法のスイッチ」を体感してみてください。これまでの待ち時間が嘘のように消え去るはずですよ。
質問があればいつでもどうぞ。次回のステップアップでお会いしましょう!
