こんにちは!CorelDRAWの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんとなく操作を再現する」というステージは、もう卒業しましたね。おめでとうございます。ここからは、VBA(Visual Basic for Applications)のコードを自分の手で操り、何百個ものデザインデータを一瞬で料理する「真のエンジニア」への階段を登ります。
今回は、実務で最もリソースを食い潰し、多くのエンジニアを悩ませる「ブール演算(結合・トリム・溶接)」のバッチ処理による高速化をテーマにお届けします。
ここをクリアすれば、CorelDRAW VBAのパフォーマンスの癖や、オブジェクトのライフサイクルが見えてきますよ。さあ、一緒に極限の知見に触れていきましょう!
—
なぜ、ブール演算のバッチ処理は重いのか?
CorelDRAWで「溶接(Weld)」「トリム(Trim)」「結合(Intersect)」を実行するとき、裏側では何が起きているでしょうか?
これらは単なる座標の計算ではなく、ベクターのパス(ノードとセグメント)を再計算し、新しい閉じられたパスを生成するという、CPUに非常に負荷がかかる幾何学演算です。
画面(GUI)が表示された状態でこれを大量にループさせると、次のような悲劇が起きます。
1. 画面の再描画(Redraw)が毎回走り、CPUとメモリがパンクする
2. オブジェクトの選択状態(`ActiveSelection`)に依存したコードを書き、予期せぬエラーが出る
3. メモリリークを起こし、CorelDRAWごと強制終了する
「1000個のデザインを一括処理しようとしたら、途中でフリーズした……」なんて経験はありませんか? それはあなたのコードが悪いのではなく、CorelDRAWの「作法」を知らなかっただけなのです。
—
爆速バッチ処理を実現する「3つの鉄則」
大量のシェイプを変形させる自動化フローを構築するためには、以下の3つの鉄則を絶対に守ってください。これこそが、世界最高峰の現場で使われている知見です。
1. 画面描画の完全停止(ScreenUpdatingの無効化)
VBAが実行中の画面を書き換えるたびに、CorelDRAWは重いレンダリング処理を行います。これを止めます。処理が終わるまで画面を「目隠し」するイメージです。
2. イベント通知の抑制(EventsEnabledの無効化)
ドキュメントの変更に伴う内部イベントの発生を抑え、処理速度を極限まで引き上げます。
3. アクティブ選択への依存を断つ(オブジェクト参照の直接指定)
「画面上で選択しているシェイプ」を操作するのではなく、メモリ上のオブジェクト変数(`Shape`オブジェクト)を直接指して演算メソッドを叩きます。これ鉄則です。
—
実践!高速ブール演算バッチ処理コード
それでは、実務でそのまま使えるサンプルコードを公開します。
このコードは、アクティブなページにある特定のグループに対して、一括で「溶接(Weld)」をかけまくるスクリプトです。
Sub HighSpeedWeldBatch()
Dim startTime As Double
startTime = Timer ‘ パフォーマンス計測用
‘ 【鉄則1 & 2】画面描画とイベントを停止し、処理速度を爆発的に上げる
ActiveDocument.BeginCommandGroup “高速溶接バッチ処理”
Application.Optimization = True
ActiveDocument.Settings.Save
ActiveDocument.Settings.GridSnap = False
ActiveDocument.Settings.SnapToObjects = False
On Error GoTo ErrorHandler ‘ エラー時の復旧用トラップ
Dim srTarget As ShapeRange
Dim shTarget As Shape
Dim shWelded As Shape
‘ 処理対象となるシェイプのレンジを取得(例:レイヤー上のすべての曲線)
‘ ※実際の運用では、特定のレイヤーや条件に絞り込んでください
Set srTarget = ActivePage.Shapes.FindShapes(Type:=cdrCurveShape)
If srTarget.Count < 2 Then MsgBox "処理に必要なシェイプが不足しています。", vbExclamation GoTo ExitRoutine End If Dim processedCount As Long processedCount = 0 ' ループ処理の開始 ' ここでは解説のため「2つずつペアにして溶接する」ロジックにします Dim i As Long For i = 1 To srTarget.Count - 1 Step 2 Dim sh1 As Shape, sh2 As Shape Set sh1 = srTarget(i) Set sh2 = srTarget(i + 1) ' 【鉄則3】ActiveSelectionを使わず、メソッドの戻り値としてシェイプを受け取る ' Weldメソッドは「元オブジェクトを消去して新しいシェイプを返す」挙動をします If Not sh1 Is Nothing And Not sh2 Is Nothing Then Set shWelded = sh1.Weld(sh2, CorelDRAW.cdr WeldKeepTarget, CorelDRAW.cdrWeldKeepTarget) processedCount = processedCount + 1 End If Next i ExitRoutine: ' 【重要】設定を必ず元の状態に戻す(これを忘れるとCorelDRAWの挙動がおかしくなります) ActiveDocument.Settings.Restore Application.Optimization = False ActiveDocument.EndCommandGroup ' 画面の強制再描画 ActiveWindow.Refresh MsgBox "バッチ処理が完了しました!" & vbCrLf & _ "処理ペア数: " & processedCount & vbCrLf & _ "実行時間: " & Format(Timer - startTime, "0.00秒"), vbInformation Exit Sub ErrorHandler: MsgBox "エラーが発生しました: " & Err.Description, vbCritical Resume ExitRoutine End Sub ---
コードの解説:なぜこの書き方が「最強」なのか?
`Application.Optimization = True` の魔力
この1行こそが、CorelDRAW VBAのパフォーマンスチューニングの核心です。画面の更新やUIの再構築を完全にシャットダウンし、純粋な演算処理にCPUパワーを集中させます。
メソッドの戻り値を受け取る理由
`sh1.Weld(sh2, …)` を実行したとき、VBA初学者は「溶接された結果はどうやって選べばいいの?」と迷いがちです。
CorelDRAWのブール演算メソッドは、演算結果として新しく生成されたシェイプそのものを返します。そのため、`Set shWelded = …` のように変数でしっかりと受け取ることが、メモリ管理(オブジェクトのライフサイクル管理)において極めて重要になります。これを怠ると、メモリ上にゴミ(ゾンビオブジェクト)が残り、動作が不安定になります。
`Optimization = False` のし忘れに注意!
エラーハンドラ(`ErrorHandler`)を用意しているのはそのためです。もし処理途中でエラーが発生してコードが中断したとき、`Optimization = True` のまま放置されると、CorelDRAWの画面が一切更新されなくなってしまいます。必ず `Restore` とセットで元の状態に戻すガードを組み込みましょう。
—
陥りやすいエラーと対策
1. 「オブジェクトが見つかりません (Error 91)」
- 原因: 溶接やトリムの対象となったシェイプが、演算の過程でメモリから消去されたにもかかわらず、再度その変数を操作しようとした場合におきます。
- 対策: ブール演算を行った後は、古いシェイプ変数を参照せず、戻り値として得た新しいシェイプ変数のみを扱うようにコードを構造化してください。
2. 処理が途中で止まる(または固まる)
- 原因: 不正なパス(自己交差している複雑すぎるパスや、ノードが壊れたパス)に対してブール演算を強行すると、CorelDRAWの演算エンジンが無限ループに近い状態に陥ることがあります。
- 対策: ループの前に `sh.Valid` プロパティなどでシェイプが破損していないか簡易チェックを入れる、あるいは `On Error Resume Next` で例外をハンドリングするなどの防御的プログラミングを取り入れましょう。
—
まとめ
今回は、大量のベクターデータに対するブール演算を高速化するための実務ノウハウを解説しました。
- 画面描画とイベントを止める (`Optimization = True`)
- 画面選択に頼らず、オブジェクト変数を直接操作する
- ブール演算の戻り値(新しいシェイプ)を確実に変数で受け取る
この3つをマスターすれば、もう重いデータ処理に怯える必要はありません。あなたのPCは、最強のデザイン自動化マシンへと生まれ変わります。
ここをクリアしたあなたなら、CorelDRAW VBAの基本はもうバッチリです。ぜひ明日からの実務コードに応用し、圧倒的な作業効率を手に入れてくださいね。それでは、次の自動化の旅でお会いしましょう!
