【実務・中級編】【動的ドキュメント変換】Page.SetSizeを用いたカスタムサイズへのページ変更と印刷用余白の自動アジャスト – CorelDRAW VBA解析バイブル

スポンサーリンク

【CorelDRAW VBA】ページサイズ動的変換の深淵:実務で泣かないための「オブジェクト一括リサイズ」設計論

CorelDRAWの自動化において、最も頻繁に遭遇する要件の一つが「ページサイズの動的変更」だ。しかし、多くの開発者がここで躓く。「サイズを変えたら中のレイアウトが崩れた」「グループ化されているオブジェクトが意図せず変形した」といった不具合は、APIの表面しか叩いていないから起きる必然的な現象に過ぎない。

今日は、CorelDRAWのオブジェクトモデルを掌握し、「いかなるデータ構造でも確実に追従する」ための、実務直結型の設計思想とコードを伝授する。

1. なぜ「Page.SetSize」だけでは不十分なのか

初心者は `ActivePage.SetSize` を呼べば解決すると思いがちだ。だが、それはあくまで「台紙」を差し替える行為に過ぎない。現実の業務では、以下の制約をクリアしなければならない。

  • グループと曲線データの整合性: グループ化されたオブジェクトに対し、個別にサイズ計算を適用すると座標がズレる。
  • 基準点の保持: センタリングの際、何を基準にするか(ページ中心か、選択範囲の中心か)。
  • Undoスタックの管理: 大量のオブジェクトを操作する際、ユーザーが「Ctrl+Z」で戻れる単位を制御しなければ、ツールとしての品質は低いと見なされる。

我々エンジニアが目指すべきは、「オブジェクトの階層構造を破壊せず、数学的に正確な再配置」を行うことである。

2. プロダクションコード:堅牢なリサイズ処理の雛形

このコードは、指定したマージンを確保しつつ、全オブジェクトをページ内に収めるための「CorelDRAW VBAの正解」に近い構造だ。

Option Explicit

‘ ページリサイズとオブジェクト適合を行うメイン関数
Public Sub AdjustPageToDesign(newWidth As Double, newHeight As Double, margin As Double)
Dim doc As Document
Set doc = ActiveDocument

‘ 1. 処理の高速化とUndoの管理
doc.BeginCommandGroup “Resize and Center”
On Error GoTo Cleanup

Dim p As Page
Set p = doc.ActivePage

‘ 2. ページサイズ変更
p.SetSize newWidth, newHeight

‘ 3. 全レイヤーのロックを解除し、全オブジェクトを取得
‘ ※実際の運用では特定のレイヤーのみ対象にするなどのフィルタリングを入れること
Dim sr As ShapeRange
Set sr = p.ActiveLayer.Shapes.All

If sr.Count > 0 Then
‘ オブジェクト全体をグループ化してリサイズすることで崩れを防ぐ
Dim grp As Shape
Set grp = sr.Group

‘ 4. 余白を考慮したターゲットサイズ算出
Dim targetW As Double, targetH As Double
targetW = newWidth – (margin 2)
targetH = newHeight – (margin 2)

‘ 5. 比率を維持したリサイズ処理
grp.SetSizeEx cdrCenter, targetW, targetH, True

‘ 6. ページ中央への配置
grp.CenterX = newWidth / 2
grp.CenterY = newHeight / 2

‘ 必要に応じてグループ解除(保持したい場合はコメントアウト)
grp.Ungroup
End If

Cleanup:
doc.EndCommandGroup
If Err.Number <> 0 Then MsgBox “Error: ” & Err.Description
End Sub

3. 設計上の重要ポイント:なぜこの書き方なのか

A. CommandGroupの使用

`doc.BeginCommandGroup` と `doc.EndCommandGroup` で囲むのは、CorelDRAW自動化の鉄則だ。これを行わないと、リサイズ、配置、グループ解除といった一連の動作が個別のUndo履歴として残り、ユーザーの操作性を著しく損なう。

B. ShapeRangeのグループ化

個別のオブジェクトに対して座標計算を行うのは非効率極まりない。一度 `Group` メソッドでまとめることで、CorelDRAWの内部エンジンが持つ「バウンディングボックス計算」を最大限に活用できる。これがパフォーマンスと精度の両立の鍵だ。

C. エラーハンドリングの徹底

ファイルがロックされている、あるいはオブジェクトが保護されている場合、VBAは容赦なく停止する。`On Error GoTo` を活用し、どのようなデータが流し込まれてもアプリケーションをクラッシュさせない「沈まない設計」を心がけること。

4. 実務への応用と注意点

  • データベース連携: もしこの値を外部のCSVやSQLから取得する場合、型変換(`CDbl`など)には細心の注意を払え。CorelDRAWの単位(インチ/mm)とデータ側の単位が一致しているか、必ず変換関数を噛ませるべきだ。
  • 複雑なレイヤー構造: 上記コードは `ActiveLayer` を対象にしている。ドキュメント全体(マルチレイヤー)を操作したい場合は、`doc.Pages` コレクションをループさせ、各レイヤーの可視性やロック状態をチェックするロジックを前段に追加せよ。

最後に

自動化エンジニアの価値は、コードが動くことではなく、「現場のオペレーターが意識せずとも、完璧なデータが生成される仕組みを作ること」にある。このコードをベースに、各現場の固有要件(ガイド線の削除や、特定のカラーモードへの変換など)を組み込んでいってほしい。

次回の記事では、この設計をさらに発展させ「プリフライトチェック(印刷用データ不備の自動検知)」をVBAで実装する方法について掘り下げる。現場で圧倒的な成果を出せ。期待している。

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