【入門編】【初心者向け】ワンクリックでドキュメント内の全シェイプのバウンディングボックスを整列・強制リセットするマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

【脱・手作業】CorelDRAW VBAで全シェイプの「歪んだ境界線」を瞬時にリセットする方法

こんにちは。CorelDRAWの自動化の世界へようこそ。

現場で作業していると、こんな経験はありませんか?
「オブジェクトを回転させた後、バウンディングボックスが斜めになってしまい、整列コマンドが効かない…」
「グループ化や変形を繰り返すうちに、座標軸が狂ってレイアウトがズレていく…」

これらは、CorelDRAWのオブジェクトが持つ「変換行列(Transformation Matrix)」の蓄積によって起こる現象です。これを手動で一つずつ直すのは、プロの仕事ではありません。

今日は、VBAを使って「全シェイプのバウンディングボックスを強制的にリセット(正立)させる」魔法のようなスクリプトを一緒に作りましょう。これが理解できれば、あなたのCorelDRAW作業は自動化の第一歩を踏み出したことになります。

1. なぜ「リセット」が必要なのか?

CorelDRAWのシェイプには「回転」や「傾斜」の情報が数値として記録されています。しかし、複雑な編集を重ねると、この数値が複雑に絡み合い、整列コマンド(Ctrl+A→整列)などが意図した挙動をしなくなることがあります。

今回のマクロの目的は、「現在の見た目を維持したまま、回転・変形情報を初期化する」こと。いわば、オブジェクトに溜まった「重り」を捨てて、身軽にさせる作業です。

2. 実用コード:バウンディングボックス・リセットツール

まずは、何も考えずに以下のコードをVBAエディタ(`Alt + F11`)に貼り付けてみてください。

Sub ResetAllShapesBoundingBox()
Dim s As Shape
Dim sr As ShapeRange

‘ アクティブなドキュメントの全オブジェクトを取得
Set sr = ActivePage.Shapes.All

‘ エラー回避のため、グループ化されているものも一度バラす等の処理が必要だが
‘ 今回はシンプルに、各オブジェクトを一度「コピーして貼り付け」ることで
‘ 変換情報をリセットする「裏技」的な手法をとります。

Optimization = True ‘ 描画更新を止めて高速化(プロの定石)

For Each s In sr
‘ シェイプを一度コピーして、その場で貼り付けると
‘ 変換行列がリセットされた状態で生成されます
s.Copy
ActiveLayer.Paste

‘ 元のシェイプを削除
s.Delete
Next s

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

MsgBox “全シェイプのリセットが完了しました!”, vbInformation
End Sub

3. コードの「ここが肝」を解説

初心者の方が陥りやすいポイントを、エンジニアの視点で噛み砕きます。

① `Optimization = True` の魔法

CorelDRAW VBAにおいて、最もパフォーマンスを落とすのは「画面の再描画」です。数千個のオブジェクトをループする際、いちいち画面を更新していると、マクロが終わるまでコーヒーを飲んで待つことになります。これを `True` にすることで、劇的に高速化します。

② なぜ「コピー&ペースト」なのか?

CorelDRAWのAPIには「バウンディングボックスを強制的に正規化する」という直接的なメソッドはありません。しかし、オブジェクトを一度クリップボード経由(あるいは内部コピー)で再生成すると、CorelDRAWは内部的にそのオブジェクトの「正位置」を再計算します。これが、現場で最も安定してバグを回避できる手法です。

③ 陥りやすい罠:`For Each` ループ

`For Each` を使っているときにオブジェクトを削除すると、次に処理すべきリストが狂うことがあります。今回は `Shapes.All` を先に取得してリスト化しているので安全ですが、複雑な条件分岐を入れるときは `For i = sr.Count To 1 Step -1` のように「後ろから処理する」のが鉄則です。覚えておいてください。

4. さあ、次のステップへ

このコードを動かせたなら、あなたはもうマクロの記録(レコーディング)に頼るだけの初心者ではありません。

  • 応用編: 特定のレイヤーにあるものだけ処理したい場合は?
  • 発展編: 変換行列を直接操作して、特定の角度だけ補正したい場合は?

CorelDRAWのVBAには、無限の可能性があります。今回作ったコードは、いわばあなたの「自動化エンジン」の最初の部品です。これをベースに、自分だけの便利なツールへと育てていってください。

もし「もっと複雑なグループの中身まで処理したい」といった要望があれば、いつでも聞いてください。設計図から一緒に書き直しましょう。

あなたのクリエイティブな時間が、退屈な手作業から解放されることを願っています!

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