【入門編】ActivePageとPagesコレクションを用いたページ切り替えの自動化:全ページのサムネイル一括エクスポートへの応用 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺めては、「なんだかよく分からないけれど動くからいいか…」とモヤモヤしていませんか?

大丈夫、ここをクリアすればCorelDRAW VBAの基本はバッチリですよ。
今日は、複数ページにわたるドキュメントを自由自在に操り、全ページのサムネイルを一網打尽にエクスポートする実用スクリプトを通じて、「ActivePageとPagesコレクション」の本質をマスターしましょう。

単なるコードのコピペではなく、オブジェクトのライフサイクルやCorelDRAWが裏でやっていることまで含めて、優しく、そして深く解説していきますね。

1. なぜ「ページ操作」でつまずくのか?

CorelDRAWで複数ページのドキュメントを扱うとき、多くの初心者が陥る罠があります。それが「今、どのページを見ているのか(アクティブか)」という意識の欠落です。

画面上のUI(ユーザーインターフェース)と同じように、VBAの世界でも「今操作しているページ」が存在します。それを司るのが `ActivePage` です。

そして、ドキュメント全体にある全ページを管理しているのが `Pages` コレクションという「箱」です。

この2つの関係性をイメージ図で表してみましょう。

[ Document (ドキュメント) ]
┗ 📂 Pages コレクション (全ページの箱)
┣ 📄 Page 1
┣ 📄 Page 2 <-- 今ここに注目させたい! (ActivePage) ┗ 📄 Page 3 VBAで一括処理を行うときは、「Pagesという箱から1枚ずつページを取り出し、それを『ActivePage(現在の作業台)』にセットして料理する」という手順を踏みます。これがページ自動化の鉄則です。 ---

2. 基礎知識:ActivePage と Pages コレクションの正体

まずは、それぞれのオブジェクトが持つ役割を整理しておきましょう。

  • `ActiveDocument.Pages`(Pagesコレクション)
  • ドキュメントに含まれる全ページの集合体です。
  • `Pages.Count` で総ページ数を取得でき、`Pages(1)` や `Pages(i)` で個々のページを指名できます(※CorelDRAWのインデックスは 0からではなく 1 から始まる ので注意!)。
  • `ActiveDocument.ActivePage`(ActivePageオブジェクト)
  • 現在、ユーザーの画面上でアクティブになっている(選択されている)ページです。
  • 多くのエクスポートメソッドや描画メソッドは、この「アクティブなページ」を対象に実行されます。

つまり、全ページを処理する基本ループの構造はこうなります。

Dim i As Long
For i = 1 To ActiveDocument.Pages.Count
‘ 1. ページをアクティブにする(作業台に載せる)
ActiveDocument.Pages(i).Activate

‘ 2. 処理を行う(エクスポートなど)
‘ …
Next i

3. 実践!全ページサムネイル一括エクスポート マクロ

それでは、ここまでの知見をフル動員して、実務で即戦力になるコードを書きましょう。
このマクロは、アクティブなドキュメントの全ページをJPEG画像として、指定したフォルダへ自動的に書き出すものです。

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

Sub ExportAllPagesAsJPEG()
‘ エラーハンドリングの基本:トラブル時に処理が止まらないようにする
On Error GoTo ErrorHandler

Dim doc As Document
Set doc = ActiveDocument

‘ ドキュメントが開かれているかチェック
If doc Is Nothing Then
MsgBox “処理対象のドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 保存先フォルダのパス(環境に合わせて書き換えてください。最後は必ず「\」で終わる)
Dim exportPath As String
exportPath = “C:\Temp\CorelExports\”

‘ フォルダが存在するか簡易チェック(実務ではFileSystemObjectを使うとより安全です)
If Dir(exportPath, vbDirectory) = “” Then
MsgBox “保存先フォルダが存在しません: ” & exportPath, vbExclamation, “確認”
Exit Sub
End If

Dim i As Long
Dim totalPages As Long
totalPages = doc.Pages.Count

‘ 進捗確認用のメッセージ
Dim msgResult As VbMsgBoxResult
msgResult = MsgBox(“全 ” & totalPages & ” ページのサムネイル書き出しを開始しますか?”, vbQuestion + vbOKCancel, “確認”)
If msgResult = vbCancel Then Exit Sub

‘ — メインループ開始 —
For i = 1 To totalPages

‘ 1. ターゲットのページをアクティブにする
doc.Pages(i).Activate

‘ 2. エクスポートファイル名の組み立て(例: Page_001.jpg)
Dim fileName As String
fileName = exportPath & “Page_” & Format(i, “000”) & “.jpg”

‘ 3. フィルターを使用してJPEGエクスポートを実行
‘ ※ドキュメント全体ではなく、ActivePageを対象にエクスポートする設定
Dim expFilter As ExportFilter
Set expFilter = doc.ExportBitmap(fileName, cdrJPEG, cdrActivePage, cdrExportWidth, 800, 600, 72, 72, cdrNoAntiAliasing, False, False, True)

‘ エクスポートを実行確定させる
expFilter.Finish

Next i
‘ — メインループ終了 —

MsgBox “すべてのページのエクスポートが完了しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

4. コードの深掘り:エンジニアが教える「ここがポイント」

上記のコードで、特に初学者が押さえておくべき重要ポイントを解説します。

① なぜ `doc.Pages(i).Activate` が必要なのか?

先ほども触れましたが、CorelDRAWのVBAの多くは「今選択されているもの(Active)」を暗黙のターゲットにします。
`doc.ExportBitmap` メソッドで `cdrActivePage`(アクティブページをエクスポートする定数)を指定しているため、ループ内で確実にそのページを `.Activate` させておく必要があるのです。これをサボると、何ページ目をループしていても「なぜか最初のページばかりが上書き保存される」という悲しいバグを生みます。

② `Format(i, “000”)` のおもてなし

ファイル名に `Format(i, “000”)` を使っています。これにより、ページ番号が `1, 2, 10` と並んだときにファイルマネージャー上で順序がバラバラになるのを防ぎ、`001, 002, 010` と綺麗にゼロパディング(桁揃え)されます。こうした細かな配慮が、実務で使えるツールの条件です。

③ `ExportFilter` の作法

CorelDRAWで画像やPDFを書き出す際、`ExportBitmap` などのメソッドは「エクスポートフィルターオブジェクト」を返します。
最後に `expFilter.Finish` を呼び出すことで、初めてファイルへの書き込みが実体化(コミット)されます。このお作法を忘れないようにしましょう。

5. 陥りやすいエラーと回避の知恵

罠:ページ数が途中で変わる処理をしてしまう

もしループの中で、コードが「ページの追加や削除」を行ってしまうと、`For i = 1 To totalPages` のカウントが狂い、無限ループや実行時エラー(インデックスが範囲外です)を引き起こします。
「ページを走査するだけのループ(読み取り専用)」のときは決してお構いなしにページ数を増減させないこと。これが鉄則です。

おわりに

お疲れ様でした!
`ActivePage` と `Pagesコレクション` の関係、そしてそれらを安全にループさせる作法がお分かりいただけたかと思います。

この「コレクションから要素を取り出してアクティブにし、処理する」というパターンは、ページだけでなく、レイヤー(Layers)やシェイプ(Shapes)を操作する際にも全く同じ考え方で応用できます。

ここをクリアしたあなたなら、もうマクロの記録器の奴隷ではありません。自分の手でCorelDRAWを完全にコントロールするエンジニアの第一歩を踏み出しました。
次回のテーマもお楽しみに!快適なVBAライフを!

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