肥大化するCDRファイルを浄化せよ:空ページ一括パージの極意
業務現場において、CorelDRAWのマルチページCDRファイルは、しばしば「ゴミの温床」となる。デザイナーが修正を重ねる中で発生する、何もない空のページ。これらはファイル容量を圧迫するだけでなく、印刷工程におけるRIPエラーや、後続の自動化プロセスでの予期せぬ挙動を引き起こす。
本稿では、CorelDRAW VBAの深淵に触れつつ、単なる削除スクリプトではない、「メモリと実行速度を最適化したプロ仕様のパージ・アーキテクチャ」を伝授する。
—
1. 判定の真髄:何をもって「空」とみなすか
初心者は `ActivePage.Shapes.Count` を見て満足する。しかし、シニアエンジニアはそれを見ない。CorelDRAWのオブジェクトモデルにおいて、不可視レイヤーやロックされたオブジェクト、あるいは「極小の非表示パス」が存在する可能性を考慮しなければならないからだ。
真に「空」であると判定するには、以下の条件をクリアする必要がある。
- Layer.Shapes.Count がゼロであること。
- Guide(ガイド線) が存在しないこと。
- Printable(印刷不可) 属性のみで構成されたレイヤーを「空」とみなすロジックの導入。
—
2. メモリ最適化とオブジェクト解放の鉄則
CorelDRAW VBAは、ガベージコレクションが脆弱だ。特にページ削除という「ドキュメント構造を破壊する操作」を繰り返す際、参照を保持したままにすると、メモリリークやアプリケーションの強制終了を招く。
鉄則:
1. 削除は必ず「最後尾からインデックスを逆転させて」行う。
2. `Set` したオブジェクトは、ループの都度 `Nothing` に戻す。
3. `Optimization` モードを有効にし、画面描画を停止させて実行時間を最小化する。
—
3. 実装:プロフェッショナル・パージ・スクリプト
以下は、大規模なマルチページドキュメントでも安全かつ高速に空ページを駆逐するための実装コードである。
Option Explicit
‘ 伝説的なアーキテクトによる空ページ一括削除ロジック
Public Sub PurgeEmptyPages()
Dim doc As Document
Dim i As Long
Dim pg As Page
Dim shpCount As Long
Set doc = ActiveDocument
‘ 最適化モードの開始:描画更新を止め、Undoステップを統合してパフォーマンスを最大化
Optimization = True
doc.BeginCommandGroup “PurgeEmptyPages”
On Error GoTo Cleanup
‘ 最後尾から走査する(前方から削除するとインデックスがずれるため)
For i = doc.Pages.Count To 1 Step -1
Set pg = doc.Pages(i)
‘ ページ内の全レイヤーを精査
shpCount = 0
Dim lyr As Layer
For Each lyr In pg.Layers
‘ 印刷可能なオブジェクトが存在するか確認
If lyr.Shapes.Count > 0 Then
shpCount = shpCount + lyr.Shapes.Count
End If
Next lyr
‘ ページが空の場合、かつ最後の1ページではない場合に削除
If shpCount = 0 Then
If doc.Pages.Count > 1 Then
pg.Delete
End If
End If
‘ オブジェクトの明示的解放
Set pg = Nothing
Next i
Cleanup:
doc.EndCommandGroup
Optimization = False
‘ 強制的に画面更新
Application.Refresh
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
—
4. シニアエンジニアへのヒント:レガシーとの共生
もしこれが数百ページに及ぶ自動組版データであれば、VBA単体ではなく、外部のWindows API(`User32.dll`)を用いてウィンドウの更新を抑制したり、ログを外部ファイルへ出力する設計が求められる。
また、大規模な修正を行う場合は、`doc.SaveAs` を用いて「一時的なクリーンコピー」を作成し、処理後にマスターと入れ替える手法を推奨する。これは、CorelDRAWの内部構造(`Internal Document Model`)におけるUNDO情報の肥大化をリセットし、ファイルそのものの断片化を防ぐためだ。
結論
ツールをただ使うのではなく、オブジェクトのライフサイクルを制御せよ。空ページを削除するという単純な操作一つとっても、その裏側にあるプロセスの整合性を担保することが、システム管理者の矜持である。
このスクリプトが、貴殿のファイル管理業務を劇的に効率化し、不要なトラブルから解放することを期待する。
