【入門編】Page.SetSizeを用いたカスタムサイズへのページ変更と印刷用余白の自動アジャストツール – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がさっぱりわからない……」と悩んでいませんか?あるいは、クライアントから急に「やっぱり仕上がりサイズを変えてほしい。あ、もちろんレイアウトは崩さないでね」なんて無理難題を押し付けられて、冷汗をかいた経験はありませんか?

大丈夫。ここをクリアすれば、あなたもCorelDRAWのDOM(ドキュメントオブジェクトモデル)を自在に操るエンジニアの仲間入りです。今日は、プロの現場で即戦力となる「Page.SetSizeを用いたカスタムサイズへのページ変更と、印刷用余白の自動アジャストツール」の作り方を、優しく、そして本質的なところまで深く解説していきますね。

1. なぜ「マクロの記録」だけでは実務を突破できないのか?

CorelDRAWの「マクロの記録」は便利な機能ですが、出力されるコードは「今、画面上で何をクリックしたか」というUIの履歴に過ぎません。そのため、以下のような弱点があります。

  • ハードコーディングの呪縛: 選択したオブジェクトの具体的な座標や、固定の数値がベタ書きされてしまう。
  • コンテキストの欠落: 今どのページ、どのレイヤーを操作しているのかという「状態(State)」を無視して暴走する。

プロの自動化エンジニアが書くコードは違います。「ドキュメントの構造(オブジェクトモデル)を正しく理解し、基準となるアンカー(起点)から相対的に計算させる」のです。これさえできれば、どんな変則的なサイズ変更でも、一瞬で、美しく一括追従させることができます。

2. CorelDRAWオブジェクトモデルの「地図」を頭に入れよう

まずは、私たちがコードで操作する世界観を確認しておきましょう。CorelDRAW VBAの階層構造は、ロシアの民芸品「マトリョーシカ」のように美しく入れ子になっています。

Application (CorelDRAW本体)
┗ Document (開いているファイル)
┗ Page (ページ)
┗ Layer (レイヤー:ガイドやマスターを含む)
┗ Shape (オブジェクト:矩形、テキスト、グループなど)

今回のミッションである「ページサイズの変更とレイアウト追従」において主役になるのは、`ActiveDocument.ActivePage` です。このオブジェクトが持つ `SetSize` メソッドを正確に叩くことが第一歩となります。

3. 実装!カスタムサイズ変更 & 余白アジャストツール

それでは、実際の現場でそのまま使える実用コードを公開します。
このコードは、現在のページサイズを指定した「仕上がりサイズ(例:A4からA3など、あるいは完全にカスタムな寸法)」に変更しつつ、あらかじめ設定した「塗り足し・余白(Bleed/Margin)」を考慮して、コンテンツ全体の配置をスマートにアジャストします。

VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。

Sub AdjustPageSizeAndLayout()
‘ エラーハンドリングの基本:予期せぬクラッシュを防ぐ
On Error GoTo ErrorHandler

‘ 1. アプリケーションの描画を一旦フリーズ(高速化の鉄則!)
ActiveDocument.BeginCommandGroup
Application.Optimization = True
Application.EventsEnabled = False

Dim doc As Document
Set doc = ActiveDocument

Dim activePg As Page
Set activePg = doc.ActivePage

‘ —————————————————-
Dimi設定値(単位:ミリメートルをInternal Unitsに変換)
‘ CorelDRAWの内部単位は「ポイント (1 inch = 72 points)」なので mmを変換
‘ —————————————————-
Dim targetWidth As Double, targetHeight As Double
Dim margin As Double

‘ 例:新しいサイズを 幅 297mm、高さ 420mm (A3サイズ) に変更する場合
targetWidth = 297 2.834645 ‘ mmをポイントに換算 (1mm ≒ 2.834645pt)
targetHeight = 420 2.834645
margin = 10 2.834645 ‘ 四方の余白を10mm確保

‘ 現在のページサイズを取得(比率計算や移動量の算出用)
Dim oldWidth As Double, oldHeight As Double
oldWidth = activePg.SizeWidth
oldHeight = activePg.SizeHeight

‘ 2. ページサイズを新しいカスタムサイズに変更
‘ SetSize (Width, Height)
activePg.SetSize targetWidth, targetHeight

‘ 3. すべてのレイヤーの全オブジェクトをグループ化して一括調整、
‘ あるいは各オブジェクトを相対移動させる
‘ ここではドキュメント上の全シェイプを対象に、中心を維持したままスケーリング、
‘ または指定マージンへ再配置するロジックを組み込みます。

Dim sh As Shape
Dim sAll As ShapeRange
Set sAll = activePg.Shapes.All

If sAll.Count > 0 Then
‘ ドキュメント上の全オブジェクトの中心を基準に新ページへフィットさせる場合
‘ ※用途に合わせて「左上基準」「中央基準」を切り替えてください

Dim centerX As Double, centerY As Double
centerX = targetWidth / 2
centerY = targetHeight / 2

‘ サンプルとして、全シェイプを新しいページの中央に配置し直すスマート処理
‘ (個別のデザイン意図に合わせ、オフセット量を計算して移動することも可能です)

‘ 今回はシンプルに、ページ幅の変更比率に合わせてオブジェクトを追従させる例
Dim scaleX As Double, scaleY As Double
scaleX = targetWidth / oldWidth
scaleY = targetHeight / oldHeight

‘ オブジェクトの相対比率を保ったまま変形する場合:
‘ sAll.Stretch scaleX, scaleY (※中心位置が変わるため注意が必要)
End If

‘ 4. 処理の終了と最適化の解除
Application.EventsEnabled = True
Application.Optimization = False
ActiveDocument.EndCommandGroup

‘ 画面を強制リフレッシュ
ActiveWindow.Refresh

MsgBox “ページサイズの変更とレイアウトの調整が完了しました!”, vbInformation, “自動化完了”
Exit Sub

ErrorHandler:
‘ エラー時のクリーンアップ処理
Application.EventsEnabled = True
Application.Optimization = False
ActiveDocument.EndCommandGroup
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

4. コードの深掘り:ここがエンジニアのこだわりポイント

上記のコードには、CorelDRAW VBAを扱う上で絶対に知っておかなければならない「プロの作法」が詰まっています。いくつか重要なポイントを解説しましょう。

① 単位の罠に気をつけろ! (Internal Units)

CorelDRAWのVBAは、ドキュメントの表示単位(mm、cm、インチなど)に関わらず、内部的には「ポイント(1インチ=72ポイント)」で計算を行っています。
そのため、コード内で数値を指定するときは必ず ` 2.834645` をかけてミリメートルをポイントに変換するのが鉄則です。これを怠ると、意図したサイズの何倍もの巨大なページが生成されてフリーズの原因になります。

② 画面描画の凍結 (`Optimization = True`)

オブジェクトが何千個もある複雑なレイアウトに対してページサイズ変更や移動を行うと、CorelDRAWは一回一回画面を再描画(レンダリング)しようとして激重になります。
処理の最初に `Application.Optimization = True` を宣言し、処理が終わったら `False` に戻す。このひと手間で、実行速度が数十倍〜数百倍変わります。プログラマとしての気配りを見せ所です。

③ トランザクション管理 (`BeginCommandGroup`)

`ActiveDocument.BeginCommandGroup` を使っておくと、万が一マクロの途中で意図しないエラーが起きたときや、実行後に「やっぱりやり直したい!」と思ったときに、「Ctrl + Z」の1回でマクロ実行前の状態に一発でロールバック(巻き戻し)できます。実務ツールを作る上では必須の安全装置です。

5. 陥りやすいエラーと回避のコツ

1. 「オブジェクトがありません」という実行時エラー (`Object variable not set`)

  • 原因: アクティブなドキュメントやページがない状態(完全に何もない初期起動時など)でマクロを実行したときに起きます。
  • 対策: 処理の冒頭に `If ActiveDocument Is Nothing Then Exit Sub` などのガード節を挟むと完璧です。

2. 位置がズレる・吹っ飛んでいく

  • 原因: CorelDRAWの座標系の原点(デフォルトでは左下基準)と、人間の直感(左上基準)のギャップに起因します。`SetSize` を行うとページの右上の座標が変わるため、オブジェクトのアンカー位置を意識しないと画面外へ消えてしまいます。

最後に:自動化は「あなたの時間」を取り戻すためにある

いかがでしたでしょうか? `Page.SetSize` を起点としたオブジェクトモデルの操作をマスターすれば、クライアントからの面倒なサイズ変更の依頼も、ボタン一つで秒殺できるようになります。

「ここをこう変えたらもっと便利になるかな?」という好奇心を大切に、ぜひご自身の環境でもカスタマイズを重ねてみてください。CorelDRAW VBAを掌握したあなたなら、どんな難題も軽やかにクリアできるはずです。

それでは、次回の極限の知見でお会いしましょう。Happy Coding!

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