はじめに:手作業の「センター合わせ」から卒業しよう
こんにちは!日々のデザイン業務やDTPオペレーション、お疲れ様です。
パッケージデザイン、ラベル、カード、あるいはポスターの制作現場で、「まずドキュメントのど真ん中に十字のガイド線を引き、そこを基準に対称なレイアウトを組む」という作業、一日に何度も繰り返していませんか?
定規からマウスでガイド線を引っ張り出してきて、プロパティバーの座標入力欄に「用紙幅 ÷ 2」の数値を電卓で計算して打ち込む……。
もしあなたが「マクロの記録」を使ってこれを自動化しようとしたなら、きっと次のような壁にぶつかったはずです。
> 「A4サイズで記録したマクロをB5サイズで実行したら、変な位置にガイド線が引かれてしまった!」
そうなんです。「マクロの記録」は便利なのですが、記録した瞬間の「固定された数値(絶対座標)」しか記憶できません。用紙サイズが変わるたびに柔軟に対応させるには、コード側で「現在のページサイズを動的に取得して、半分(1/2)の値を計算する」というプログラミング的思考が必要になります。
今回は、CorelDRAW VBAのファーストステップとして最適な「用紙の中心位置を割り出し、十字のセンター合わせガイド線を自動生成するマクロ」を一緒に作っていきましょう。
ここをクリアすれば、CorelDRAW VBAの基本である「オブジェクト階層」「座標と単位の扱い」「アンドゥ処理」はバッチリマスターできますよ!
—
CorelDRAWの座標系とガイド線の仕組みを理解する
コードを書く前に、CorelDRAWの内部でページとガイド線がどう扱われているかを少しだけ覗いてみましょう。ここを知っておくと、今後のマクロ開発で余計なバグに悩まされなくなります。
1. 座標の原点はどこにある?
CorelDRAWのデフォルトでは、ページの「左下」が原点 $(X = 0, Y = 0)$ になっています(ユーザー設定で左上や中心に変更することも可能ですが、内部的な計算の基本は左下基準です)。
(0, Height) ┌───────────────┬───────────────┐ (Width, Height)
│ │ │
│ │ (Center) │
│ │ │
├───────────────┼───────────────┤ Y = Height / 2
│ │ │
│ │ │
│ │ │
(0,0) └───────────────┴───────────────┘ (Width, 0)
X = Width / 2
つまり、ページの真ん中を求める計算式は非常にシンプルです。
- 垂直ガイド線(X座標) = `ページ幅 (Width) ÷ 2`
- 水平ガイド線(Y座標) = `ページ高さ (Height) ÷ 2`
2. ガイド線は「特殊なレイヤー」に存在する
CorelDRAWのガイド線は、独立したオブジェクトのように見えて、実は「Guides(ガイド)」という名前の特殊なレイヤーの中に描画される線オブジェクト(Shape)の一種です。
VBAでは、このGuidesレイヤーに対して「垂直な線」「水平な線」を追加する命令を出してあげます。
—
【コピペで動く】十字センターガイド生成マクロ
それでは、実践的なコードを見てみましょう。
実務で安全に使えるよう、「ドキュメントが開かれていない場合のエラー回避」や「1回のアンドゥ(Ctrl+Z)で両方のガイド線を消せる処理」を組み込んだ美しいコードです。
以下のコードを、CorelDRAWのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてみてください。
Option Explicit
‘ ==============================================================================
‘ 処理名: CreateCenterCrossGuides
‘ 概要 : アクティブページの中心座標を動的に計算し、十字のセンターガイド線を生成する
‘ ==============================================================================
Public Sub CreateCenterCrossGuides()
‘ 1. ドキュメントが開かれているか安全確認
If Documents.Count = 0 Then
MsgBox “ドキュメントが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If
Dim doc As Document
Set doc = ActiveDocument
‘ 2. 単位の齟齬を防ぐため、ドキュメントの作業単位を「ミリメートル」に一時固定
‘ (ミリ単位でデザインすることが多いため。必要に応じて cdrInch 等に変更可)
Dim originalUnit As cdrUnit
originalUnit = doc.Unit
doc.Unit = cdrMillimeter
‘ 3. アンドゥ(元に戻す)の履歴を1つにまとめる
‘ これを入れておくと、Ctrl+Z を1回押すだけで縦横両方のガイド線が消せます
doc.BeginCommandGroup “十字センターガイドの作成”
On Error GoTo ErrorHandler ‘ 予期せぬエラー時に単位設定を戻すための安全装置
‘ 4. 現在のアクティブページの幅と高さを動的に取得
Dim p As Page
Set p = doc.ActivePage
Dim pageWidth As Double
Dim pageHeight As Double
pageWidth = p.SizeWidth
pageHeight = p.SizeHeight
‘ 5. 中心座標(X, Y)を計算
Dim centerX As Double
Dim centerY As Double
centerX = pageWidth / 2#
centerY = pageHeight / 2#
‘ 6. ガイド線レイヤー(Guides)を取得
Dim guidesLayer As Layer
Set guidesLayer = p.GuidesLayer
‘ 7. 十字のガイド線を生成
‘ CreateGuideline 引数: (X1, Y1, X2, Y2)
‘ 垂直ガイド: 同じX座標を通る縦線
guidesLayer.CreateGuideline centerX, 0, centerX, pageHeight
‘ 水平ガイド: 同じY座標を通る横線
guidesLayer.CreateGuideline 0, centerY, pageWidth, centerY
‘ 8. 正常終了処理
doc.EndCommandGroup
doc.Unit = originalUnit ‘ ユーザーの元の作業単位に復帰
Exit Sub
ErrorHandler:
‘ エラーが発生した場合も必ず元の状態を復元して閉じる
doc.EndCommandGroup
doc.Unit = originalUnit
MsgBox “予期しないエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
コードの勘所をやさしく解説!
初心者から中級者へステップアップするために、押さえておきたい重要ポイントを3点解説します。
① `doc.Unit`(単位)の固定と復元
CorelDRAWでは、ユーザーによってドキュメントの単位が「ミリ」「インチ」「ピクセル」「ポイント」などバラバラです。
もしユーザーが「インチ」設定のままマクロを実行し、マクロ側が「ミリ」を前提とした計算をしてしまうと、意図しない座標にガイドが飛んでいってしまいます。
originalUnit = doc.Unit ‘ 元の設定をバックアップ
doc.Unit = cdrMillimeter ‘ マクロ内では確実にミリメートルとして計算
‘ (計算処理)
doc.Unit = originalUnit ‘ 終わったらそっと元の設定にお返しする
このように「処理の直前に単位を統一し、終わったら元に戻す」のが、CorelDRAW VBAを書く上で最高にスマートな作法です。
② `SizeWidth` と `SizeHeight` による動的取得
pageWidth = p.SizeWidth
pageHeight = p.SizeHeight
centerX = pageWidth / 2#
ここが「マクロの記録」との最大の差別化ポイントです。
オブジェクト変数 `p`(アクティブページ)から直接サイズをリアルタイム取得しているので、対象の用紙が名刺サイズ(91×55mm)だろうと、A1ポスター(594×841mm)だろうと、一瞬で正確な中心値を算出できます。
③ `BeginCommandGroup` による神対応
doc.BeginCommandGroup “十字センターガイドの作成”
‘ … ガイドを2本作成 …
doc.EndCommandGroup
VBAを始めたばかりの人が見落としがちなのが「元に戻す(Undo)」の挙動です。
この記述がないと、縦ガイドの作成と横ガイドの作成が別々の操作として記録され、実行後に「やっぱり消したいな」と思ったときに Ctrl+Z を2回 押さなければならなくなります。
`BeginCommandGroup` で挟み込むことで、複数の処理を「1回のアンドゥ操作」にパッケージ化できます。現場で使ってもらうツールを作るなら、必須の配慮ですね。
—
現場でありがちな落とし穴と応用アイデア
落とし穴:複数ページあるドキュメントで実行すると?
上記のマクロは `ActivePage`(現在画面に表示されているページ)のガイドレイヤーに線を引きます。
CorelDRAWには「ページ固有のガイド線」と「全ページ共通のマスターガイド線」が存在します。今回のコードは「作業中ページ専用」のガイド線です。
もし「全ページに一括でセンターガイドを引きたい!」という場合は、次のように全ページをループする構文へ発展させることができます。
‘ 【応用例】全ページをループして一括生成したい場合
Dim singlePage As Page
For Each singlePage In doc.Pages
singlePage.GuidesLayer.CreateGuideline singlePage.SizeWidth / 2#, 0, singlePage.SizeWidth / 2#, singlePage.SizeHeight
singlePage.GuidesLayer.CreateGuideline 0, singlePage.SizeHeight / 2#, singlePage.SizeWidth, singlePage.SizeHeight / 2#
Next singlePage
わずか数行書き換えるだけで、100ページあるカタログデータでも一瞬で全ページの真ん中に十字ガイドが引けるようになります。自動化のパワーを感じる瞬間ですね!
—
おわりに:小さな自動化が大きな時短を生む
お疲れ様でした!
一見すると「真ん中に2本線を引くだけ」のマクロですが、この中には、
- オブジェクトモデルの辿り方(`Document` → `Page` → `Layer`)
- ドキュメント単位の安全管理
- 動的な数値計算
- Undoの制御
といった、CorelDRAW VBAの根幹をなすエッセンスがぎっしり詰まっています。ここさえ完全に理解できれば、基本の壁は軽々とクリアしたと言って間違いありません。
次は、ガイド線だけではなく「用紙のフチから内側3mmの位置にマージン(余白)ガイドを引くマクロ」などに挑戦してみるのも面白いですよ。
CorelDRAWの手作業をどんどんハックして、クリエイティブに没頭できる時間を増やしていきましょう!
