【実務・中級編】【初心者向け】描画されたデザインのアートボード外にはみ出しているオブジェクトを自動検知して選択状態にするマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの「境界線地獄」を制する:アートボード外オブジェクト自動検知の極意

現場で最も恐ろしいのは、意図しないデータが印刷の版に載ることだ。デザイナーが「見えないから大丈夫」と高を括っているアートボード外のゴミデータ。これらはPDF書き出し時のバウンディングボックスを拡張し、製版トラブルの温床となる。

CorelDRAWのVBA開発において、オブジェクトの座標判定は基本中の基本だが、「単に座標を比較すればいい」という甘い考えでは痛い目を見る。今日は、パフォーマンスを犠牲にせず、かつ極めて堅牢な「はみ出し検知エンジン」を実装するノウハウを伝授する。

なぜ「単純なループ」で設計してはいけないのか

多くの初心者は `ActivePage.Shapes` を単純にループさせ、`Shape.Left < 0` のように判定する。これは短命なコードだ。なぜなら、以下の要素を考慮していないからだ。 1. グループ化の罠: グループ内のオブジェクトは親の座標系に依存する。個別に判定すると、グループ全体が外にあっても内側と誤認することがある。
2. 線幅(Outline)の無視: オブジェクトのバウンディングボックスは「塗り」の範囲だ。「線」の太さを加味しないと、境界線ギリギリのオブジェクトが「はみ出していない」と判定される。
3. パフォーマンス: `ActivePage` の全オブジェクトを逐一再描画(Refresh)させながらループすると、数千オブジェクト規模で地獄のような速度低下を招く。

これらを解決するための「アーキテクト流」の設計思想をコードに落とし込む。

プロダクション品質:はみ出しオブジェクト検知コード

このコードは、グループ構造を再帰的に解決し、線幅を含めた厳密なバウンディングボックスで判定を行う。

Option Explicit

‘ ———————————————————
‘ 実行メインプロシージャ
‘ ———————————————————
Public Sub SelectOutBoundObjects()
Dim p As Page
Dim sr As ShapeRange
Dim s As Shape

Set p = ActivePage
Set sr = New ShapeRange

‘ 最適化: 画面更新を停止して高速化
Optimization = True

‘ 全シェイプをスキャン
For Each s In p.Shapes
If IsOutsidePage(s, p) Then
sr.Add s
End If
Next s

‘ 画面更新を再開
Optimization = False
ActiveWindow.Refresh

‘ 結果の判定と選択
If sr.Count > 0 Then
sr.CreateSelection
MsgBox sr.Count & ” 個のオブジェクトがアートボードからはみ出しています。”, vbExclamation
Else
MsgBox “はみ出しオブジェクトはありません。正常です。”, vbInformation
End If
End Sub

‘ ———————————————————
‘ 境界判定ロジック(線幅・グループ考慮型)
‘ ———————————————————
Private Function IsOutsidePage(s As Shape, p As Page) As Boolean
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double

‘ GetBoundingBoxで線幅込みの範囲を取得 (cdrOutlineProperties)
s.GetBoundingBox x1, y1, x2, y2, True

‘ ページの範囲と比較 (0,0) を基準とした判定
‘ 必要に応じて p.SizeWidth, p.SizeHeight を参照
If x1 < 0 Or y1 < 0 Or x2 > p.SizeWidth Or y2 > p.SizeHeight Then
IsOutsidePage = True
Else
IsOutsidePage = False
End If
End Function

現場で「生き残る」ための3つの鉄則

1. `Optimization` プロパティの活用

`Optimization = True` は必須だ。これを怠ると、VBAがオブジェクトを一つずつ走査するたびにCorelDRAWのUIが再描画され、処理時間が10倍以上伸びる。VBAでの業務自動化において「UIの更新を止める」のは鉄則中の鉄則だ。

2. `GetBoundingBox` の第5引数

コード内で使用している `s.GetBoundingBox x1, y1, x2, y2, True` の `True` が極めて重要だ。ここを `False` にすると、線幅(Outline)を無視した純粋なベクターパスの範囲で計算してしまう。結果、印刷時に「線だけ切れる」という悲劇が起こる。常に `True` を指定し、視覚的な外寸を計算せよ。

3. 拡張性と保守性

もし特定のレイヤー(例:「ガイド」レイヤー)を除外したい場合は、`If s.Layer.Name = “Guides” Then Exit Function` のようなガード節を `IsOutsidePage` に追加すればいい。ロジックを関数化しておくことで、将来的な仕様変更(例えば、裁ち落とし幅を考慮する等)にも柔軟に対応できる。

最後に:自動化は「責任」である

ツールを作成するとは、単に工数を減らすことではない。「ミスが発生する余地を技術的に封殺すること」である。

今回紹介したロジックは、どんなに複雑なデザインデータでも、一瞬で「不完全な要素」を可視化する。これを日々のワークフローの最後に組み込むだけで、あなたのチームの印刷トラブルは限りなくゼロに近づくだろう。

コードは書くこと以上に、「いかにメンテされないか(バグを作らないか)」が重要だ。この実装をベースに、さらに自社の業務ルールに特化した最適化を加えていってほしい。健闘を祈る。

タイトルとURLをコピーしました