こんにちは! CorelDRAW VBAの世界へようこそ。
日々、無数のベクターオブジェクトの角をひとつずつ手作業で丸めたり、マクロの自動記録機能で作成したコードがうまく動かずに悩んだりしていませんか?
デザインのトナー&マナー(トーン&マナー)を統一する際、ベクターパスの「角の丸め(フィレット処理)」を数値制御で一括適用するテクニックは、グラフィックデザインや製図の現場で強力な武器になります。
この記事では、「マクロの記録」を卒業し、CorelDRAW VBAのオブジェクト操作の本質を理解することを目指します。パフォーマンスを極限まで高め、エラーにも強い洗練されたコードの書き方を、基礎から丁寧に解説していきますね。
ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ! 一緒にステップアップしていきましょう。
—
1. なぜ「角の丸め」を一括自動化するのか?
デザイン制作において、アイコンセットや地図データ、複雑な図面など、数百〜数千もの角張ったオブジェクト(矩形や多角形、複雑なベクターパス)の角を「半角 2.0mm で統一したい」というケースは頻繁に発生します。
これを手動で行うと以下の問題が発生します:
- 天文学的な作業時間と精神的疲労
- 作業漏れや半径のブレ(ヒューマンエラー)
- CorelDRAW自体の描画更新負荷によるフリーズ
VBAを使ってプログラミング制御を行うことで、「選択した無制限のオブジェクトに対して、正確な数値をミリ単位で、数秒で一括適用する」ことが可能になります。
—
2. アーキテクトの視点:マクロ記録の限界と設計思想
初学者の方が最初に突き当たる壁、それが「マクロの記録」の限界です。
マクロの記録機能は、画面上の座標操作や選択状態(Selection)に依存したコードを生成します。そのため、対象の図形がグループ化されていたり、複雑なベクターパスだったりすると、簡単にエラーで停止してしまいます。
プロレベルのVBAコードを書くためには、以下の3つの設計思想が必要です。
[ユーザーの選択範囲]
│
▼
┌───────────────┐
│ 描画停止・最適化 │ ← Optimization = True
└───────┬───────┘
│
▼
┌───────────────┐
│ 再帰的グループ解析│ ← グループ内のパスも逃さず取得
└───────┬───────┘
│
▼
┌───────────────┐
│ フィレット適用 │ ← パス変換 & CreateFilletScallopChamfer
└───────┬───────┘
│
▼
┌───────────────┐
│ 描画再開・完了 │ ← Optimization = False
└───────────────┘
1. 描画(画面更新)の短一時停止:大量のオブジェクトを変形させる際、毎回画面を再描画させると劇的に重くなります。APIレベルで描画を止めるのがプロの鉄則です。
2. グループ構造の再帰処理:グループ化されたオブジェクトの中まで深く潜り込んで処理を適用します。
3. 安全な単位変換:CorelDRAWの内部単位(インチやポイント等)とミリメートル(mm)の変換を適切に行います。
—
3. 【実用コード】大量パスへの角丸(フィレット)一括適用マクロ
それでは、実際のコードを見てみましょう。標準モジュールを作成し、以下のコードを貼り付けてそのままお使いいただけます。
Option Explicit
‘ ==============================================================================
‘ 機能: 選択されたすべてのベクターオブジェクトに対し、ミリ単位指定で角丸処理を行う
‘ 動作環境: CorelDRAW X7 以降推奨
‘ ==============================================================================
Public Sub BatchApplyFilletToSelection()
Dim doc As Document
Set doc = ActiveDocument
‘ 1. ドキュメントが存在するか安全チェック
If doc Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If
‘ 2. 選択オブジェクトが存在するかチェック
If doc.Selection.Shapes.Count = 0 Then
MsgBox “角を丸めたいオブジェクトを選択してください。”, vbInformation, “対象なし”
Exit Sub
End If
‘ ユーザーに入力フォームで半径(mm)を求める
Dim inputVal As String
inputVal = InputBox(“角丸の半径(ミリメートル: mm)を入力してください:”, “フィレット一括適用”, “2.0”)
If inputVal = “” Or Not IsNumeric(inputVal) Then
Exit Sub ‘ キャンセルまたは不正な数値
End If
Dim radiusInMM As Double
radiusInMM = CDbl(inputVal)
‘ ————————————————————————–
‘ パフォーマンス最適化(ライフサイクル管理)
‘ ————————————————————————–
On Error GoTo ErrorHandler
‘ CorelDRAWの描画更新およびイベント通知を一時停止(処理速度が数千倍になります)
Application.Optimization = True
Application.EventsEnabled = False
‘ 1回のアンドゥ(元に戻す)で全操作を戻せるようにグループ化
doc.BeginCommandGroup “Batch Fillet Processing”
‘ ミリメートル単位を内部ドキュメント単位(Points等)に変換
Dim radiusInUnits As Double
radiusInUnits = doc.Utility.ConvertUnits(radiusInMM, cdrMillimeter, doc.Unit)
‘ 処理実行(再帰関数へ渡す)
Dim count As Long
count = 0
ProcessShapeRange doc.Selection.Shapes, radiusInUnits, count
‘ アンドゥグループを終了
doc.EndCommandGroup
‘ 最適化の解除(描画再開)
Application.Optimization = False
Application.EventsEnabled = True
Application.Refresh
MsgBox count & ” 個のオブジェクトに角丸(” & radiusInMM & ” mm)を適用しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ エラーが発生しても、必ず最適化設定を元に戻す(最重要)
Application.Optimization = False
Application.EventsEnabled = True
Application.Refresh
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub
‘ ==============================================================================
‘ 補助関数: シェイプコレクションを走査(グループ構造を安全に再帰処理)
‘ ==============================================================================
Private Sub ProcessShapeRange(ByVal shps As ShapeRange, ByVal radius As Double, ByRef count As Long)
Dim s As Shape
‘ ループ時のコレクション破綻を防ぐため、逆順またはコピーで回す
For Each s In shps
Select Case s.Type
Case cdrGroupShape
‘ グループの場合は、内部のシェイプ群を再帰的に呼び出す
ProcessShapeRange s.Shapes, radius, count
Case cdrRectangleShape, cdrCurveShape, cdrPolygonShape
‘ フィレット適用可能なオブジェクトかチェック
If ApplyFilletToSingleShape(s, radius) Then
count = count + 1
End If
Case Else
‘ テキストやビットマップなど、適用外のオブジェクトはスキップ
End Select
Next s
End Sub
‘ ==============================================================================
‘ 補助関数: 個別のシェイプへ角丸効果(CreateFilletScallopChamfer)を適用
‘ ==============================================================================
Private Function ApplyFilletToSingleShape(ByVal s As Shape, ByVal radius As Double) As Boolean
On Error Resume Next
‘ 1. 矩形やポリゴンなどは、まずパス(ベクターカーブ)に変換する
If s.Type <> cdrCurveShape Then
s.ConvertToCurves
End If
‘ 2. CorelDRAW専用APIでフィレット(角丸)を一括生成
‘ ※ 引数: 半径, 効果タイプ(cdrFilletScallopChamferFillet), オリジナル保持(False)
s.CreateFilletScallopChamfer radius, cdrFilletScallopChamferFillet, False
If Err.Number = 0 Then
ApplyFilletToSingleShape = True
Else
Err.Clear
ApplyFilletToSingleShape = False
End If
End Function
—
4. コードの深掘り解説:プロが実践する3つの重要ポイント
このコードには、単に「角を丸める」だけではない、業務自動化の設計ノウハウが詰まっています。ポイントを3つ解説します。
Point 1: `Application.Optimization = True`(処理速度の極限化)
CorelDRAWで大量の図形を変形させると、図形が1つ変わるたびに画面が再描画され、操作が極端に重くなります。
`Application.Optimization = True` を宣言すると、マクロの処理が終わるまで画面描画をフリーズ(停止)させることができます。これにより、通常なら数分かかる大量処理が数秒で終わるようになります。
Point 2: アンドゥバッファの集約 (`BeginCommandGroup`)
`doc.BeginCommandGroup` と `doc.EndCommandGroup` で処理を囲むことで、1000個のオブジェクトを変形させても、CorelDRAW上の 「元に戻す(Ctrl + Z)」一回で全状態を復元できるようになります。ユーザー体験(UX)を高める必須テクニックです。
Point 3: 再帰処理(Recursive Processing)によるグループの解体不要化
デザインデータは、複雑な「グループの入れ子」構造になっていることがよくあります。
`ProcessShapeRange` 関数の中で、自分自身を呼び出す「再帰処理」を行うことで、グループ化を解除することなく、深層にある図形だけに安全にフィレットを適用できます。
—
5. 陥りやすい罠と対策(トラブルシューティング)
罠 1: 「角丸の半径」が図形の辺の長さより大きすぎる
- 現象: マクロを実行しても、一部の図形の角が丸くならない、またはパスが崩れる。
- 原因: 例えば「幅 1mm」の小さな長方形に対して「半径 5mm」のフィレットを適用しようとすると、数学的に破綻します。
- 対策: 上記コードでは `On Error Resume Next` を活用し、適用不能な要素があってもエラー停止させず、安全にスキップするようにガードを組んでいます。
罠 2: 単位(Unit)の誤認
- 現象: `2.0`(2mm)と指定したのに、巨大な角丸になってしまう。
- 原因: CorelDRAWの内部計算単位は、ドキュメントの設定(インチやポイント等)に依存します。
- 対策: `doc.Utility.ConvertUnits(radiusInMM, cdrMillimeter, doc.Unit)` を介することで、どのような単位設定のドキュメントで実行しても正確にミリメートル換算されるようにしています。
—
6. まとめ:ベクター操作を掌握し、次のステップへ
今回のマクロはいかがでしたでしょうか?
1. 画面描画とイベントの制御でパフォーマンスを確保する
2. グループ構造を再帰的に走査する
3. CorelDRAW固有の強力な幾何API(`CreateFilletScallopChamfer`)を叩く
この3つのステップを理解できれば、CorelDRAW VBAの基本的なパス操作・オブジェクト操作はバッチリマスターできたと言えます!
角丸処理以外にも、色の一括変更、アウトラインの太さの統一、オブジェクトの整列など、今回のコードの骨格(走査部分)をそのまま流用して様々な自動化プログラムへ応用できます。
ぜひ開発現場でコピペして試していただき、手作業からの解放感を味わってみてくださいね。あなたのデザイン業務がよりクリエイティブで快適なものになることを応援しています!
