CorelDRAW VBAを掌握せよ:幾何学的パターン生成に見る「オブジェクト操作」の極意
CorelDRAWの自動化において、初心者が最初に陥る罠は「描画処理の泥沼」です。GUI操作をそのままコードに翻訳しようとすると、処理は重くなり、メモリリークを招き、最終的にはCorelDRAWそのものがクラッシュします。
今回は、選択したオブジェクトを同心円状に縮小・回転複製し、幾何学模様を生成するマクロを題材に、「なぜそのコードではダメなのか」という本質的な設計思想を伝授します。
—
1. なぜ「力技のコピー」が死を招くのか
多くの初心者は `Shape.Copy` と `Paste` を繰り返します。これは最悪のアンチパターンです。
クリップボードを介する処理はCorelDRAWにとって多大なオーバーヘッドであり、何より「どのオブジェクトを選択しているか」という状態(Selection)に依存するコードは、拡張性が皆無です。
我々プロフェッショナルが目指すべきは、「オブジェクトへの直接参照」と「変換行列(Transformation Matrix)の最適化」です。
—
2. プロダクション品質の幾何学生成コード
以下のコードは、単に動くだけではありません。Undo(取り消し)を一発で完了させる `Optimization` 処理を組み込み、描画負荷を最小限に抑えた堅牢な設計です。
Option Explicit
‘ 幾何学パターン生成のメインプロシージャ
Public Sub GenerateGeometricPattern()
Dim s As Shape
Dim sr As ShapeRange
Dim i As Integer
Dim copyShape As Shape
‘ 1. エラーハンドリングの徹底
If ActiveSelectionRange.Count = 0 Then
MsgBox “対象となる図形を選択してください。”, vbExclamation
Exit Sub
End If
‘ 2. パフォーマンス最適化の呪文
‘ 画面更新を停止し、Undo情報を一つにまとめる
Optimization = True
ActiveDocument.BeginCommandGroup “Geometric Pattern Generation”
Set sr = ActiveSelectionRange
‘ 設定値(本来はフォーム等から取得すべき)
Const REPEAT_COUNT As Integer = 30
Const SCALE_FACTOR As Double = 0.95
Const ROTATION_ANGLE As Double = 5.0
For Each s In sr
For i = 1 To REPEAT_COUNT
‘ オブジェクトの複製(Pasteを使わない直接複製)
Set copyShape = s.Duplicate
‘ 縮小処理
copyShape.SetSize copyShape.SizeWidth (SCALE_FACTOR ^ i), _
copyShape.SizeHeight (SCALE_FACTOR ^ i)
‘ 回転処理(重心を軸にするのが幾何学の基本)
copyShape.Rotate ROTATION_ANGLE i
Next i
Next s
‘ 3. 後処理の徹底
ActiveDocument.EndCommandGroup
Optimization = False
ActiveWindow.Refresh
End Sub
—
3. 設計のポイント:なぜこのコードが「堅牢」なのか
① `Optimization = True` の重要性
CorelDRAWのAPIは、実行されるたびに画面の再描画を試みます。数千のオブジェクトを操作する場合、この再描画だけで数分を浪費します。必ずループの前後でこのフラグを制御してください。
② `ActiveSelectionRange` の活用
`ActiveSelection`(単体)ではなく `ActiveSelectionRange` を使うことで、ユーザーがグループ化されたオブジェクトを選択していても、一つひとつの要素に対して安全にアクセスできます。
③ `BeginCommandGroup` によるトランザクション管理
この一行があるだけで、実行後に `Ctrl+Z` を一度押すだけで全ての複製が消去されます。ユーザー体験(UX)を考慮した、プロフェッショナルの必須作法です。
—
4. 次のステージへ:さらに高度な自動化を目指すなら
このコードを土台に、以下のような拡張を検討してください。これが「業務自動化エンジニア」への道です。
- パラメータの外部化: `Const` でハードコードせず、INIファイルやJSONから読み込むようにする。これにより、コードを修正せずにデザインを変更可能になります。
- レイヤー管理: 生成したパターンを特定のレイヤーに自動的に振り分ける処理を追加する。これにより、後続のファイル変換やエクスポート作業が劇的に楽になります。
- エラーの事前チェック: `If s.Type = cdrCurveShape Then` といった判定を入れ、線属性のみに適用するなどの「型安全」な処理を実装しましょう。
最後に:自動化は「魔法」ではなく「規律」である
コードは書いた瞬間から「メンテナンス」という名の消耗戦が始まります。
今回紹介したコードは、無駄な依存関係を排除し、CorelDRAWのメモリ管理を最大限に尊重する設計になっています。
まずはこのコードをコピーして、自分の手で幾何学模様を生成してみてください。そこから、あなたなりの「自動化の美学」を見つけていただければ幸いです。
質問があれば、いつでも現場の知見を共有しましょう。健闘を祈ります。
