【入門編】Page.DropManyUへの配列渡しによる大量マスターシェイプ一括配置とメモリ極限最適化 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの真髄:`DropManyU`で描画速度を極限まで引き上げる

こんにちは。業務自動化の世界へようこそ。
「マクロの記録」で生成されたコードを見て、「なぜこんなに動きが遅いのか?」と疑問に思ったことはありませんか?

Visioで数百個の図形を配置するとき、一つずつ`Drop`メソッドを呼び出していては、PCは悲鳴を上げます。なぜなら、メソッドを呼ぶたびにVisioの描画エンジンとメモリ管理が「配置のたびに画面更新と再計算」を繰り返すからです。

今日は、Visioの性能を限界まで引き出す「`DropManyU`による一括配置」という奥義を伝授します。これを知れば、あなたの自動化ツールは「重たい処理」から「瞬時の魔法」へと進化します。

1. なぜ「一つずつ」ではいけないのか?

Visioのオブジェクトモデルにおいて、`Page.Drop`メソッドは非常に手軽ですが、ループ内で100回実行すれば、100回の「描画更新イベント」が発生します。

一方で、`DropManyU`は、座標データとマスターシェイプの情報を配列として一度にメモリに送り込みます。Visioは「まとめて受け取って、一気に配置する」ため、オーバーヘッドが劇的に減るのです。

メモリと処理の挙動イメージ

  • Dropの場合: 1個配置 → 描画更新 → 1個配置 → 描画更新…(遅い)
  • DropManyUの場合: {データ群}を渡す → 一括配置 → 描画更新(速い!)

2. 魔法のメソッド:`DropManyU`の構造

`DropManyU`は、引数として複数の配列を要求します。

  • `ObjectsToDrop()`: 配置したいマスターシェイプの配列
  • `XYArray()`: 配置先のX座標・Y座標を交互に格納した配列

これらを渡すだけで、Visioは裏側で計算を完結させます。

3. 実践コード:一括配置のテンプレート

まずはこのコードをコピーして、標準モジュールに貼り付けてみてください。

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

‘ 配置用配列の宣言
Dim Masters(0 To 99) As Object
Dim XYArray(0 To 199) As Double ‘ X, Yのペアなので2倍のサイズ

Set vsoPage = ActivePage
‘ ここでマスターシェイプを読み込む(ドキュメントステンシルにあると仮定)
Set vsoMaster = ActiveDocument.Masters(“基本機器”)

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

‘ 画面更新を停止してさらに高速化
Application.ScreenUpdating = False

‘ 一括配置実行
vsoPage.DropManyU Masters, XYArray

‘ 画面更新を戻す
Application.ScreenUpdating = True

MsgBox “100個の図形を配置しました!”
End Sub

4. 陥りやすい罠と対策

このコードを使いこなすために、以下の3点だけは覚えておいてください。

① 配列のサイズ指定(ゼロベース・ワンベースの罠)

VBAの配列は、宣言時にサイズを指定する必要があります。`DropManyU`は固定長配列を要求するため、動的配列を使う場合は `ReDim` でサイズを確定させてから渡すのが鉄則です。

② U(Universal)の意味を知る

メソッド名の末尾にある「U」はUniversalを指します。これは「言語や地域設定に依存しない座標系・単位系で処理する」ことを意味します。`Drop`ではなく`DropU`や`DropManyU`を使うのが、プロのエンジニアの嗜みです。

③ 座標系は「インチ」であること

Visioの内部計算は常に「インチ」です。もしセンチメートルで指定したい場合は、`Application.ConvertResult`関数を使ってインチに変換してから配列に入れてください。

最後に:エンジニアとしての視点

`DropManyU`をマスターしたあなたは、もう「マクロの記録」という守護から卒業しました。

プログラムの本質は、「いかにコンピュータの苦労を減らすか」にあります。100回命令するのではなく、1回で100個の仕事を依頼する。この発想こそが、大規模なシステムを構築するための第一歩です。

まずは、あなたの図面でこの「高速配置」を試してみてください。その一瞬で終わる処理速度に、きっと驚くはずです。

何か不明点があれば、またいつでも聞いてください。あなたの自動化ライフを全力で応援しています!

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