CorelDRAW VBAで「はみ出し」を瞬時に撃退!プロの現場で役立つ自動判定ロジックをマスターしよう
こんにちは。自動化の世界へようこそ。
CorelDRAWでデザインをしていると、アートボード(ページ)の外側に「作業用の残骸」や「塗り足しに隠れた意図しないオブジェクト」が残ってしまうことはありませんか?
これ、印刷入稿の現場では「データ汚染」として扱われる重大なミスです。一つひとつ手作業で探すのは時間の無駄。今日は、VBAを使って「ページ外にはみ出した奴らを一網打尽にする」という、実用性抜群のツールを作りましょう。
マクロの記録から一歩踏み出し、コードでCorelDRAWを支配する感覚を一緒に味わいましょう!
—
1. なぜ「座標」を理解することが重要なのか?
CorelDRAW VBAにおいて、最も強力な武器は「オブジェクトの座標をプログラムで制御できること」です。
すべてのオブジェクトは、以下の4つの値をプロパティとして持っています。
- `LeftX`:左端のX座標
- `RightX`:右端のX座標
- `TopY`:上端のY座標
- `BottomY`:下端のY座標
ページ(アートボード)のサイズは `ActivePage.SizeWidth` と `ActivePage.SizeHeight` で取得できます。つまり、「オブジェクトの端っこが、ページの範囲外にあるかどうか」を比較するだけで、判定は完了します。
—
2. 実装コード:はみ出し検知マクロ
以下のコードをVBAエディタにコピー&ペーストしてください。
Sub SelectOutofPageObjects()
‘ 描画されているすべてのオブジェクトを走査するための変数
Dim shp As Shape
Dim pageW As Double, pageH As Double
Dim outCount As Integer
‘ 現在のアクティブページのサイズを取得
pageW = ActivePage.SizeWidth
pageH = ActivePage.SizeHeight
‘ 選択状態を一度解除(初期化)
ActiveDocument.ClearSelection
outCount = 0
‘ ページ内の全オブジェクトをループでチェック
For Each shp In ActivePage.FindShapes()
‘ 判定ロジック:座標がページの範囲(0~幅、0~高さ)を逸脱しているか
If shp.LeftX < 0 Or shp.RightX > pageW Or _
shp.BottomY < 0 Or shp.TopY > pageH Then
‘ はみ出している場合、そのオブジェクトを選択状態にする
shp.AddToSelection
outCount = outCount + 1
End If
Next shp
‘ 結果報告
If outCount > 0 Then
MsgBox outCount & ” 個のオブジェクトがページ外にはみ出しています!確認してください。”, vbExclamation
Else
MsgBox “素晴らしい!ページ外にはみ出したオブジェクトはありません。”, vbInformation
End If
End Sub
—
3. コードのポイントを深掘りする
このコードが「なぜ動くのか」、初心者が躓きやすいポイントを解説します。
- `ActivePage.FindShapes()` の魔法
`ActivePage`上の全オブジェクトを拾い上げる最強のメソッドです。これを使えば、グループ化されたオブジェクトも個別に判定できます。
- `AddToSelection` が肝!
`Select` を使うと「最後に触れたものだけ」が選択されますが、`AddToSelection` を使うと「現在選択されているものに、さらに追加する」ことができます。これにより、見つかったオブジェクトをどんどんまとめて選択できるのです。
- 座標系の罠(注意点)
CorelDRAWの座標系はデフォルトで「左下が原点(0,0)」です。もしご自身の環境で座標がズレる場合は、ドキュメントの「定規の原点」設定を確認してくださいね。
—
4. 初心者が陥りやすいエラーと対策
Q: 「オブジェクトが一つも選択されません」と言われる
A: `ActivePage.FindShapes()` は、現在アクティブなページにあるものしか見ません。もしオブジェクトが「デスクトップ(ページ外の作業領域)」に置かれている場合、そもそも `ActivePage` の管理下から外れていることがあります。
そんな時は `ActiveLayer.Shapes.All` を使うと、ページ外も含めた全オブジェクトを対象にできます。必要に応じて使い分けましょう。
Q: グループ化されていると判定が狂う?
A: 上記コードは「グループ全体」の外形線で判定します。グループ内の「一部のパーツだけがはみ出している」場合でも、グループ全体が選択されるようになっています。現場ではこれで十分なことが多いですが、より厳密にやりたい場合は `shp.Ungroup` して再計算させるような高度なロジックも組めます。
—
最後に:ここをクリアすれば、あなたはもう中級者です
今回紹介した「座標計算」と「ループ処理」は、CorelDRAW自動化の基礎の基礎です。これができるだけで、以下のような応用が無限に広がります。
1. 自動整列: はみ出したものを、座標を強制的に 0,0 に移動させる。
2. 自動レイヤー分け: 印刷用のオブジェクトだけを特定のレイヤーに移動させる。
3. プリフライト: 保存時に自動でこのマクロを走らせ、エラーがある場合は保存をキャンセルする。
「面倒な作業」を「コードで解決する」。この感覚を掴めば、あなたのデザイン業務は劇的に速くなります。ぜひ、明日からの業務にこのコードを組み込んでみてください!
また、分からないことがあればいつでも聞いてくださいね。あなたのエンジニアライフを全力で応援しています。
