【実務・中級編】【初心者向け】Shapeオブジェクトの基本プロパティ(Left, Top, Width, Height)を使った位置・サイズ変更の基礎 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握せよ:座標とサイズを支配する「Shapeオブジェクト」の真実

CorelDRAWの自動化において、`Shape`オブジェクトの座標(Left, Top)とサイズ(Width, Height)を制御することは、呼吸をするのと同じくらい基本的なことだ。しかし、多くの初学者がここで「なぜか位置がズレる」「単位が混ざって計算が狂う」という泥沼にはまる。

今日は、小手先のテクニックではなく、「CorelDRAWの内部座標系」を理解し、どんな図形も意のままに操るための堅牢な設計論を伝授する。

1. なぜ「単純な代入」だけでは不十分なのか

初心者は、単に `.Left = 10` と書けば済むと思いがちだ。だが、現場のコードにおいてそれは「脆弱性の温床」である。

CorelDRAWのプロパティ操作には、以下の3つの落とし穴が存在する。

1. 参照点の罠: `Left`や`Top`は、オブジェクトの「バウンディングボックスの左下」を基準にするのがデフォルトだが、ドキュメントの設定や描画モードによって振る舞いが変わることがある。
2. 単位系(Unit)の不整合: ユーザーの設定がミリメートルなのかインチなのかで、VBA上の数値の解釈が変わる。
3. Undo(取り消し)の管理: 100個の図形をループで動かすとき、1回ずつ処理を分けるとUndoスタックが爆発し、動作が極端に遅くなる。

これらを解決するための、プロダクションレベルの「作法」を以下に示す。

2. 【実戦的】堅牢なShape制御テンプレート

以下のコードは、選択した図形を任意の座標に「正確に」配置し、サイズを変更するプロトタイプだ。実務では、この構造を関数化して使い回す。

‘ ———————————————————
‘ 選択された図形を、指定された座標とサイズに強制配置する
‘ ———————————————————
Sub ReAlignSelectedShape()
Dim s As Shape
Dim doc As Document

‘ 1. ドキュメントの状態を保護(最適化の第一歩)
Set doc = ActiveDocument
doc.BeginCommandGroup “SafeMoveAndResize” ‘ Undoを一つにまとめる

On Error GoTo Cleanup

‘ 選択オブジェクトの検証
If doc.Selection.Count = 0 Then
MsgBox “対象を選択してください。”, vbCritical
Exit Sub
End If

‘ 2. 単位を「ミリメートル」に固定して計算する(ここが重要)
Dim originalUnit As cdrUnit
originalUnit = doc.Unit
doc.Unit = cdrMillimeter

For Each s In doc.Selection
‘ 3. 絶対座標での配置とサイズ変更
‘ SetSizeやSetPositionではなく、直接プロパティを叩く方が制御しやすい
With s
.SetSize 50, 30 ‘ 幅50mm, 高さ30mmに固定
.SetPosition 100, 200 ‘ 座標(100, 200)へ移動
End With
Next s

Cleanup:
‘ 4. 後始末:単位を戻し、Undoグループを閉じる
doc.Unit = originalUnit
doc.EndCommandGroup

If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
End Sub

3. なぜこの書き方が「プロ」のコードなのか

① `BeginCommandGroup` によるトランザクション制御

CorelDRAW VBAにおいて、大量の図形操作を行う際にこれを忘れると、ユーザーが「Ctrl+Z」を押した瞬間に、プログラムが実行した数千回の処理が一つずつ解除される地獄を見る。`Begin/EndCommandGroup`で囲むことは、コードの信頼性そのものだ。

② 単位系(Unit)の明示的指定

`doc.Unit = cdrMillimeter` を明示することで、ユーザーが「インチ」や「ポイント」で作業していても、コードが予期せぬ挙動をすることを防ぐ。環境依存をコード側で排除する。これが自動化エンジニアの鉄則だ。

③ エラーハンドリングの徹底

「選択がないのに実行する」「グループ化された図形に予期せぬ操作をする」といったトラブルに対し、`On Error GoTo` で安全に終了させる。現場で動くツールは、「壊れない」ことが「速い」ことよりも重要なのだ。

4. 次のステップ:データベースとの連携を見据えて

この基礎をマスターすれば、次は外部CSVやExcelからのデータ流し込みが可能になる。その際、位置情報をデータベース側で管理する際は、常に「ページ内の絶対座標」で計算し、`Shape.SetPosition`で叩き込む設計にすること。

座標計算において、浮動小数点誤差を避けるために `Round(value, 3)` で丸めるなど、数値精度の管理も忘れてはならない。

最後に。
コードを書くことは、CorelDRAWの操作を「記録」することではない。「再現可能な論理」として定義することだ。まずはこのテンプレートをコピペし、手持ちのルーチンワークを一つずつ自動化し、自分の武器にしてみてほしい。

君の自動化ライフが、より創造的で実りあるものになることを期待している。

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