現場のプロが教えるCorelDRAW VBA:不要な空白ページを「一網打尽」にするための堅牢な自動化術
CorelDRAWでマルチページドキュメントを扱う際、最も頭を悩ませるのが「無駄な空ページ」の存在だ。クライアントへの納品データや印刷用PDFを書き出す直前、数百ページの中から手作業で空ページを探す……そんな非効率な作業に時間を溶かしてはいないだろうか。
今回は、CorelDRAW VBAを駆使して、ドキュメント内の「真に空っぽなページ」を判定し、一括削除するプロフェッショナルなソリューションを伝授する。ただコードを動かすだけでなく、「なぜその判定ロジックなのか」という設計思想まで深く理解してほしい。
—
1. なぜ「空ページ」判定は難しいのか?
単に「ページ内にオブジェクトがないか?」を調べるだけでは不十分だ。CorelDRAWの世界では、以下のようなケースが「空」と見なされるかどうかの境界線になる。
- 非表示レイヤーの存在: 印刷には出ないが、データとしては存在する。
- ガイドライン: ページ上にガイドラインだけが残っている場合。
- 空のグループ: オブジェクトが一切含まれないグループ構造。
これらの「ノイズ」を排除し、「出力時に意味をなさないページ」を物理的に削除するというロジックを組むのが、現場で使えるスクリプトの必須条件だ。
—
2. 堅牢なパージスクリプトの実装
以下のコードは、ページを「後ろから前へ」走査する設計にしている。これは、リストのインデックスを前から処理すると、削除した瞬間にインデックスがズレて予期せぬ挙動(インデックスアウト)を引き起こすという、VBAの基本原則を回避するためだ。
Option Explicit
‘ ———————————————————
‘ 目的:ドキュメント内の描画物がないページを一括削除する
‘ 設計:逆順走査(Reverse Iteration)によるインデックスの安定化
‘ ———————————————————
Public Sub PurgeEmptyPages()
Dim doc As Document
Dim pg As Page
Dim i As Integer
Dim deletedCount As Integer
Set doc = ActiveDocument
‘ ページが1枚しかない場合は削除しない安全装置
If doc.Pages.Count <= 1 Then
MsgBox "ページが1枚のみのため、削除を中止しました。", vbInformation
Exit Sub
End If
deletedCount = 0
' 後ろから前に走査する(必須:削除によるインデックスのズレ防止)
For i = doc.Pages.Count To 1 Step -1
Set pg = doc.Pages(i)
' ページ内にオブジェクトが存在するか判定
' Layer.Shapes.Count は、そのレイヤー上の形状数を返す
If IsPageEmpty(pg) Then
pg.Delete
deletedCount = deletedCount + 1
End If
Next i
MsgBox deletedCount & " ページの空ページをパージしました。", vbInformation
End Sub
' ---------------------------------------------------------
' ページが空かどうかを判定するロジック
' ---------------------------------------------------------
Private Function IsPageEmpty(pg As Page) As Boolean
Dim lyr As Layer
' 全レイヤーをチェック
For Each lyr In pg.Layers
' 印刷不可レイヤーや非表示レイヤーを無視するかは要件に応じて調整
' ここでは「形状が1つでもあれば空ではない」と判定
If lyr.Shapes.Count > 0 Then
IsPageEmpty = False
Exit Function
End If
Next lyr
‘ 全てのレイヤーに形状がなければ空と判定
IsPageEmpty = True
End Function
—
3. このコードを実務で使いこなすための知見
インデックスの逆順走査は「鉄則」
前述の通り、`For i = 1 To doc.Pages.Count` で削除処理を行うと、2ページ目を消した瞬間に元の3ページ目が2ページ目となり、ループが正しく機能しなくなる。CorelDRAW VBAに限らず、コレクションを操作する際は「必ず後ろから」がエンジニアの共通言語だ。
パフォーマンスへの配慮
もしドキュメントが数千ページに及ぶ場合、`ActiveDocument.Save` をループの合間に挟むのは避けるべきだ。ディスクI/Oがボトルネックとなり、処理時間が数倍に跳ね上がる。基本的には「メモリ上で全処理を完結させ、最後に保存を促す」のが最適解である。
拡張のヒント:データベース連携
もしこの処理を「社内の管理システム(DB)と連携させたい」のであれば、VBA単体ではなく、以下のようなワークフローを検討してほしい。
1. VBA側: ドキュメントのファイル名とページ数をCSV/JSONに出力。
2. 外部スクリプト(Python等): 出力されたデータを元に、DB上のステータスを更新。
3. 直接的なDB接続: VBAからADO経由でSQLを叩くことも可能だが、セキュリティや保守性を考慮すると、ファイル渡しの方が圧倒的にトラブルが少ない。
—
結論:自動化は「品質」のためにある
このスクリプトを使えば、手作業によるミス(消してはいけないページを消す、あるいは消し忘れる)を物理的に根絶できる。
自動化の本質は「楽をすること」ではない。「人間がやると必ず揺らぐ品質を、機械に委ねることで担保すること」にある。このコードをベースに、皆さんの現場のルールに合わせて細かな条件(特定の名前のレイヤーは無視する等)を追加し、最強のツールへと昇華させてほしい。
何か不明点があれば、コードの深淵を覗く覚悟で質問してくるといい。君たちの業務効率化を全力でバックアップする。
