【実務・中級編】【初心者向け】選択したベクター図形を一括して同心円状に縮小・複製して幾何学的なアートパターンを生成する自動化 – CorelDRAW VBA解析バイブル

スポンサーリンク

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のメモリ管理を最大限に尊重する設計になっています。

まずはこのコードをコピーして、自分の手で幾何学模様を生成してみてください。そこから、あなたなりの「自動化の美学」を見つけていただければ幸いです。

質問があれば、いつでも現場の知見を共有しましょう。健闘を祈ります。

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