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

スポンサーリンク

CorelDRAW VBAを掌握せよ:バウンディングボックスの「狂い」を叩き直す、プロ仕様の強制リセット術

CorelDRAWでデザイン業務を長く続けていると、一度は経験するはずだ。「回転させたオブジェクトを選択した際、バウンディングボックス(選択枠)がオブジェクトに対して斜めになり、整列やサイズ調整が極端にやりづらくなる」という現象。

これに悩まされ、手作業で回転を戻し、また戻して……と繰り返すのは、エンジニアの流儀ではない。今回は、「狂ったバウンディングボックスを、一撃で本来の水平垂直座標系に焼き直す」という、実務の現場で最も求められる自動化コードを授ける。

なぜ「手作業」や「適当なマクロ」ではいけないのか?

初心者向けの解説でよくあるのが、`Shape.Rotation`を強引にリセットして終わり、という実装だ。だが、それではオブジェクトの「形状」そのものが崩壊する。

プロが意識すべきは、「座標変換行列(Transformation Matrix)の確定」だ。
CorelDRAWにおけるシェイプは、元の形状を保持したまま「回転・伸縮・スキュー」という変換情報を重ねて表示している。この変換情報をシェイプのパスそのものに適用し、変換情報を初期化(Identity化)する。これが、バウンディングボックスを強制リセットする唯一の「正解」である。

プロダクション品質のコード:`ResetShapeBoundingBox`

このコードは、現在選択中の全オブジェクトを対象に、現在の変形情報をパスに焼き付け、バウンディングボックスをゼロベースで再計算する。

Option Explicit

‘ ———————————————————
‘ @brief 選択された全オブジェクトの変形情報を確定し、
‘ バウンディングボックスを強制リセットする
‘ ———————————————————
Public Sub ResetSelectedBoundingBoxes()
Dim s As Shape
Dim sr As ShapeRange

‘ エラーハンドリング:選択物がない場合の暴走を防ぐ
If ActiveSelectionRange.Count = 0 Then
MsgBox “対象となるオブジェクトを選択してください。”, vbExclamation
Exit Sub
End If

‘ パフォーマンス向上のための最適化
Optimization = True
ActiveDocument.BeginCommandGroup “Reset Bounding Box”

Set sr = ActiveSelectionRange

For Each s In sr
‘ シェイプがグループや曲線の場合に備え、処理の安全性を確保
If Not s Is Nothing Then
‘ 【核心】ConvertToCurves経由での座標焼き付け
‘ 既にカーブであれば、回転情報を適用した状態で再定義する
s.ConvertToCurves

‘ オブジェクトの回転・変形をパスに適用し、
‘ Rotation 0, Scale 100% のクリーンな状態へ
s.Rotation = 0

‘ 必要に応じて、ここからさらに詳細なノード調整や
‘ 座標の微調整を組み込むことが可能
End If
Next s

ActiveDocument.EndCommandGroup
Optimization = False
ActiveWindow.Refresh
End Sub

コードの解説と「落とし穴」への対策

このコードには、実務で痛い目を見ないための設計思想が詰め込まれている。

1. `Optimization = True` の重要性:
CorelDRAWのVBAにおいて、画面の再描画は最大のボトルネックだ。大量のオブジェクトを処理する際、このフラグを立てないのは素人の所業。処理速度が数倍〜数十倍変わる。
2. `BeginCommandGroup` の活用:
これを囲うことで、マクロの全処理を「1つの操作」としてUndo(Ctrl+Z)可能にする。これがないと、マクロで失敗した際に、一つ一つのシェイプを手動で戻すという地獄が待っている。
3. `ConvertToCurves` の役割:
単に回転を戻すのではなく、変換行列をパスデータにマージする処理。これが「バウンディングボックスの強制リセット」の真の正体である。

次のステップ:運用上の注意点

このツールを導入する際、以下の点だけは現場のルールとして徹底してほしい。

  • テキストオブジェクトの扱い:

テキストオブジェクトに対してこの処理を行うと、編集可能な「テキストプロパティ」が失われ、ただの「曲線データ」に変換される。もしテキストを保持したい場合は、`If s.Type <> cdrTextShape Then` といった条件分岐でガードをかける必要がある。

  • グループ化:

グループ全体に回転がかかっている場合、まずはグループを解除するか、グループの階層を辿る再帰処理が必要だ。今回はシンプルに「単体シェイプのクリーンアップ」に特化しているが、複雑な階層構造を持つデータには別途カスタム関数を用意するのがエンジニアの責務だ。

最後に:自動化は「思考」の省略ではない

このマクロを導入することで、君たちの作業時間は短縮されるだろう。しかし、本来の目的は「時間を稼ぐこと」ではない。「バウンディングボックスの狂いという、デザインの本質とは関係のないノイズを排除し、クリエイティブな思考に集中できる環境を構築すること」にある。

VBAは、君たちの手足となり、CorelDRAWのポテンシャルを極限まで引き出すための武器だ。このコードをベースに、君たちの現場の作法に合わせてカスタマイズしていってほしい。

何かあればまた聞こう。コードは嘘をつかない。君が書いた分だけ、業務は洗練されていくはずだ。

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