【入門編】非表示作業用ページ(Hidden Page)の動的作成と活用:ユーザーに見せずに一時的な計算・図形加工を行うVBAサンドボックス手法 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めては「なんだかよく分からないけれど動くぞ……」と感動していた時期は、もう卒業しましょう。

今回は、プロのVisio VBAエンジニアがこっそり使っている、極めて実用的かつ洗練されたテクニック「非表示作業用ページ(サンドボックス手法)」を伝授します。

「画面がパカパカ切り替わる」「図形が生成される様子がユーザーに見えて格好悪い」「複雑な計算やグループ化の途中で画面がちらつく」——そんなVisio VBA特有のストレスを、この1テクニックで完全に駆逐できます。ここをクリアすれば、あなたのVisioマクロは「初心者レベル」から「プロのシステム」へと一気に飛躍しますよ。

なぜ「非表示作業用ページ」が必要なのか?

Visioで複雑な図形を描画したり、複数の図形を結合・グループ化したり、あるいは外部データを元に大量の図形をレイアウト計算したりする時、それをユーザーが見ている本番ページの上で直接やるのは素人芸です。

なぜなら、VBAが図形を1つ生成するたびにVisioは画面を再描画(ScreenUpdating)しようとし、これが激しいパフォーマンスの低下と画面のちらつき(カクつき)を引き起こすからです。

プロの解決策:サンドボックス(砂場)の構築

プログラミングの世界には、安全に実験や計算を行う「サンドボックス(砂場)」という概念があります。これと同じことをVisio上でやります。

1. こっそり作業用ページを作る(ユーザーには絶対に見せない)
2. そのページの上で、図形の生成・幾何計算・複雑な加工を高速で行う(画面のちらつきゼロ)
3. 完成した図形だけを、本来の「本番ページ」へ一瞬で転送する
4. 使い終わった作業用ページは、跡形もなく削除する

この一連の流れをマスターすれば、どれほど複雑な図面生成も、裏側で一瞬にして完了するようになります。それでは、具体的なコードの世界へ飛び込みましょう!

実践!非表示作業用ページを使ったVBAコード

以下のコードは、アクティブな図面の中に一時的な「サンドボックス(作業用ページ)」を裏側で作成し、そこで図形を作って本番ページへスマートに納品、最後に作業用ページを綺麗に片付ける完全なプロシージャです。

VBAの標準モジュールにコピペして、そのまま実行してみてください。

Sub CreateShapeInSandbox()
Dim vsoApp As Visio.Application
Set vsoApp = ActiveApplication

‘ 画面描画と警告を停止してパフォーマンスを極限まで高める(プロの必須作法)
vsoApp.ScreenUpdating = False
vsoApp.AlertsEnabled = False

Dim vsoDoc As Visio.Document
Set vsoDoc = vsoApp.ActiveDocument

Dim vsoTargetPage As Visio.Page
Set vsoTargetPage = vsoApp.ActivePage ‘ ここがユーザーに見せる「本番ページ」

Dim vsoWorkPage As Visio.Page
Dim vsoShapeOnWork As Visio.Shape
Dim vsoTargetShape As Visio.Shape

On Error GoTo ErrorHandler ‘ エラー時でも確実に後始末をするためのトラップ

‘ ==========================================
‘ 1. 作業用ページ(サンドボックス)の動的作成
‘ ==========================================
Set vsoWorkPage = vsoDoc.Pages.Add()
vsoWorkPage.Name = “_Temp_Sandbox_” & Format(Now, “hhmmss”) ‘ ユニークな名前を付与

‘ ページの背景設定を無効化し、純粋な作業領域にする
vsoWorkPage.PageSheet.CellsSRC(visSectionObject, visRowPageLayout, visPLoBackground).ResultIU = 0

‘ ==========================================
‘ 2. サンドボックス内での安全な描画・加工
‘ ==========================================
‘ ユーザーの目には触れないこの場所で、複雑な図形を作成・編集します
Set vsoShapeOnWork = vsoWorkPage.DrawRectangle(1, 5, 4, 3)
vsoShapeOnWork.Text = “サンドボックスで生成”

‘ ここでさらに図形を結合したり、複雑なシェイプシートの書き換えを行っても、
‘ ユーザーの画面は微動だにしません。

‘ ==========================================
‘ 3. 完成品を本番ページへ転送(DropManyまたはGlueTo等を利用)
‘ ==========================================
‘ Visioでは、ActiveDocument.Pages間で形状を移すために .Drop を使います
Set vsoTargetShape = vsoTargetPage.Drop(vsoShapeOnWork, 4.2, 5.5)

‘ ==========================================
‘ 4. 作業用ページの破棄(お掃除)
‘ ==========================================
‘ 用事が済んだら作業用ページ自体を削除
vsoWorkPage.Delete

‘ 画面描画を復元
vsoApp.ScreenUpdating = True
vsoApp.AlertsEnabled = True

MsgBox “裏側での計算と描画が完了し、本番ページへの転送が終わりました!”, vbInformation, “処理成功”
Exit Sub

ErrorHandler:
‘ 万が一エラーが発生しても、画面描画の凍結とゴミページが残り続けるのを防ぐ
vsoApp.ScreenUpdating = True
vsoApp.AlertsEnabled = True

‘ もし作業用ページが存在していて、まだ削除されていなければここで削除
On Error Resume Next
If Not vsoWorkPage Is Nothing Then vsoWorkPage.Delete
On Error GoTo 0

MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub

コードの核心を読み解く:知っておくべき3つのポイント

① `ScreenUpdating = False` との組み合わせ

サンドボックス手法の最大のメリットは「描画の隠蔽」ですが、これだけでは不十分です。必ず `vsoApp.ScreenUpdating = False` をセットで使いましょう。これによって、Visioのウィンドウ再描画エンジンが完全に沈黙し、VBAの処理速度が劇的に向上します。

② エラーハンドリング(`On Error GoTo`)の絶対性

作業用ページ(サンドボックス)をコード内で動的に生成・削除する手法において、最も怖いのは「途中でエラーが起きてマクロが中断し、図面の中にゴミの作業ページが残り続けること」です。
上記のコードにある `ErrorHandler` は、プログラマとしての良心であり生命線です。エラーが起きようとも、確実に作業用ページを消去してクリーンな状態を保つ仕組みを必ず組み込みましょう。

③ ページ間の図形移動の作法

Visioのオブジェクトモデルでは、異なるページ間で直接図形の「移動(Move)」をすることはできません。
そのため、「作業用ページで図形を作り、それを本番ページへ `.Drop` メソッドで複製(あるいは形を引き継いで配置)し、大元の作業用ページごと削除する」というアプローチが正解となります。

陥りやすい罠とアドバイス

初心者のうちは、次のようなミスをしがちです。

  • 罠:「非表示ページ」という名前のプロパティを探してしまう
  • 真実: Visioの標準機能には「ページを完全に不可視(非表示)にする」という直接的なプロパティはありません。だからこそ、「ユーザーが見ていない別のページ(サンドボックス)」をプログラム側で一時的に生み出して用済みになったら消す、という発想の転換が必要なのです。
  • 罠:名前の重複によるエラー
  • 真実: `_Temp_Sandbox_` のような固定の名前でページを作ろうとすると、前回のマクロが異常終了した際に同名ページが残っていて `Pages.Add` でエラーになります。必ず今回紹介したように `Format(Now, “hhmmss”)` などを組み合わせて、絶対に被らないユニークな名前を動的に生成してください。

まとめ

今回は、Visio VBAを深く知る者だけが使っている「非表示作業用ページ(サンドボックス手法)」を解説しました。

  • 画面のちらつきを消し去る
  • 複雑な幾何計算を安全な別空間で行う
  • エラー時も確実に掃除して図面を汚さない

この3つを抑えたあなたは、もはや単なる「マクロの記録ユーザー」ではありません。立派なVisio自動化エンジニアです。ぜひ、日々の業務自動化ツールにこのテクニックを取り入れて、まわりを驚かせるような快適なツールを作ってみてくださいね。

それでは、次回の極限の知見でお会いしましょう!

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