CorelDRAW VBAを掌握せよ:大量パスの「一括角丸化」を極めるアーキテクチャ設計
現場のデザイナーが手作業でポチポチと角丸(フィレット)を調整している姿を見て、「自動化できそうだ」と考えたあなた。その直感は正しい。しかし、CorelDRAWのVBAで「なんとなく動くコード」を書くのと、数千のオブジェクトを淀みなく処理する「プロダクションコード」を書くのとでは、天と地ほどの差がある。
今日は、CorelDRAW APIの深淵に触れ、メモリ効率と堅牢性を両立させた「角丸一括適用スクリプト」の設計思想を伝授する。
—
1. なぜ「力技」ではいけないのか
CorelDRAW VBAにおいて、最も避けるべきは「選択状態の逐次操作」だ。`ActiveShape`をループで回し、UIを介してエフェクトを適用するようなコードを書けば、描画更新(Screen Refresh)が走るたびにパフォーマンスは死に、最悪の場合はスタックオーバーフローやメモリリークを招く。
真の自動化エンジニアが意識すべきは以下の3点だ。
1. Transactionの分離: `Optimization = True` を適切に使い、描画を止める。
2. Type-Safetyの徹底: `Shape.Type` を検証し、処理対象外を事前に弾く。
3. Undoスタックの制御: 大量処理は一括で「1つの操作」としてUndoできるようにする。
—
2. プロダクションコード:Robust Fillet Automation
以下のコードは、選択中のオブジェクトの中から「長方形(Rectangle)」あるいは「カーブ(Curve)」を抽出し、指定した半径で一括角丸化する設計だ。
Option Explicit
‘ メイン処理:選択範囲に対して一括で角丸を適用する
Public Sub BatchApplyFillet()
Dim s As Shape
Dim sr As ShapeRange
Dim radius As Double
‘ 半径(単位はドキュメント設定に依存。必要に応じて変換を噛ませること)
radius = 0.5
‘ パフォーマンス最適化の要
Optimization = True
ActiveDocument.BeginCommandGroup “Batch Fillet Process”
On Error GoTo Cleanup
Set sr = ActiveSelectionRange
If sr.Count = 0 Then
MsgBox “オブジェクトを選択してください。”
GoTo Cleanup
End If
For Each s In sr
‘ 矩形またはカーブのみを対象とする
If s.Type = cdrRectangleShape Or s.Type = cdrCurveShape Then
ApplyFilletToShape s, radius
End If
Next s
Cleanup:
ActiveDocument.EndCommandGroup
Optimization = False
ActiveWindow.Refresh
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
‘ 個別のシェイプに対するロジック(保守性を高めるため分離)
Private Sub ApplyFilletToShape(s As Shape, radius As Double)
‘ RectangleオブジェクトならCornerRadiusプロパティを直接操作
If s.Type = cdrRectangleShape Then
s.Rectangle.CornerType = cdrCornerTypeRound
s.Rectangle.RadiusLowerLeft = radius
s.Rectangle.RadiusLowerRight = radius
s.Rectangle.RadiusUpperLeft = radius
s.Rectangle.RadiusUpperRight = radius
ElseIf s.Type = cdrCurveShape Then
‘ カーブの場合はFillet効果を適用(実務上はここでノード操作が必要になることも)
‘ ※簡易的にFillet/Scallop/Chamfer効果を適用するメソッド
s.CreateFillet radius
End If
End Sub
—
3. 実践的アドバイス:落とし穴を回避する
単位の罠に注意せよ
`ActiveDocument.Unit` を固定せずにコードを書くと、ユーザーの環境設定(ミリ単位、インチ単位)によって結果が狂う。数値入力が必要な場合は、必ず `ActiveDocument.ToUnits(value, cdrMillimeter)` のように、基準単位を明示的に変換して扱うのがプロの作法だ。
データベース連携を見据えるなら
もしこれが「CSVからパスサイズを読み取って生成・角丸化する」ツールであれば、`ActiveDocument.ReferencePoint` を考慮せよ。原点がどこにあるかで、座標計算の結果が大きく変わる。外部データとの連携時は、必ず「グローバル座標」と「ローカル座標」の変換関数を自作しておくことを強く勧める。
保守性を高めるアーキテクチャ
コード内で直接定数を書くのではなく、設定用シート(Excel)やJSONファイルからパラメータを読み込む設計にしておけば、デザイナーがコードを触らずに半径を変更できる。これが「エンジニアの価値」だ。
—
結びに代えて
CorelDRAWの自動化は、単なるコード記述ではない。それは「デザイナーの思考を数学的に再構築すること」である。今回提供したコードは、あくまで「動く基礎」だ。これをベースに、エラーハンドリングを強化し、自分専用のライブラリに組み込んでほしい。
もし、さらに高度なノードベースの操作(特定の頂点だけを丸める等)が必要になったら、その時はCorelDRAWの `SubPath` オブジェクトと `Node` オブジェクトの深淵へ共に潜ろう。
あなたの自動化プロジェクトが、クリエイティブを加速させる強力な武器になることを確信している。健闘を祈る。
