【入門編】【中級】Page.DropManyを用いた図形の超高速一括配置:ループ処理のボトルネックを解消する – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの限界を突破せよ:`DropMany`で実現する「超高速」図形配置の極意

こんにちは。現場でVisioを酷使していると、必ずぶつかる壁があります。
「数百個の図形を配置しようとすると、Visioがフリーズしたように重くなる……」

マクロの記録から始めたばかりの頃、私たちはつい `Page.Drop` メソッドをループで回してしまいがちです。しかし、それは「1枚ずつ郵便物をポストに投函するために、その都度玄関まで往復している」ようなもの。

今日は、その非効率を卒業し、Visioの描画エンジンを味方につける「`DropMany`」という切り札についてお話しします。ここをマスターすれば、あなたのマクロは数秒で終わる「爆速ツール」に進化します。

—

なぜ `Page.Drop` は遅いのか?

`Page.Drop` をループ内で使うと、Visioは「図形を追加するたび」に以下の処理を走らせます。

1. 再描画(リペイント)
2. 接続情報の再計算
3. イベントの発生(`ShapeAdded`など)

100個の図形なら100回、1,000個なら1,000回。これではPCが悲鳴を上げるのも当然です。

救世主:`Page.DropMany` とは?

`Page.DropMany` は、「図形の配列」と「座標の配列」を一度に渡すことで、描画エンジンに一括処理させるメソッドです。

内部的にはメモリ上で一気に計算が完了するため、ループ処理とは比較にならないパフォーマンスを発揮します。まさに、トラック1台で荷物をまとめて運ぶようなものです。

—

実践:`DropMany` を使った高速配置コード

まずは、以下のコードを見てください。これが「プロの型」です。

Sub FastDropShapes()
Dim vsoPage As Visio.Page
Dim vsoMaster As Visio.Master
Dim i As Long
Dim count As Long: count = 100 ‘ 配置したい図形の数

‘ 配列の準備(0から始まるインデックス)
Dim masters(0 To 99) As Object
Dim xy(0 To 199) As Double ‘ x, yのペアなので数は2倍

Set vsoPage = ActivePage
‘ あらかじめマスターシェイプを特定しておく(高速化のコツ)
Set vsoMaster = Visio.Documents.Item(“Basic_U.vssx”).Masters.Item(“Square”)

‘ 配列にデータを詰め込む
For i = 0 To count – 1
Set masters(i) = vsoMaster
xy(i 2) = 1 + (i Mod 10) 0.5 ‘ X座標
xy(i 2 + 1) = 1 + (i \ 10) 0.5 ‘ Y座標
Next i

‘ 一気に配置する(これが魔法のメソッド)
‘ 引数:マスター配列、座標配列、戻り値のシェイプ配列(省略可)
vsoPage.DropMany masters, xy

MsgBox “100個の図形を爆速で配置完了しました!”
End Sub

コードの重要ポイント解説

1. 配列のサイズ管理:
`xy` 配列のサイズに注意してください。図形が `N` 個なら、座標は `2 N` 個必要です(XとYのペアだからです)。
2. マスターの事前取得:
ループの中で `Documents.Item(…).Masters.Item(…)` を呼ぶと、それだけで処理速度は落ちます。必ずループの外でオブジェクト変数にセットしておくのが鉄則です。
3. `DropMany` の引数:
第一引数には「マスターシェイプの配列」、第二引数には「Double型の座標配列」を渡します。これだけで、Visioは最適化されたパスで図形を生成してくれます。

—

陥りやすいエラーと回避策

1. 「型が一致しません」エラー

最も多いのが、`masters` 配列の型指定です。`Dim masters() As Visio.Master` と宣言するとエラーになることがあります。`Dim masters() As Object` と宣言するのが最も安全で、Visioの型変換に左右されません。

2. 配置座標の計算ミス

`xy(i 2)` がX座標、`xy(i 2 + 1)` がY座標です。このインデックスの計算を間違えると、図形が原点(0,0)に重なって配置されてしまいます。デバッグ時には `Debug.Print` を使って、配列の中身をイミディエイトウィンドウで確認する癖をつけましょう。

—

まとめ:自動化エンジニアの視点

`DropMany` を使うことは、単なる高速化ではありません。「Visioの仕組みを理解して、効率的に動かす」というアーキテクトとしての第一歩です。

  • 基礎:一つずつ置く(`Drop`)
  • 中級:まとめて置く(`DropMany`)
  • 上級:さらに `Application.BeginUndoScope` を使い、大量の操作を1つの「元に戻す」単位にまとめる(※これについてはまた別の機会に!)

まずは今日のコードを、手元のマクロで試してみてください。一瞬で画面上に図形が並ぶ快感を知れば、もう `Drop` には戻れなくなるはずです。

Visio VBAは、書き手の意図を素直に反映する素晴らしい言語です。迷ったらまたいつでも戻ってきてください。あなたの自動化ライフを全力で応援しています。

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