【CorelDRAW VBA】奇数・偶数ページを自動判別し「ノド」を考慮したガイド線を配置する極致
CorelDRAWでのDTP自動化において、最も泥臭く、かつ最も自動化の恩恵を受けやすい領域。それが「ガイド線の配置」です。
多くのエンジニアが陥る罠は、ページ数をループで回し、単に座標を指定してガイドを引くだけの「使い捨てコード」を書くことです。しかし、プロフェッショナルは違います。「見開き」という概念をオブジェクトモデルのライフサイクルにどう落とし込むか、そして「ノド(綴じ代)」の物理的な制約をどうロジカルに解決するか。ここに、保守性と拡張性を分かつ境界線があります。
本稿では、実務の現場で即座に導入でき、かつバグを寄せ付けない堅牢なガイド線自動配置の実装について解説します。
—
1. なぜ「ノド」を考慮した設計が必要なのか
印刷データにおいて、偶数ページ(左ページ)と奇数ページ(右ページ)でノドの余白が反転するのは鉄則です。しかし、CorelDRAWの`Guides`オブジェクトを愚直に操作すると、レイヤーのゴミが溜まったり、単位系(Units)の誤認によるズレが頻発します。
堅牢な自動化のために守るべき「3つの鉄則」を定義します。
- レイヤーのクリーンアップ: ガイド配置前に既存ガイドをクリアする処理を挟むこと。
- 単位の固定: `Document.Unit`に依存せず、常に`cdrMillimeter`等で明示的に計算を行うこと。
- 状態の保持: 処理終了後に必ず元の設定(単位や選択状態)を復元すること。
—
2. 実行可能なプロダクションコード
以下のコードは、アクティブドキュメントの全ページを巡回し、偶数・奇数を判定してノド側(内側)の余白を考慮したガイドを自動配置します。
‘ ———————————————————
‘ 奇数・偶数ページ対応:ノドを考慮したガイド線自動配置
‘ ———————————————————
Sub AutoPlaceGuidesForSpread()
Dim doc As Document: Set doc = ActiveDocument
Dim pg As Page
Dim gutter As Double: gutter = 20 ‘ ノドの余白(mm)
Dim margin As Double: margin = 10 ‘ 外側の余白(mm)
‘ 単位をミリメートルに強制固定
Dim originalUnit As cdrUnit: originalUnit = doc.Unit
doc.Unit = cdrMillimeter
On Error GoTo Cleanup
For Each pg In doc.Pages
pg.Activate
‘ ガイド用レイヤーの既存ガイドを一掃(クリーンな状態を保つ)
pg.GuidesLayer.Guides.All.Delete
‘ ページサイズを取得
Dim w As Double: w = pg.SizeWidth
‘ 偶数ページ(左)と奇数ページ(右)の条件分岐
If pg.Index Mod 2 = 0 Then
‘ 偶数ページ: 左がノド
Call AddVerticalGuide(pg, gutter)
Call AddVerticalGuide(pg, w – margin)
Else
‘ 奇数ページ: 右がノド
Call AddVerticalGuide(pg, margin)
Call AddVerticalGuide(pg, w – gutter)
End If
Next pg
Cleanup:
doc.Unit = originalUnit
MsgBox “ガイド線の配置が完了しました。”, vbInformation
End Sub
‘ ガイド配置の補助ルーチン(保守性向上のため分離)
Private Sub AddVerticalGuide(pg As Page, pos As Double)
Dim g As Guide
Set g = pg.GuidesLayer.CreateGuide(pos, 0, pos, pg.SizeHeight)
g.Color.RGBAssign 255, 0, 0 ‘ 目立つように赤色に設定
End Sub
—
3. 実務で「詰まない」ための設計思想
なぜ `pg.GuidesLayer` を直接操作するのか
`Layer.Guides` ではなく `Page.GuidesLayer` を使用するのは、CorelDRAWのオブジェクトモデルにおいて、ガイドは常に特定のレイヤーに帰属する性質があるからです。これを理解していないと、レイヤーの表示/非表示を切り替えた際、ガイドが追従せず「消せないガイド」が残るという事故を引き起こします。
データベース連携のヒント
もし、このガイド位置をExcelやCSVから読み込みたい場合は、`FileSystemObject` を使って設定値を外部化してください。
- 悪い例: コード内にハードコーディングする。
- 良い例: `Config.ini` や `Config.json` を用意し、VBA側で `Scripting.Dictionary` を使って設定値を保持する。
これにより、クライアントから「綴じ代を20mmから25mmに変更してほしい」と言われた際に、マクロのコードを一行も書き直すことなく対応可能になります。これが「エンジニアリング」と「ただのスクリプト」の決定的な違いです。
—
4. チーフアーキテクトからの助言
CorelDRAW VBAは、現代の言語に比べればレガシーかもしれません。しかし、描画エンジンと直接対話できるこの言語は、DTP制作において最強の武器です。
今回紹介したコードは、あくまで「基礎」です。実務ではここに「セーフティエリアの矩形描画」や「裁ち落とし(ブリード)の自動チェック」を組み込むことを推奨します。
「動けばいい」コードを書くのは卒業しましょう。次世代のオペレーターがあなたのコードを読んだときに、「この設計は美しい」と思わせるような、高い凝集度を意識した設計を心がけてください。
実装中に躓くことがあれば、それはあなたのコードが「より堅牢になるための伸びしろ」です。また次の現場でお会いしましょう。
