こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がさっぱりわからない……」というステージから抜け出し、自分の手でデザインの自動化をコントロールしたい中級者の方に向けて、今日は実務で即戦力となるテクニックをお伝えします。
ここをクリアすれば、CorelDRAW VBAの基本構造やオブジェクトのライフサイクルはバッチリです。ぜひ最後までついてきてくださいね。
—
今回のゴール:マルチページCDRからWeb用PNGを高精度で一括生成する
ECサイトのバナー制作や、SNS用のイラスト、あるいは大量のアイコンセットなどをCorelDRAWの1つのファイル(マルチページ)で管理しているシーンを想像してください。
これを手作業で1ページずつ「ファイル」>「エクスポート」……と繰り返していませんか?
10ページならまだしも、50ページ、100ページとなると、人間がやる作業ではありません。ミスも起きれば、何より時間がもったいないです。
今回は、「マルチドキュメントの各ページを巡回し、ページ名やレイヤー名をファイル名として拾い上げ、指定した高解像度のPNG形式で自動バッチエクスポートするマクロ」を構築します。
—
現場で即戦力になる!完全自動エクスポート・コード
まずは、何も言わずにこのコードをCorelDRAWのVBAエディタ(`Alt + F11`)に貼り付けてみてください。
Sub ExportAllPagesAsPNG()
‘ ==========================================
‘ 複数ページを高解像度PNGとして一括書き出しするマクロ
‘ ==========================================
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが保存されているかチェック(パスを取得するため)
If doc.Saved = False Then
MsgBox “一度ドキュメントを保存してから実行してください。”, vbExclamation, “エラー”
Exit Sub
End If
Dim exportPath As String
exportPath = doc.FilePath & “Exported_PNGs\”
‘ 出力先フォルダが存在しない場合は自動作成
If Dir(exportPath, vbDirectory) = “” Then
MkDir exportPath
End If
Dim origPage As Page
Set origPage = doc.ActivePage ‘ 実行前の元ページを記憶
Dim p As Page
Dim filterObj As StructExportFilter
Dim expOptions As StructCreateParams
Dim fileName As String
Dim successCount As Long
successCount = 0
‘ 画面描画を停止して爆速化(プロの基本テクニック)
doc.DrawingManager.UpdateEnabled = False
On Error GoTo ErrorHandler
‘ 全ページをループ処理
For Each p In doc.Pages
p.Activate ‘ ページをアクティブにする
‘ ファイル名に使用できない文字や空白を考慮し、ページ名をそのまま利用
‘ (必要に応じてレイヤー名等と組み合わせることも可能)
fileName = exportPath & p.Name & “.png”
‘ 300 DPIの高解像度でPNGエクスポートフィルターを設定
‘ StructExportFilter を用いることで、詳細なピクセル数やカラーモードを制御できます
Set filterObj = doc.ExportBitmap(fileName, cdrPNG, cdrSelection, cdrCurrentPage, 0, 0, 300, 300, cdrRGBColor, True, False, False, False, cdrCompressionNone)
‘ 実際にエクスポートを実行
filterObj.Finish
successCount = successCount + 1
Next p
CleanUp:
‘ 画面描画の復元と元ページの復帰
origPage.Activate
doc.DrawingManager.UpdateEnabled = True
MsgBox successCount & “枚のPNG画像を正常に書き出しました!” & vbCrLf & “保存先: ” & exportPath, vbInformation, “処理完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub
—
コードの本質を解剖する!知っておくべき4つの重要ポイント
ただ動くだけでなく、「なぜこの書き方をしているのか」を知ることで、あなたのVBAスキルは一段と洗練されます。
1. 画面描画のロック (`DrawingManager.UpdateEnabled = False`)
ページ数が多いファイルを処理するとき、VBAが1ページずつ画面を書き換えようとすると、激しく画面がチラつき、処理速度が何倍も遅くなります。
処理の最初に描画をオフにし、最後にオンに戻す。これは、CorelDRAW自動化における「極限のパフォーマンスを引き出すための絶対の作法」です。
2. 状態の退避と復元 (`ActivePage` の記憶)
マクロが勝手にページを切り替えながら処理をした結果、マクロ終了後に「ユーザーが作業していたページとは違う変なページが開いていた」という状況はバグの元です。
処理前に `origPage` として現在地を保持しておき、最後に必ず元の場所へ連れ戻す。こういう細やかな配慮ができるエンジニアは信頼されます。
3. 動的なフォルダ生成 (`MkDir`)
VBAからファイルを保存する際、指定したフォルダが存在しないと「パスが見つかりません」というエラー(Runtime Error 76)で即座にクラッシュします。
`Dir` 関数でフォルダの存在をチェックし、無ければ `MkDir` で自動生成するロジックを挟むことで、ユーザーに余計な手間を取らせない親切な設計にしています。
4. 高解像度出力の要 `ExportBitmap` メソッド
Web用素材といえど、Retinaディスプレイや印刷への転用を考慮して「300 DPI」を指定しています。
`ExportBitmap` の引数を調整することで、透過PNG(アルファチャンネル付き)にしたり、背景色を透明にしたりといったカスタマイズも自在に行えます。
—
初学者がハマりがちな「3大エラー」と回避策
CorelDRAW VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。あらかじめ知っておけば怖くありません。
トラップ1: 「未保存のドキュメントです」エラー
- 原因: `doc.FilePath` は、一度も保存されていなかったり(Untitled-1など)、クラウド上の特殊なパスにある場合に正しく取得できません。
- 対策: コードの冒頭にある `If doc.Saved = False Then` のように、必ず保存状態をフックして実行前にユーザーへアナウンスを入れましょう。
トラップ2: ページ名に重複や使えない記号がある
- 原因: Windowsのファイル名に使えない文字(`\`, `/`, `:`, “, `?`, `”`, `<`, `>`, `|`)や、重複したページ名が存在すると、エクスポート時にファイル上書きエラーやパス不正が発生します。
- 対策: 必要に応じて、`Replace` 関数などを使ってファイル名として不適切な文字をアンダースコア(`_`)に置換するサニタイズ処理を入れると、さらに堅牢なマクロになります。
—
結びにかえて
お疲れ様でした!
今回学んだ「マルチページの巡回」「動的なパス生成」「描画の最適化」、そして「エラーハンドリング」は、CorelDRAWを使ったあらゆるバッチ処理の基本骨格になります。
「ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!」
マクロの記録から卒業し、自分の手でオブジェクトのライフサイクルを完全にコントロールできるようになったあなたなら、どんなに膨大なデザイン案件が来ても、怖じ気ることなく一瞬で自動化の仕組みを組めるはずです。
次回の応用編では、レイヤーの表示・非表示をプログラムから動的にコントロールして、1つのページから何パターンものバリエーション画像を自動書き出しする手法に迫ります。どうぞお楽しみに!
