CorelDRAW VBAの深淵:見開きドキュメントの「左右」を完全制御する技術
こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺める段階は、もう卒業しましょう。あれはあくまで「手掛かり」に過ぎません。真のエンジニアが目指すべきは、CorelDRAWのオブジェクトモデル(DOM)を意のままに操り、ドキュメントの構造そのものを理解した上でコードを書くことです。
今回は、実務で頻出する「見開きページ(Facing Pages)の左右判定と自動レイアウト」という難所を攻略します。ここを理解すれば、あなたはCorelDRAW VBAの「中級者」への切符を確実に手にします。
—
1. なぜ「ページ番号」だけでは不十分なのか?
CorelDRAWの`Pages`コレクションは、インデックス(1, 2, 3…)で管理されています。しかし、見開きドキュメントにおいて、物理的な「ページ1」は常に右側に配置されます。
ここで多くの初心者が陥る罠が、`If PageNumber Mod 2 = 0` という単純な偶数・奇数判定です。見開き設定では、偶数ページが左側に来るのか右側に来るのかは、ドキュメントの開始設定に依存します。
私たちが制御すべきは、「ページ番号」ではなく「そのページが見開きの左側(Verso)なのか、右側(Recto)なのか」という物理的状態です。
—
2. 左右判定のアルゴリズムを実装する
まずは、現在アクティブなドキュメントのページを巡回し、左右を判定するロジックを見てみましょう。
Sub SortLayoutByFacingPages()
Dim doc As Document
Dim pg As Page
Set doc = ActiveDocument
‘ ドキュメントが見開き設定でない場合は中断
If Not doc.Pages.FacingPages Then
MsgBox “このドキュメントは見開き設定ではありません。”
Exit Sub
End If
‘ 全ページを走査
For Each pg In doc.Pages
‘ ページ番号の偶奇判定
‘ 多くの標準的な書籍設定では、奇数ページが右(Recto)、偶数ページが左(Verso)
If pg.Index Mod 2 <> 0 Then
‘ 奇数ページ(右側)の処理
ProcessRightPage pg
Else
‘ 偶数ページ(左側)の処理
ProcessLeftPage pg
End If
Next pg
MsgBox “レイアウト調整が完了しました。”
End Sub
‘ 右ページ(奇数)用の処理モジュール
Private Sub ProcessRightPage(pg As Page)
pg.Activate
‘ ここに右ページ専用の処理(例:ノンブルを右下に配置など)を記述
Debug.Print “Page ” & pg.Index & ” は右ページとして処理されました。”
End Sub
‘ 左ページ(偶数)用の処理モジュール
Private Sub ProcessLeftPage(pg As Page)
pg.Activate
‘ ここに左ページ専用の処理(例:ノンブルを左下に配置など)を記述
Debug.Print “Page ” & pg.Index & ” は左ページとして処理されました。”
End Sub
—
3. 実務で必ず直面する「落とし穴」
コードを書いていて、以下のエラーや挙動に遭遇したことはありませんか?
① 「オブジェクトがありません」エラー
`ActivePage` や `ActiveLayer` を多用すると、処理の途中でページ移動が発生した際に参照先を見失います。必ずループの中で `pg.Activate` を呼ぶか、あるいはオブジェクト変数(`pg`)を直接操作する癖をつけてください。 `Active`という言葉に頼るのは、卒業しましょう。
② 処理速度が極端に遅い
CorelDRAWの描画更新(画面の再描画)は、VBAの処理を非常に重くします。ループの冒頭で `Optimization = True` を設定し、終了後に `False` に戻すのがプロの流儀です。
‘ 処理開始前
Optimization = True
‘ …ループ処理…
‘ 処理終了後
Optimization = False
ActiveWindow.Refresh
—
4. プロの現場からのアドバイス
実務での自動化において、最も重要なのは「例外処理」です。
例えば、「表紙(1ページ目)は特別扱いしたい」という要望は必ずと言っていいほど出てきます。
For Each pg In doc.Pages
Select Case pg.Index
Case 1
‘ 表紙専用のロジック
Case doc.Pages.Count
‘ 裏表紙専用のロジック
Case Else
‘ それ以外の本文ページ
If pg.Index Mod 2 = 0 Then ProcessLeftPage pg Else ProcessRightPage pg
End Select
Next pg
このように、`Select Case` を活用して「例外」を構造化して記述してください。`If` 文の入れ子地獄から解放され、メンテナンス性の高いコードになります。
—
最後に:自動化は「設計」が9割
CorelDRAW VBAの習得は、単なるコード書きではありません。ドキュメントという「階層構造」を頭の中に描き出すことです。
今回紹介した「見開きの左右判定」は、自動化の第一歩に過ぎません。しかし、この「オブジェクトをどう巡回し、条件によってどう分岐させるか」という設計思想さえ身につければ、どんな複雑なレイアウト業務も、ボタン一つで終わらせるツールへと変貌させることができます。
さあ、次はあなたの番です。このコードをベースに、自分の業務に合わせた「最強のレイアウト自動化ツール」を書き上げてください。応援しています。
