【テクニカル・上級編】【実務直結】ActiveSelectionRangeを活用して複数選択されたオブジェクトの一括整列とサイズ変更を自動化 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握せよ:ActiveSelectionRangeによる「一括操作」の極意

CorelDRAWの自動化において、初心者は`ActiveShape`という単一オブジェクトの操作に終始する。しかし、実務の現場においてそれは「点」の処理に過ぎない。真のエンジニアは、選択されたオブジェクト群をいかに効率的に、かつメモリの断片化を招かずに制御するかという「面」の処理を極めている。

今回は、`ActiveSelectionRange`を駆使し、パフォーマンスと保守性を両立させた一括整列・リサイズ処理の深淵に迫る。

1. なぜ「ActiveSelectionRange」なのか:オブジェクトモデルの真実

`ActiveSelection`は、一見便利だが、内部的には選択順序やグループ化の状態で挙動が不安定になることがある。これに対し、`ActiveSelectionRange`を明示的に定義し、そこにオブジェクトを格納することは、操作対象をメモリ上で「固定」することを意味する。

特に、数千のノードを持つ複雑なパスや、膨大なオブジェクトを扱う際、ループの中で毎回`ActiveSelection`を評価するのはメモリリークとパフォーマンス低下の元凶である。

2. 【極限コード】高速化を考慮した一括整列・リサイズ処理

以下のコードは、単なる機能実装ではない。オブジェクトのライフサイクルを意識し、`Nothing`による解放を徹底した、システム運用に耐えうるアーキテクチャである。

‘ ————————————————————————-
‘ 目的: 選択された全オブジェクトを一括で整列し、サイズを統一する
‘ 著者: Chief Architect
‘ ————————————————————————-
Sub BatchProcessSelection()
Dim sr As ShapeRange
Dim sh As Shape
Dim targetWidth As Double
Dim targetHeight As Double

‘ パフォーマンス向上のための設定
Optimization = True

‘ 選択オブジェクトの取得
Set sr = ActiveSelectionRange

‘ 空判定(実務では必須のガード句)
If sr.Count = 0 Then
MsgBox “対象が選択されていません。”, vbCritical
GoTo Cleanup
End If

targetWidth = 50.0 ‘ 50mm固定
targetHeight = 50.0 ‘ 50mm固定

‘ 非表示状態の高速化:BeginCommandGroupでUndoをひとまとめにする
ActiveDocument.BeginCommandGroup “Batch Transform”

‘ 範囲内のオブジェクトを反復処理
For Each sh In sr
‘ 整列処理(座標を指定位置へ)
sh.SetPosition 0, 0

‘ サイズ変更(ロック解除を考慮しつつ適用)
sh.SetSize targetWidth, targetHeight
Next sh

ActiveDocument.EndCommandGroup

Cleanup:
‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Set sh = Nothing
Set sr = Nothing

‘ 設定を元に戻す
Optimization = False
ActiveWindow.Refresh
End Sub

3. チーフアーキテクトからの助言:現場で生き残るための「3つの極意」

① `Optimization` フラグの重み

CorelDRAW VBAにおいて、`Optimization = True`を宣言することは、画面描画を停止させ、イベントのフックを抑止する。数千個の図形を扱う際、これがないと描画コストだけで処理時間が10倍以上変わる。必ず処理の最後に `False` へ戻すことを忘れてはならない。

② `BeginCommandGroup` によるUndoの原子性

複数のオブジェクトを個別に処理すると、Ctrl+Z(Undo)が「1オブジェクト単位」で発生し、ユーザーのUXを破壊する。`BeginCommandGroup` で括ることで、これらの一連の操作を「一つの操作」としてUndoスタックに登録できる。これはシステム保守の観点からも必須の作法だ。

③ Windows APIとレガシー連携

さらに高度な自動化を目指すなら、`User32.dll` を利用したモーダルダイアログの制御や、外部システム(Excel/SQL Server)との連携が鍵となる。`ActiveSelectionRange` 内のプロパティをJSON化し、外部APIへ投げることで、CorelDRAWを単なる描画エンジンとしてではなく、業務ワークフローの一部として統合可能になる。

結びに代えて

VBAはレガシーと言われて久しい。しかし、CorelDRAWの内部構造(ドキュメントツリー)をこれほど直接的に、かつ低レイヤーで叩ける言語は他にない。

「動けばいい」コードは素人が書く。我々エンジニアが書くべきは、メモリを汚さず、処理コストを最小化し、数年後のメンテナーが絶望しない、静かなる最適解だ。

君の次のタスクは、この `ShapeRange` をどう拡張し、業務のボトルネックを消滅させるかだ。健闘を祈る。

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