CorelDRAW VBAを掌握する極限の知見
【実務直結】アートボード外の「ゴミオブジェクト」をVBAで一網打尽にする堅牢なクリーンアップマクロの設計思想
デザインデータの最終工程、すなわち「入稿・納品」のフェーズにおいて、最もエンジニアを悩ませるのが「カンバス外に放置された意図しないゴミオブジェクト(Stray Points / 孤立点 / はみ出しデザイン)」だ。
手動によるクリーンアップは、レイヤーロックの解除忘れ、グループ化されたパスの内部への見落としなど、ヒューマンエラーの温床となる。これを完全自動化するのが本稿の目的である。
単に「画面からはみ出たものを消す」というロジックであれば誰でも書ける。しかし、CorelDRAWのドキュメント構造(ShapeRangeのライフサイクル、ActivePage、BoundingBoxの正確な算出)を理解していなければ、意図しないデータを破壊する「動く爆弾」になりかねない。
今回は、プロダクション環境(実務)でそのまま稼働できる、堅牢でエレガントなクリーンアップマクロの全貌を伝授する。
—
なぜ愚直な判定処理は失敗するのか?(CorelDRAW VBAの罠)
初心者が陥りがちなアンチパターンは、「全シェイプをループさせ、座標がページの幅・高さの外にあれば `Delete` メソッドを叩く」というアプローチだ。
これには以下の致命的な欠陥がある。
1. バウンディングボックスの基準違い: オブジェクトの回転や線の太さ(Outline)を含めるか否かで、判定境界が狂う。
2. グループ構造の破壊: グループ化された親がカンバス内に一部でもかかっている場合、子要素の座標だけで判定するとグループが崩壊する。
3. アクティブレイヤーの制約: ロックされたレイヤーや非表示レイヤーに対して削除命令を発行すると、VBAのランタイムエラー(Error 91など)を引き起こす。
我々は、「ページの描画領域(Page Width / Height)」を厳格な境界とし、完全に外側へ逸脱した孤立オブジェクト、または完全にエリア外にある不要なシェイプ群のみを安全に摘出する高度なフィルタリングロジックを構築しなければならない。
—
プロダクションコード:ゴミオブジェクト自動削除マクロ
以下のコードは、CorelDRAWの内部メモリ管理(Garbage Collectionとオブジェクト参照の解放)を意識し、大規模な入稿データでも一瞬で処理を完了させる最適化済みのVBAモジュールである。
Option Explicit
‘ ==============================================================================
‘ 処理名: カンバス外ゴミオブジェクト一掃クリーンアップマクロ
‘ 概要: アクティブページのドキュメント境界を基準に、完全に外側にある
‘ 孤立点および不要なシェイプを安全に検知・削除します。
‘ ==============================================================================
Public Sub CleanupOutofBoundsObjects()
‘ 1. アプリケーションのパフォーマンスを最大化するための環境最適化
EventsEnabled = False
Optimization = True
ActiveDocument.BeginCommandGroup “カンバス外クリーンアップ”
On Error GoTo ErrorHandler
Dim targetPage As Page
Set targetPage = ActivePage
‘ ページの物理寸法を取得 (単位はドキュメントのデフォルト設定に依存)
Dim pageWidth As Double, pageHeight As Double
pageWidth = targetPage.SizeWidth
pageHeight = targetPage.SizeHeight
Dim sh As Shape
Dim deletedCount As Long
deletedCount = 0
‘ 2. アクティブページの全シェイプを逆順ループで走査
‘ ※要素を削除する場合は、インデックスのズレを防ぐために必ず末尾から逆順(Count to 1)で回すこと
Dim i As Long
Dim totalShapes As Long
totalShapes = targetPage.Shapes.Count
If totalShapes = 0 Then
MsgBox “処理対象のシェイプが存在しません。”, vbInformation, “クリーンアップ完了”
GoTo ExitRoutine
End If
For i = totalShapes To 1 Step -1
Set sh = targetPage.Shapes(i)
‘ ロックされているレイヤーやシェイプはスキップ(安全性の確保)
If Not sh.Locked And Not sh.Layer.Locked And Not sh.Layer.Visible = False Then
‘ 3. 判定ロジック: シェイプのバウンディングボックスが完全にページ外にあるか検証
‘ CorelDRAWの座標系はデフォルトで左下隅が(0,0)
If IsShapeCompletelyOutside(sh, pageWidth, pageHeight) Then
sh.Delete
deletedCount = deletedCount + 1
End If
End If
Next i
‘ 4. 正常終了時のフィードバック
ActiveDocument.EndCommandGroup
Optimization = False
EventsEnabled = True
MsgBox “クリーンアップが完了しました。” & vbCrLf & _
“削除されたゴミオブジェクト数: ” & deletedCount & “件”, _
vbInformation, “CorelDRAW 自動最適化”
Exit Sub
ErrorHandler:
‘ 異常終了時のリカバリ処理
ActiveDocument.AbortCommandGroup
Optimization = False
EventsEnabled = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ ==============================================================================
‘ 関数名: IsShapeCompletelyOutside
‘ 概要: シェイプが完全にアートボード(ページ)の外側に存在するか判定
‘ ==============================================================================
Private Function IsShapeCompletelyOutside(sh As Shape, pw As Double, ph As Double) As Boolean
‘ デフォルトの初期値
IsShapeCompletelyOutside = False
‘ 孤立点(Stray Points / パスの制御点が極端に少ない等)の検出も兼ねる
‘ ここではバウンディングボックスの座標を検証
Dim left As Double, right As Double, top As Double, bottom As Double
left = sh.LeftX
right = sh.RightX
top = sh.TopY
bottom = sh.BottomY
‘ 判定条件:
‘ シェイプの右端がページの左端(0)より左、
‘ またはシェイプの左端がページの右端(pw)より右、
‘ またはシェイプの下端がページの上端(ph)より上(CorelDRAWのY軸は上がプラス)、
‘ またはシェイプの上端がページの下端(0)より下
If (right < 0) Or (left > pw) Or (top < 0) Or (bottom > ph) Then
IsShapeCompletelyOutside = True
End If
End Function
—
コードのアーキテクチャと実務上の重要ポイント
1. 描画イベントの抑制(`Optimization = True`)
CorelDRAW VBAにおいて、ループ内でシェイプを1つずつ `Delete` する処理は、デフォルトのままだと「画面の再描画(Redraw)」と「Undoスタックの構築」が都度走り、パフォーマンスが劇的に低下する。
冒頭の `Optimization = True` と `EventsEnabled = False` によって内部描画を完全にロックし、処理速度を最大で数十倍に跳ね上げている。この配慮がプロとアマを分ける境界線だ。
2. 逆順ループの鉄則(`Step -1`)
コレクション要素を削除する際、先頭(1)から順に回すと、要素が削除された瞬間にインデックスが繰り上がり、ループのカウンタが狂う(またはオーバーフローする)。
削除処理を伴うコレクション走査は、必ず「末尾から先頭へ(`Count to 1 Step -1`)」向かって処理するのがVBAにおける不文律の鉄則である。
3. 座標系の方向性(Y軸の罠)
一般的なWEBデザイン(CSS等)では左上が原点(0,0)だが、CorelDRAWのデフォルトページ座標系は「左下」が原点(0,0)であり、上方向に向かってY座標が増加する。
そのため、`top < 0`(ページの下端より下)や `bottom > ph`(ページの上端より上)という判定式になる。この仕様を見落とすと、ページ上の重要なデザインをごっそり消し去る大惨事になるため注意してほしい。
—
さらに実務を強固にするための拡張アイデア
もし、あなたのチームがクライアントからの雑多な入稿データを日常的に処理しているのであれば、上記のコードに以下の機能を拡張することを強く推奨する。
- ログ出力機能: 削除したオブジェクトの座標やバウンディングボックスのサイズをテキストファイル(CSV)に出力し、後から「何を消したか」をデザイナーが目視確認できるようにする。
- マージン設定(バッファ): 「カンバスギリギリにかかっている微小なゴミ」を安全マージン(例: 5mm外側)を持たせて一網打尽にするパラメータ化。
自動化とは、単に手作業を置き換えることではない。「人間の認知限界によるミスをシステムで完全にハザードフリーにする」ことこそが、チーフアーキテクトが担うべき設計思想である。ぜひ、あなたの現場のワークフローにこのコードを組み込み、生産性を極限まで高めてほしい。
