CorelDRAW VBAを掌握する極限の知見へようこそ。
開発プロジェクトのリーダーである私だ。
業務自動化の現場において、ベクターオブジェクトの座標をプログラムから正確に把握することは、すべての自動化プロセスの基礎となる。レイアウトの動的生成、面付(インポジション)、他システムとの連携、あるいは品質検査に至るまで、オブジェクトの「位置とサイズ」を制する者がCorelDRAW自動化を制するといっても過言ではない。
今回は、選択中のベクターオブジェクトからバウンディングボックス(境界ボックス)の座標を取得し、イミディエイトウィンドウに出力する基本コードを題材に、「なぜこの書き方が必要なのか」「現場でバグを起こさないための堅牢な設計とは何か」をロジカルかつシャープに伝授しよう。
—
1. 初心者が陥る罠:なぜ「ただ取得するだけ」のコードは実務で破綻するのか?
ネット上の散在するサンプルコードを見て、以下のようなコードを書いていないだろうか?
‘ 【悪例】エラーハンドリングもオブジェクトの存在確認もない危険なコード
Sub BadExample()
Dim s As Shape
Set s = ActiveShape
Debug.Print s.LeftX, s.TopY, s.Width, s.Height
End Sub
このコードは、玩具のスクリプトとしては機能するかもしれないが、実務の現場では一瞬でワークフローをクラッシュさせる爆弾となる。理由は以下の3点だ。
1. 何も選択されていない場合のヌル参照エラー: ユーザーが何も選択せずに実行した瞬間、`ActiveShape` は Nothing を返し、次の行でランタイムエラー(オブジェクト変数が設定されていません)が発生する。
2. 複数選択時のスルー: `ActiveShape` は「最後に選択した1つのシェイプ」しか取得しない。複数選択されている場合、意図したバウンディングボックスが取れない。
3. グループや特殊オブジェクトの挙動: CorelDRAWの座標系は、デフォルトで画面左下を原点(0,0)とする数学的座標系をとる。これを理解していないと、DTPの現場で致命的な位置ズレを引き起こす。
プロのエンジニアであれば、「何が選択されていなくても怒られず、単一でも複数でも正しく計算し、ドキュメントの安全性を担保できるコード」を書かねばならない。
—
2. 堅牢なバウンディングボックス取得のプロダクションコード
それでは、実務の現場でそのままコピペして使える、極限まで最適化されたプロダクションコードを提示しよう。
‘ ==============================================================================
‘ Module: 選択オブジェクトのバウンディングボックス座標取得ツール
‘ 概要: 選択中のシェイプ(単一・複数)の境界ボックス座標を計算し、
‘ イミディエイトウィンドウに正確に出力する。
‘ ==============================================================================
Public Sub LogSelectedObjectBoundingBox()
‘ 1. ドキュメントが開かれているか厳格にチェック
If ActiveDocument Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “CorelDRAW自動化エラー”
Exit Sub
End If
‘ 2. 選択オブジェクトの存在チェック
Dim sr As ShapeRange
Set sr = ActiveSelectionRange
If sr.Count = 0 Then
MsgBox “対象となるベクターオブジェクトが選択されていません。”, vbExclamation, “座標取得”
Exit Sub
End If
‘ 3. 複数選択を考慮した統合バウンディングボックスの取得
‘ ActiveSelectionRange.BoundingBox を使うことで、
‘ 選択された全オブジェクトを包括する最小の矩形座標が一撃で取得できる。
Dim bLeft As Double, bTop As Double, bRight As Double, bBottom As Double
Dim bWidth As Double, bHeight As Double
‘ 選択範囲全体の境界座標を変数に格納
bLeft = sr.LeftX
bTop = sr.TopY
bRight = sr.RightX
bBottom = sr.BottomY
bWidth = sr.Width
bHeight = sr.Height
‘ 4. イミディエイトウィンドウへの構造化ログ出力
Debug.Print “————————————————–”
Debug.Print “【CorelDRAW 座標解析ログ】”
Debug.Print “選択オブジェクト数 : ” & sr.Count & ” 個”
Debug.Print “————————————————–”
Debug.Print “左端 (LeftX) : ” & Format(bLeft, “0.00”) & ” mm”
Debug.Print “上端 (TopY) : ” & Format(bTop, “0.00”) & ” mm”
Debug.Print “右端 (RightX) : ” & Format(bRight, “0.00”) & ” mm”
Debug.Print “下端 (BottomY) : ” & Format(bBottom, “0.00”) & ” mm”
Debug.Print “————————————————–”
Debug.Print “幅 (Width) : ” & Format(bWidth, “0.00”) & ” mm”
Debug.Print “高さ (Height) : ” & Format(bHeight, “0.00”) & ” mm”
Debug.Print “————————————————–”
‘ 5. 完了のトーストメッセージ(開発時の確認用)
‘ 実務ではログ出力のみで完結させる場合はコメントアウトすること
MsgBox “座標の取得が完了しました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbInformation, “処理成功”
End Sub
—
3. コードのアーキテクチャ解説:なぜこの構造なのか?
① `ShapeRange` と `ActiveSelectionRange` の活用
単一のオブジェクトを指す `ActiveShape` ではなく、常に `ActiveSelectionRange` を使用するのがプロの作法だ。
CorelDRAWにおいて、ユーザーが1つのオブジェクトを選択している場合でも、`ActiveSelectionRange` は1つの要素を持つコレクションとして安全に機能する。これにより、「単一選択か複数選択か」を条件分岐で書き分ける無駄なコードを書く必要がなくなる。
② プロパティの選定:`BoundingBox` の強力な恩恵
`sr.LeftX`, `sr.TopY` などのプロパティを `ShapeRange` に対して呼び出すと、CorelDRAWの内部エンジンは「選択されているすべてのオブジェクトを囲む外接矩形(Bounding Box)」の座標を自動計算して返してくれる。
これにより、複雑なグループやバラバラのパス群であっても、一発で全体の外枠座標を割り出すことが可能になる。
③ 単位系と精度の担保
CorelDRAWのVBAは、デフォルトでドキュメントの現在の単位系(ミリメートル、インチ、ピクセルなど)に依存する。ログ出力時に `Format(…, “0.00”)` を通しているのは、浮動小数点演算の誤差による「見た目の汚さ(例: `100.0000000001 mm`)」を排除し、他システム(CSVやデータベース)へ連携する際のデータクレンジングを見据えた実務的な配慮である。
—
4. ファイル・データベース連携への発展と実務上の注意点
このコードで取得したバウンディングボックスの座標(Left, Top, Width, Height)は、単にイミディエイトウィンドウに表示して終わりではない。ここから業務自動化の真価が始まる。
- CSV / JSON書き出し: 取得した座標をテキストファイルとして出力し、外部のレーザーカッターや自動切断機、あるいはECサイトの画像生成AIのトリミング指示データとして連携する。
- データベース(SQL Server / SQLiteなど)連携: ADO (ActiveX Data Objects) を用いて、どのデザインアセットがどの座標に配置されているかをDBにログとして蓄積し、版管理の完全自動化を実現する。
【注意点:CorelDRAWの座標系の罠】
CorelDRAWは、デフォルトで左下原点(数学的デカルト座標系)を採用している。しかし、印刷業界や一般的なDTP、あるいはWebのUIデザイン(左上原点)とはY軸の向きが逆転している。
もし外部システム(特にWeb系やPDFライブラリ)と座標を連携させる場合は、ページの高さ(`ActivePage.SizeHeight`)を基準にしたY軸の反転計算が必要になることを忘れないでほしい。
—
総括
オブジェクトのバウンディングボックス取得は、CorelDRAW VBA自動化の「最も基本にして最も重要なパスポート」である。
今回伝授した「エラーを完全に潰す防御的コードの組み方」と「ShapeRangeによるスマートな一括処理」を血肉に変えれば、あなたの作るツールは現場のオペレーターから絶大な信頼を得るはずだ。
妥協のない設計で、真の業務効率化を成し遂げたまえ。
