CorelDRAW VBAの深淵:ブール演算を制する者が自動化の頂に立つ
CorelDRAWの自動化において、最もコストを払い、かつ最も劇的な効率化を生むのが「パス演算」の自動化である。UI上でのトリム、溶接、交差は直感的だが、VBAでこれを実装する場合、オブジェクトモデルの不完全さとメモリ管理の甘さが即座に致命的なパフォーマンス低下を招く。
本稿では、シニアエンジニアが現場で直面する「複雑なパス演算」をいかに堅牢に、かつ一瞬で処理するか。その極限の知見を共有する。
—
1. オブジェクトライフサイクルと「隠れたコスト」
CorelDRAW VBAにおいて、`ShapeRange`の生成やブール演算メソッド(`Weld`, `Trim`, `Intersect`等)を不用意にループ内で回すと、CorelDRAWのUndoスタックが肥大化し、最悪の場合はメモリリークでプロセスがクラッシュする。
特に、`CreateShapeRangeFromExclusion`のような複雑な演算を行う際は、以下の鉄則を遵守せよ。
- Undoスタックの管理: 大規模処理の直前で `Optimization = True` を設定し、処理後に `Optimization = False` と `ActiveDocument.ClearUndo` を組み合わせることでメモリを保護せよ。
- 明示的なメモリ解放: VBAの `Set obj = Nothing` は気休めに過ぎない。ループ内で生成された一時的な `Shape` オブジェクトを適切に `Delete` し、スタック領域をクリーンに保つことが長時間の自動化には不可欠だ。
—
2. 実践:ブール演算の最適化実装
以下は、複数のオブジェクトから特定の領域を抜き出す(トリム/交差)ための堅牢な実装例である。
‘ 伝説的なチーフアーキテクトによる、高負荷演算の実装サンプル
Public Sub ExecuteAdvancedBooleanLogic()
Dim doc As Document
Set doc = ActiveDocument
‘ 1. 最適化モードの有効化
doc.BeginCommandGroup “BooleanProcessing”
Optimization = True
EventsEnabled = False ‘ イベントリスナーの無効化(重要)
On Error GoTo Cleanup
‘ ターゲットとカッターの取得
Dim target As Shape, cutter As Shape
Set target = ActiveLayer.Shapes.FindShape(Name:=”TargetShape”)
Set cutter = ActiveLayer.Shapes.FindShape(Name:=”CutterShape”)
‘ 2. 高度な演算処理
‘ Trimは戻り値として新しいShapeRangeを返す
Dim resultRange As ShapeRange
Set resultRange = target.Trim(cutter, True, True)
‘ 3. 後処理(不要なカッターの破棄)
cutter.Delete
MsgBox “演算完了: ” & resultRange.Count & ” 個のシェイプを生成しました。”
Cleanup:
‘ 4. クリーンアップ処理
Optimization = False
EventsEnabled = True
doc.EndCommandGroup
If Err.Number <> 0 Then
MsgBox “演算エラー: ” & Err.Description, vbCritical
End If
End Sub
—
3. シニアエンジニアが知るべき「回避術」と「裏技」
A. ShapeRangeの動的生成における罠
`CreateShapeRangeFromExclusion` を利用する場合、対象となるオブジェクトが「閉じたパス」であることを事前にバリデーションしなければならない。`Curve.Closed` プロパティをチェックせず演算に突入するのは自殺行為だ。演算前に `Curve.CloseCurve` をコールするラッパー関数を必ず用意せよ。
B. Windows APIによる「強制再描画」の抑制
大量のオブジェクトを処理する際、CorelDRAWの再描画エンジンが足を引っ張ることがある。極限の環境では `LockWindowUpdate` (user32.dll) を呼び出し、UIの更新を停止させることで処理速度を20%以上向上させることが可能だ。
If VBA7 Then
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As Long
Else
Private Declare Function LockWindowUpdate Lib “user32” (ByVal hwndLock As Long) As Long
End If
—
4. 総括:レガシーとモダンを繋ぐアーキテクチャ
CorelDRAW VBAはレガシーな技術と見られがちだが、そのオブジェクトモデルは依然として強力である。重要なのは、「UI操作の模倣」をするのではなく、「データ構造としてのパス」を直接操作する意識を持つことだ。
特に、システム間連携(例えば、外部DBからXML/JSONを受け取り、それをパスデータに変換してCorelDRAW上で演算処理するなど)を行う場合、この「ブール演算の自動化」は工数を劇的に削減する武器となる。
諸君、コードを汚すな。オブジェクトを解放せよ。そして、演算後のパスの美しさにこそ、エンジニアとしての矜持を見出せ。
以上。
