こんにちは!Visio VBAの世界へようこそ。
「Visioのマクロを書いてみたけれど、動作がカクカクして遅い…」
「何百枚もの図面を自動処理したいのに、画面がチカチカ動いて途中でフリーズしてしまう…」
そんな悩みを抱えていませんか?
マクロの記録から一歩踏み出し、実務で本当に使える「プロのツール」を作るための試練が、この「描画速度の壁」と「ダイアログ割り込みの壁」です。
Visioは非常に多機能で美しいグラフィックを描画できる反面、プログラムから操作すると、標準状態では「1つの図形を動かすたびに、画面全体を一生懸命に再描画」しようとします。さらに、「保存しますか?」「リンクを更新しますか?」といったポップアップダイアログが、バックグラウンド処理の手を容赦なく止めてしまいます。
今回は、これらのボトルネックを完全にねじ伏せ、画面を一切汚さず、誰にも気づかれずに裏側(サイレント)で超高速に処理を完結させる「極限のバッチ処理テンプレート」を伝授します。
この記事の内容をマスターすれば、Visio VBAのオブジェクトモデルの制御は一通りマスターしたと言っても過言ではありません。「ここをクリアすれば、Visio VBAの基本はバッチリですよ」と自信を持って言える、本質的なテクニックを優しく、かつ深く解説していきますね。
—
1. なぜVisioは重い?オブジェクトモデルと「描画」の関係
コードを書く前に、まずは敵(Visioの仕組み)を知りましょう。
Visioのオブジェクト階層は、基本的には以下のようになっています。
[Application] (Visio全体を管理)
│
[Document] (開いているファイル)
│
[Page] (図面のシート)
│
[Shape] (四角や矢印などの図形)
私たちがVBAで「Shapeの幅を変える」「Shapeをコピーする」という命令を出すと、Visioは親である`Page`にそれを伝え、さらに親である`Application`が「画面を更新して、ユーザーに新しい状態を見せなきゃ!」と反応します。
この「画面を書き換える処理(描画エンジン)」は、PCのCPUやGPUにとって非常に重い処理です。1回や2回なら一瞬ですが、100個のシェイプを処理すれば100回、10枚の図面なら数千回の再描画が発生し、これが「マクロが遅い」「フリーズする」原因になります。
そこで私たちがやるべきことは、「Applicationに対して、処理が終わるまで画面を見るのも、再計算するのも、ユーザーに話しかける(ダイアログを出す)のも、すべて一時停止してもらう」ことです。
—
2. 完全サイレント&超高速化を実現する「5つの秘術」
Visio VBAには、処理を高速化し、完全にサイレント化するための特別なプロパティが用意されています。これらを組み合わせることで、処理速度は10倍〜数十倍に跳ね上がります。
① `Application.ShowChanges = False` (最強の描画抑制)
Visio VBAにおいて最も重要なプロパティです。これを `False` にすると、Visioは画面の描画更新を完全にストップします。どれだけ図形を動かしても、画面は静止したままになります。
② `Application.ScreenUpdating = False` (画面全体の更新停止)
Excel VBAでもおなじみの設定ですね。Visioのウィンドウ自体の描画更新を停止します。`ShowChanges` と併用することで、描画のブレを完全に防ぎます。
③ `Application.DeferRecalc = True` (シェイプシート再計算の遅延)
Visioの図形(Shape)の裏側には、位置や数式を管理する「シェイプシート(ShapeSheet)」というスプレッドシートが存在します。図形を1つ動かすたびに、すべての数式が再計算されるのを防ぐため、このプロパティを `True` にして「再計算は後でまとめてやってね」と指示します。
④ `Application.AlertResponse = 1` (ダイアログの自動応答)
処理中に「保存しますか?」やエラーなどのダイアログが出ると、バッチ処理がストップしてしまいます。これを防ぐために、ダイアログに対して「デフォルトの応答(OKやはい)」を自動で返すように設定します。
- ※処理が終わったら、必ずデフォルト値(`0`)に戻す必要があります。
⑤ `Invisible = True` (Visio自体を非表示で起動)
VBAを実行する際、Visioのウィンドウ自体を全く表示させずに、メモリの裏側(プロセス)だけで起動させる方法です。これが真の「サイレント処理」を実現します。
—
3. 【実践コード】完全サイレント・バッチ処理テンプレート
それでは、実際のコードを見てみましょう。
今回は、「指定したフォルダ内にあるすべてのVisioファイル(.vsdx)をバックグラウンドで開き、全ページに特定のスタンプ(テキスト)を自動挿入して保存・終了する」という、実務で即戦力になるバッチ処理プログラムを作成しました。
エラーが発生して途中で止まっても、「画面更新や警告表示の設定を必ず元の安全な状態に戻す」というプロレベルのエラーハンドリング(安全弁)を組み込んでいます。安心してコピペして使ってください。
Option Explicit
‘ =========================================================================
‘ 開発の現場でそのまま使える、完全サイレント超高速バッチ処理テンプレート
‘ =========================================================================
Public Sub SilentBatchProcess()
Dim targetFolder As String
Dim fileName As String
Dim targetDoc As Visio.Document
Dim targetPage As Visio.Page
Dim addedShape As Visio.Shape
‘ 元の設定を退避するための変数
Dim originalScreenUpdating As Boolean
Dim originalShowChanges As Boolean
Dim originalDeferRecalc As Boolean
Dim originalAlertResponse As Long
‘ 1. 処理対象のフォルダを指定 (末尾に \ をつけてください)
targetFolder = “C:\VisioWork\” ‘ ★環境に合わせて変更してください
‘ フォルダの存在簡易チェック
If Dir(targetFolder, vbDirectory) = “” Then
MsgBox “指定されたフォルダが見つかりません: ” & targetFolder, vbCritical, “エラー”
Exit Sub
End If
‘ 2. エラーハンドリングの構築 (途中で落ちても必ず設定を元に戻すための安全弁)
On Error GoTo ErrorHandler
‘ 3. 現在のVisioの設定を退避し、超高速・サイレントモードへ移行
With Visio.Application
originalScreenUpdating = .ScreenUpdating
originalShowChanges = .ShowChanges
originalDeferRecalc = .DeferRecalc
originalAlertResponse = .AlertResponse
‘ 極限チューニングの適用
.ScreenUpdating = False ‘ 画面更新を停止
.ShowChanges = False ‘ 描画更新を徹底抑制
.DeferRecalc = True ‘ シェイプシートの再計算を遅延
.AlertResponse = 1 ‘ 警告/ダイアログには自動でOK(Yes)を返す
End With
‘ 4. フォルダ内のVisioファイルを順次処理
fileName = Dir(targetFolder & “.vsdx”)
Do While fileName <> “”
‘ サイレントにドキュメントを開く (第3引数に「読み取り専用」や「非表示」のフラグを指定可能)
‘ ここでは、余計なマクロ実行を防ぐために、安全に開きます
Set targetDoc = Visio.Documents.Open(targetFolder & fileName)
‘ — [ここから個別ファイルの処理ロジック] —
‘ 例:すべてのページの左上に「社外秘」のスタンプ(テキスト)を高速挿入する
For Each targetPage In targetDoc.Pages
‘ 描画を伴う処理ですが、ShowChanges = False なので一瞬で終わります
Set addedShape = targetPage.DrawRectangle(0.5, 10.5, 3.5, 11.2)
With addedShape
.Text = “【社外秘】 ” & Format(Date, “YYYY/MM/DD”)
.Cells(“Char.Size”).FormulaU = “12pt”
.Cells(“Char.Color”).FormulaU = “THEME(“”AccentColor””)”
‘ 枠線を消して透明にする
.Cells(“LinePattern”).ResultIU = 0
.Cells(“FillPattern”).ResultIU = 0
End With
Next targetPage
‘ — [ここまで個別ファイルの処理ロジック] —
‘ 保存して閉じる (AlertResponseが効いているため、競合などのダイアログは無視されます)
targetDoc.Save
targetDoc.Close
Set targetDoc = Nothing
‘ 次のファイルへ
fileName = Dir()
Loop
‘ 5. 終了処理:設定を元の状態に美しく戻す (これを怠るとExcelやVisioの動作がおかしくなります)
GoTo CleanExit
‘ — 安全な終了処理の部屋 —
CleanExit:
‘ 処理を元に戻す前に、遅延させていたシェイプシートの計算を強制的に一括実行
Visio.Application.DeferRecalc = False
‘ アプリケーションの設定を元の状態に復元
Visio.Application.ScreenUpdating = originalScreenUpdating
Visio.Application.ShowChanges = originalShowChanges
Visio.Application.AlertResponse = originalAlertResponse
MsgBox “すべてのファイルの処理が完了しました!”, vbInformation, “完了”
Exit Sub
‘ — エラー発生時の退避部屋 —
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー発生”
‘ エラーが起きても、設定だけは絶対に元に戻してユーザーのPCを守る
Resume CleanExit
End Sub
—
4. 陥りやすい「3つの罠」とプロの回避策
この超高速化テンプレートは強力ですが、強力ゆえに「お作法」を守らないと、Visioが言うことを聞いてくれなくなる罠があります。先輩として、あらかじめ回避策を教えておきますね。
罠①:`DeferRecalc = True` のまま保存して閉じてしまった!
- 現象:次に手動でその図面を開いたとき、配置した図形のサイズやテキストが崩れて見えたり、位置がおかしくなったりします。
- 原因:シェイプシートの再計算を「遅延(ストップ)」させたままファイルを保存してしまったため、最新の計算結果がファイルに書き込まれていません。
- 対策:ファイルを保存・閉じる前に、必ず `Application.DeferRecalc = False` を実行して、計算を確定させてください。上記のテンプレートでは、`CleanExit` 内で確実に実行するように設計されています。
罠②:処理が途中でエラーになり、Visioの画面が真っ白(またはフリーズ)になった!
- 現象:マクロのテスト中にコードが途中で止まると、画面が固まって操作できなくなります。
- 原因:`ShowChanges = False` や `ScreenUpdating = False` のままマクロが中断されたため、Visioが画面を書き換える権利を失った状態になっています。
- 対策:開発中は、必ず `On Error GoTo ErrorHandler` を有効にしてください。もし途中で止まってしまった場合は、VBAのイミディエイトウィンドウ(`Ctrl + G`)で以下の一行を実行すれば、一瞬で元に戻ります。
Visio.Application.ScreenUpdating = True: Visio.Application.ShowChanges = True
罠③:タスクマネージャーに `VISIO.EXE` が大量に残る…
- 現象:VBAを何度も実行していると、PCの動作がだんだん重くなり、タスクマネージャーを見るとVisioのプロセスがゴーストのように残っている。
- 原因:開いた `Document` オブジェクトなどを `Set targetDoc = Nothing` で明示的にメモリから解放していないか、エラーで閉じる処理がスキップされたためです。
- 対策:使ったオブジェクト変数は、必ず処理の最後(またはエラーハンドラーの中)で `Nothing` を代入して解放しましょう。
—
5. まとめ:ステップアップしたあなたへ
お疲れ様でした!
今回ご紹介したテクニックは、Visio VBAの基礎でありながら、「実務でシステム連携やサーバーサイドでの一括自動処理を行うための極意」そのものです。
「画面を動かして人間を喜ばせるマクロ」から、「画面を消して、静かに、超高速に仕事を終わらせるプロのプログラム」へ。ここをクリアできれば、もうVisio VBAの基本はバッチリです。何百枚の図面修正も、これからはボタン一つ、数十秒でスマートに片付きます。
ぜひ、日々の業務自動化に役立ててくださいね。あなたの開発が、より楽しく、スマートなものになることを応援しています!
