こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がよくわからない…」という段階を卒業し、自分の手でデザインの自動化をコントロールしたい中級者の方へ。
今回は、実務で最も頭を悩ませるポイントの一つである「大量のパスデータに対するブール演算(溶接・トリム・交差など)の一括バッチ処理」をテーマに、CorelDRAW VBAの奥深い世界を一緒に紐解いていきましょう。
ここをしっかりとクリアできれば、あなたのVBAスキルは間違いなく「実務レベル」に到達します。さあ、一緒に極限の効率化を手に入れましょう!
—
なぜ、ブール演算の自動化でつまずくのか?
カッティングプロッター用のデータ作成や、複雑なロゴデザインの整理をしているとき、こんな作業にウンジリしたことはありませんか?
- 「重なり合った何百個ものパーツを、一つひとつ選択して『溶接』していく…」
- 「手動でやると、レイヤーの順番が変わってしまったり、意図しないパスが消えたりする…」
CorelDRAWの画面上ではマウス操作で一瞬に見える「溶接(Weld)」「トリム(Trim)」「交差(Intersect)」ですが、これをVBAで制御しようとすると、多くのエンジニアが「あれ?エラーは出ないのに、意図した図形が消えた」「変なオブジェクトが選択されて固まった」という壁にぶつかります。
その理由は、CorelDRAWの「シェイプのライフサイクル」と「選択状態(ActiveSelection)の罠」にあります。ここを理解するのが、プロとアマの分かれ道です。
—
押さえておくべき3つの極意(基本思想)
コードを書く前に、CorelDRAW VBAにおけるブール演算の鉄則を頭に叩き込んでおきましょう。
1. 画面上の「選択」に頼るな
`ActiveDocument.Selection` を使ったコードは、画面の描画速度に引きずられて不安定になります。VBAでは、メモリ上でオブジェクトを変数(`Shape` や `ShapeRange`)として確実に掴むのが鉄則です。
2. 演算の「主(Base)」と「従(Target)」を間違えるな
例えば「トリム」の場合、「何で(What)」を「何を(Which)」で抜くのかという方向性をコードで明確に指示する必要があります。
3. 演算後のオブジェクトの消滅に備えよ
「溶接」を実行すると、元の複数のシェイプは消え去り、新しく1つのシェイプが誕生します。この「オブジェクトの消滅と生成」をコードが追跡できるように書く必要があります。
—
実践!一括ブール演算自動化マクロ
それでは、実務でそのまま使えるコードを見ていきましょう。
今回は、ドキュメント内にある「特定のレイヤーにある複数の重なり合った円や多角形」を、基準となるベースシェイプに対して一括で「トリム(切り抜き)」するバッチ処理のコードを解説付きで用意しました。
Sub BatchTrimProcessing()
‘ —————————————————————–
‘ 処理名: 大量パスデータに対する一括トリム処理
‘ 概要: 基準となるベースシェイプに対し、他の全シェイプを一括でトリムする
‘ —————————————————————–
‘ エラーハンドリングの準備(実務の基本です)
On Error GoTo ErrorHandler
Dim doc As Document
Set doc = ActiveDocument
‘ 画面描画をロックして処理速度を爆発的に上げる(超重要テクニック)
doc.BeginCommandGroup
EventsEnabled = False
Dim srAll As ShapeRange
Set srAll = doc.ActivePage.Shapes
‘ シェイプが2つ以上なければ処理を抜ける
If srAll.Count < 2 Then
MsgBox "処理に必要なシェイプが不足しています。", vbExclamation
GoTo CleanUp
End If
' 【極意】一番下のレイヤーにある(あるいは特定の条件を満たす)オブジェクトをベースにする
' ここでは便宜上、一番最初に作成されたシェイプを「ベース(切り抜かれる側)」とする
Dim baseShape As Shape
Set baseShape = srAll(srAll.Count) ' コレクションの最後尾
Dim i As Long
Dim targetShape As Shape
' 処理ループ:ベース以外のシェイプを順にトリムしていく
' ※コレクションの数が増減するため、後ろからループを回すのが安全
For i = srAll.Count - 1 To 1 Step -1
Set targetShape = srAll(i)
' Nullチェック(すでに演算で消滅していないか確認)
If Not targetShape Is Nothing Then
' トリムを実行
' Syntax: baseShape.Trim(TargetShape, LeaveOriginalSource, LeaveOriginalTarget)
' ここでは、切り抜く側(targetShape)を残す設定でトリム
baseShape.Trim targetShape, True, True
End If
5 Next i
CleanUp:
' 画面描画のロックを解除
EventsEnabled = True
doc.EndCommandGroup
doc.Window.Refresh
MsgBox "一括トリム処理が完了しました!", vbInformation
Exit Sub
ErrorHandler:
' エラー時のリカバリー処理
EventsEnabled = True
doc.EndCommandGroup
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
---
コードの深掘り解説:なぜこの書き方なのか?
1. `EventsEnabled = False` と `BeginCommandGroup` の威力
大量のオブジェクトに対してVBAから演算命令を送ると、CorelDRAWはその都度画面を描画しようとし、激しくフリーズしたり処理が何倍にも遅くなったりします。
処理の最初に画面描画とイベントを止めておき、最後に一気に更新(`doc.Window.Refresh`)することで、処理速度を数倍〜十数倍に跳ね上げることができます。これはプロのエンジニアが必ず使うテクニックです。
2. コレクションを逆順(`Step -1`)で回す理由
VBAでオブジェクトの削除や統合(ブール演算など)を行うと、ドキュメント内のシェイプの総数やインデックス番号がリアルタイムで変動します。
前から順番(`1 To Count`)に処理していくと、インデックスのズレによる「Object not found(オブジェクトが見つかりません)」エラーの温床になります。「コレクションを操作・削除するときは、後ろからループを回す」。これはVBAにおける普遍の真理です。
—
陥りやすいエラーと回避策
トラップ1: 「実行時エラー: オブジェクト変数または With ブロック変数が設定されていません」
- 原因: 演算によってすでに消滅したオブジェクトのメモリ参照を、そのまま次の行で使おうとしたときに発生します。
- 回避策: ループ内で `If Not targetShape Is Nothing Then` のように、オブジェクトが生きて存在するかを常に担保するガード節を挟みましょう。
トラップ2: 意図しない図形が結合されてしまう
- 原因: `ActiveSelection` に頼っていると、ユーザーが直前に触っていた選択状態がコードに混入し、意図しないパスが演算に巻き込まれます。
- 回避策: ユーザーの選択に頼らず、特定のレイヤーや特定の名前(`Shape.Name`)を指定して `ShapeRange` を構築する癖をつけましょう。
—
おわりに:ここをクリアすれば、CorelDRAW VBAはあなたのもの
いかがでしたでしょうか?
単なる「マクロの記録」の貼り付けでは決して辿り着けない、オブジェクトのライフサイクルを意識した堅牢なコードの組み方を知っていただけたかと思います。
大量のパスデータを一瞬で料理する自動化マクロが動いたときの爽快感は、エンジニアにとって最高の報酬です。ぜひご自身の開発環境でも試してみてください。
ここをクリアできれば、CorelDRAW VBAの基本はもうバッチリです。
あなたのデザインワークフローが、より知られざる高みへ到達することを応援しています!
