【実務・中級編】【中級者向け】複数ページにわたるカタログデータのページ単位分割と個別CDRファイル化マクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握せよ:複数ページカタログの「完全自動分割・個別ファイル化」極限実装術

CorelDRAWの多ページドキュメントを「ページごとに別ファイルとして書き出す」という作業は、DTP現場における典型的な非効率の温床だ。手作業でコピペを繰り返せば、レイヤー構造の崩壊や、意図しないクリッピング、そして何より人為的ミスが必ず発生する。

今日伝授するのは、単なる「動くコード」ではない。ドキュメントのライフサイクルを制御し、メモリリークを許さず、堅牢にタスクを完遂するプロフェッショナルの実装論だ。

1. なぜ「単純なコピペ」ではいけないのか

多くの初学者が陥る罠は、`Copy`と`Paste`を繰り返すマクロを書くことだ。これはCorelDRAWの「クリップボード」という不安定な共有メモリに依存しており、処理が重くなるだけでなく、予期せぬオブジェクトの脱落を招く。

我々が取るべきアプローチは「ドキュメントの複製と不要なページの削除」という逆転の発想だ。これにより、元のドキュメントの構成情報(カラープロファイル、ガイドライン、レイヤー設定)を完全に継承した状態で、安全かつ高速に個別ファイル化を実現できる。

2. 実務に耐えうるプロダクションコード

以下のコードは、エラーハンドリングを完備し、ファイルシステムとのI/Oを最適化した実戦仕様だ。

‘ =================================================================
‘ CorelDRAW Automation: 多ページドキュメント個別分割エクスポート
‘ =================================================================
Sub ExportPagesToIndividualCDR()
Dim docSource As Document
Dim docNew As Document
Dim i As Integer
Dim savePath As String
Dim fileName As String

‘ 処理の高速化:描画の更新と警告を一時停止
Application.Optimization = True

Set docSource = ActiveDocument
savePath = docSource.FilePath & “Exported_Pages\”

‘ 出力用ディレクトリがなければ作成
If Dir(savePath, vbDirectory) = “” Then MkDir savePath

On Error GoTo Cleanup

‘ 各ページをループ(後ろから削除していくのが最も安全)
For i = docSource.Pages.Count To 1 Step -1
‘ 現在のドキュメントを複製して新しいインスタンスを生成
Set docNew = docSource.Duplicate

‘ 対象ページ以外をすべて削除
Dim j As Integer
For j = docNew.Pages.Count To 1 Step -1
If j <> i Then
docNew.Pages(j).Delete
End If
Next j

‘ 保存処理
fileName = savePath & “Page_” & Format(i, “000”) & “.cdr”
docNew.SaveAs fileName, cdrVersion17 ‘ バージョンは環境に合わせて調整
docNew.Close
Next i

Cleanup:
‘ 最適化を戻す
Application.Optimization = False
Application.Refresh

If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “分割処理が完了しました。”, vbInformation
End If
End Sub

3. このコードが「極限」である理由

① `Application.Optimization = True` の重み

CorelDRAWのVBAにおいて、`Optimization`フラグを立てないのは、エンジニアとしての怠慢だ。これを有効にすることで、画面描画の再計算を抑制し、処理速度を数倍から数十倍に引き上げる。

② 「逆順削除」という思考

コレクションを前方から削除するとインデックスがずれる。`For i = Count To 1 Step -1` という逆順処理は、メモリ管理における定石であり、バグを未然に防ぐための基本設計だ。

③ 複製(Duplicate)の戦略

`Document.Duplicate`を使用することで、元のドキュメントが保持している「ドキュメント・レベルの設定(カラープロファイルやグリッド設定)」をそのまま新ファイルに引き継げる。新規作成してオブジェクトを貼り付けるよりも、メタデータの整合性が圧倒的に高い。

4. 現場で生き残るための「保守の心得」

このスクリプトを運用する際、以下の3点だけは常に心に留めておいてほしい。

1. パスの厳密性: `savePath`には必ず末尾のパス区切り文字(`\`)を含める設計にしている。OS依存のパス区切り問題を避けるためだ。
2. バージョンの指定: `docNew.SaveAs`の引数に`cdrVersion`を指定せよ。デフォルト設定に依存すると、クライアントの環境で開けないという悲劇が起きる。
3. 例外処理の徹底: `On Error GoTo`は単なる形式ではない。大量のファイル処理中にエラーが起きれば、メモリが肥大化したまま放置される。必ず`Close`処理が通るルートを確保すること。

自動化とは、単にコードを書くことではない。「手作業が引き起こすすべてのリスクをコードの論理構造で封殺すること」だ。

さあ、このコードをベースに君の現場の「非効率なルーチン」を駆逐してほしい。成功を祈る。

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