こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して操作を再現するだけのステージは、もう卒業です。ここからは、CorelDRAWの心臓部である「オブジェクトモデル」を直接手玉にとり、あなたの手でドキュメントを意のままに操るプログラミングの領域へ踏み込みましょう。
今回は、実務で本当によくあるニーズ――「複数ページあるデザイン案の全ページを、一瞬で個別の画像ファイルとして書き出す自動化ツール」を作ります。
ここをクリアすれば、CorelDRAW VBAの「ページの概念」と「ループ処理の基本」はバッチリです。優しく、しかし本質的なところまでしっかりと解説していきますね。
—
1. なぜ「ActivePage」と「Pagesコレクション」を理解する必要があるのか?
CorelDRAWを開いたとき、画面の真ん中にある「今、自分が作業しているページ」が `ActivePage`(アクティブページ) です。
しかし、自動化においてこの `ActivePage` だけに頼っていると、痛い目を見ます。なぜなら、マクロが実行されている最中に、画面の表示ページが勝手に切り替わったり、意図しないページが処理対象になってエラーを吐いたりする原因になるからです。
プロのエンジニアは、ドキュメント全体が持つページの束(= `Pages` コレクション)を正確に把握し、その中から1枚ずつ確実に引き抜いて処理するアプローチをとります。
オブジェクトの階層構造をイメージしよう
CorelDRAWのVBAは、以下のような「マトリョーシカ」のような構造をしています。
- `Application` (CorelDRAWそのもの)
- `ActiveDocument` (今開いているファイル)
- `Pages` (全ページの集合体・コレクション)
- `Page` (個別のページ)
この構造さえ頭に入っていれば、どのオブジェクトからどんな命令(メソッドやプロパティ)を呼び出せばいいのか迷わなくなるはずです。
—
2. 実装:全ページサムネイル一括エクスポート マクロ
それでは、実務でそのまま使えるコードをお見せします。
CorelDRAWのVBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub ExportAllPagesAsPNG()
‘ —————————————————-
‘ 目的: アクティブドキュメントの全ページをPNG画像として一括エクスポートする
‘ 前提条件: ドキュメントが一度以上保存されており、保存先フォルダが特定できること
‘ —————————————————-
Dim doc As Document
Dim targetPage As Page
Dim exportPath As String
Dim fileName As String
Dim i As Long
‘ 1. 現在のアクティブドキュメントを変数に格納
Set doc = ActiveDocument
‘ ドキュメント未保存の場合はパスが取得できないため、ガード節で弾く
If doc.Untitled = True Then
MsgBox “このドキュメントはまだ保存されていません。一度保存してから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ 2. 保存先のパスを決定(CorelDRAWファイルと同じ場所の “ExportedPages” フォルダ)
exportPath = doc.FilePath & “ExportedPages\”
‘ フォルダが存在しない場合は自動作成する
If Dir(exportPath, vbDirectory) = “” Then
MkDir exportPath
End If
‘ 3. 処理開始の確認と画面描画のロック(高速化の極意)
‘ ※描画を止めると、画面がチラつかず処理スピードが劇的に跳ね上がります
EventsEnabled = False
doc.BeginCommandGroup
On Error GoTo ErrorHandler
‘ 4. Pagesコレクションをループ(1ページ目から最終ページまで)
For i = 1 To doc.Pages.Count
Set targetPage = doc.Pages(i)
‘ 注目!「今処理しているページ」を強制的にアクティブにする(エクスポート系メソッドの鉄則)
targetPage.Activate
‘ ファイル名の組み立て(例: ドキュメント名_Page01.png)
‘ 拡張子(.cdr)を除いたファイル名を取得して利用
Dim baseName As String
baseName = Left(doc.Name, InStrRev(doc.Name, “.”) – 1)
fileName = exportPath & baseName & “_Page” & Format(i, “00”) & “.png”
‘ 5. PNG形式でエクスポートを実行
‘ Optimization: 解像度やサイズを指定してビットマップとして書き出し
Dim filter As ExportFilter
Set filter = doc.ExportBitmap(fileName, cdrPNG, cdrSelection, cdrAllPages, 300, 300, 0, 0, cdrCompressionNone)
‘ エクスポートフィルタの実行(実際にファイルを出力)
filter.Finish
Next i
‘ 6. 正常終了処理
doc.EndCommandGroup
EventsEnabled = True
MsgBox “全 ” & doc.Pages.Count & ” ページの書き出しが完了しました!” & vbCrLf & _
“保存先: ” & exportPath, vbInformation, “処理成功”
Exit Sub
ErrorHandler:
‘ エラー発生時も確実に画面描画とコマンドグループを元に戻す(重要!)
EventsEnabled = True
doc.EndCommandGroup
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
3. コードのキモをエンジニア目線で解説
初心者から一歩抜け出すために、このコードの重要なポイントを3つに絞って解説します。
① `EventsEnabled = False` と `BeginCommandGroup` による爆速化
大量のページをループ処理する際、CorelDRAWはデフォルトだと「1ページ処理するごとに画面を再描画」しようとします。これが処理を激重にする原因です。
ループの直前でイベントと描画をロックし、処理が終わったら一気に解放する。このひと手間で、処理時間が数分から数秒に短縮されます。プロの現場では必須のテクニックです。
② `targetPage.Activate` の重要性
CorelDRAWのVBAには、「現在アクティブなページや選択物に対してしか働かないメソッド」がいくつか存在します。`ExportBitmap` もその一つです。
`For i = 1 To doc.Pages.Count` で取得した各ページを、確実に `targetPage.Activate` で表舞台に引っ張り出してからエクスポートをかける。これが、バグを防ぐための極意です。
③ 堅牢なエラーハンドリング(ErrorHandler)
VBAで最も恐ろしいのは、ループの途中でエラーが起きたときに `EventsEnabled = False` (画面ロック状態)のままマクロが強制終了してしまうことです。画面がフリーズしたような状態になり、CorelDRAWをタスクマネージャーから強制終了する羽目になります。
必ず `On Error GoTo ErrorHandler` を仕込み、どんな異常事態が起きたとしても、最後の安全弁で環境を元の状態(`EventsEnabled = True`)に戻す癖をつけましょう。
—
4. 陥りやすい罠と対策
罠:ファイル名に「Untitled」と言われて怒られる
コード内でもガードしていますが、新規作成して一度も保存していないドキュメントでは `doc.FilePath` が空文字列を返すため、フォルダパスの生成で必ずエラーになります。
対策: 自動化スクリプトを実行する前には、必ず一度ファイルに名前をつけて保存する習慣をつけましょう。
罠:背景が透明になってしまう、または色が意図しないものになる
PNG形式でエクスポートする際、ページ背景色が設定されていないと透明(または白)で出力されます。もし背景の色を強制したい、あるいは色空間(CMYK/RGB)を厳密にコントロールしたい場合は、`ExportBitmap` の引数を調整するか、事前にページのプロパティを確認してください。
—
おわりに
いかがでしたでしょうか?
今回は `ActivePage` と `Pages` コレクションという、CorelDRAW VBAの基礎にして最も強力な武器を使って、全ページの一括エクスポートを自動化しました。
この「コレクションをループし、1つずつ確実にアクティブにして処理する」というパターンをマスターすれば、ページごとのオブジェクト削除、テキストの一括置換、レイヤーの自動整理など、あらゆる大量破壊的(?)な自動化タスクに応用できるようになります。
ここをクリアしたあなたなら、もう立派なCorelDRAW自動化エンジニアの仲間入りです。
日々の退屈な単純作業はマクロに任せて、あなたしか生み出せないクリエイティブな時間に没頭してくださいね。それでは、次のステップでお会いしましょう!
