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のポテンシャルを極限まで引き出すための武器だ。このコードをベースに、君たちの現場の作法に合わせてカスタマイズしていってほしい。
何かあればまた聞こう。コードは嘘をつかない。君が書いた分だけ、業務は洗練されていくはずだ。
