【CorelDRAW VBA】肥大化したCDRファイルを劇的軽量化!カラーパレット&不要スタイルの完全クレンジング術
こんにちは!CorelDRAW VBAの世界へようこそ。
日々、多くのベクターデータを扱っていると「なぜかこのCDRファイル、オブジェクト数が少ないのに容量が数十メガバイトもある…」「保存や動作がとにかく重い…」といった現象に遭遇したことはありませんか?
外部から読み込んだデータや、長年編集を繰り返してきたファイルには、目に見えない「不要なカラーパレット」「増殖したスタイルシート」「未使用のシンボル定義」が大量のゴミデータ(ゴーストデータ)として蓄積されます。
今回は、マクロの記録を卒業し、一歩先の「CorelDRAW APIのオブジェクト操作」へと踏み出す中級者のあなたに向けて、ファイル容量を劇的に軽量化するメンテナンス用VBAプログラムの構築法を分かりやすく解説します。
ここをクリアすれば、CorelDRAW VBAの基本構造とパフォーマンス制御はバッチリですよ!
—
1. なぜCDRファイルは「ゴミデータ」で重くなるのか?
コードを書く前に、まずは敵の正体を知っておきましょう。
CorelDRAWのCDRファイルは、実質的に「XMLファイル群とグラフィックリソースが圧縮されたコンテナ」です。画面上の図形を消しても、以下のようなメタデータがドキュメント内部のデータベースに残り続けることがあります。
【CDRファイルの内部構造イメージ】
CDR Document (ZIP Container)
├── Page 1, Page 2 … (実際の図形データ)
└── Document Meta Data (★ここが肥大化の原因!)
├── Color Styles (過去に使用した大量のカラー情報)
├── StyleSheets (図形や文字のスタイル定義の樹形図)
├── Custom Views (保存された表示エリアの履歴)
└── Symbol Library (参照されていないシンボル)
特に「別のファイルからオブジェクトをコピー&ペースト」した際、そのオブジェクトに付随していたカラー定義やグラフィックスタイルが、ターゲット側のファイルに「自動的に移植され、二度と消えない」という仕様が肥大化の最大の原因です。
これらをVBAでピンポイントに一掃(パージ)してあげることが、今回のゴールです。
—
2. 高速&確実にクレンジングを行う3つの鉄則
VBAでドキュメント内のオブジェクト群を一括削除・整理する場合、CorelDRAWエンジニアとして絶対に押さえておくべき「3つの鉄則」があります。
① 描画更新とイベントの停止(`Optimization`)
画面の再描画をオンにしたまま数百個のスタイルを削除すると、1回削除するごとに画面がチラつき、処理解理に膨大な時間がかかります。`Application.Optimization = True` にして描画を停止させるのがお決まりの超高速化テクニックです。
② コレクション削除は「後ろから」(`Step -1`)
スタイルやオブジェクトなどの要素(コレクション)をループ処理で削除する場合、先頭(`1`)から削除していくと、インデックス番号がズレてエラーになります。必ず「最後の要素から逆順に(`Count To 1 Step -1`)」削除するのがプロのセオリーです。
③ トラップ処理とエラーハンドリング
途中でエラーが起きても、停止させた描画更新(`Optimization`)を確実に元に戻す `Try-Finally` 的なエラー処理ルーチンを組むことが必須です。
—
3. 完全版:CDR軽量化&クレンジングVBAコード
それでは、実際に現場でそのまま使えるクレンジング・マクロのコードを見ていきましょう。標準モジュールに以下のコードを貼り付けて実行してみてください。
Option Explicit
‘ ==============================================================================
‘ 処理名:PurgeAndOptimizeDocument
‘ 概要 :CDRファイル内の未使用カラースタイル、表示履歴、シンボル等を一括削除し、
‘ ファイル容量を劇的に軽量化するメンテナンス用マクロ
‘ ==============================================================================
Public Sub PurgeAndOptimizeDocument()
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが開かれていない場合は安全に終了
If doc Is Nothing Then
MsgBox “作業対象のドキュメントが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If
‘ — パフォーマンス設定と元の状態の保持 —
Dim originalOptimization As Boolean
Dim originalEvents As Boolean
originalOptimization = Application.Optimization
originalEvents = Application.EventsEnabled
On Error GoTo ErrorHandler
‘ 1. 画面描画とイベント出力を一時停止(処理速度が数十倍になります)
Application.Optimization = True
Application.EventsEnabled = False
Dim purgeCount As Long
purgeCount = 0
‘ ————————————————————————–
‘ ステップ 1: 未使用の「カラースタイル」を一掃する
‘ ————————————————————————–
If doc.ColorStyles.Count > 0 Then
Dim i As Long
‘ 必ず末尾(Count)から1に向かって逆順でループ削除する
For i = doc.ColorStyles.Count To 1 Step -1
doc.ColorStyles(i).Delete
purgeCount = purgeCount + 1
Next i
End If
‘ ————————————————————————–
‘ ステップ 2: 未使用の「カスタム表示ビュー」を削除する
‘ ————————————————————————–
If doc.Views.Count > 0 Then
Dim vIdx As Long
For vIdx = doc.Views.Count To 1 Step -1
doc.Views(vIdx).Delete
Next vIdx
End If
‘ ————————————————————————–
‘ ステップ 3: 不要な「シンボル定義」のパージ(CorelDRAW組み込みAPI)
‘ ————————————————————————–
‘ ページ上に配置されていない未使用シンボルをライブラリから消去
On Error Resume Next ‘ シンボルが存在しない場合のエラー回避
doc.SymbolLibrary.PurgeUnusedSymbols
On Error GoTo ErrorHandler
‘ ————————————————————————–
‘ ステップ 4: 未使用のグラフィック・テキストスタイルの整理
‘ ————————————————————————–
‘ ※CorelDRAWでは標準スタイル以外の迷子スタイルを削除
Dim st As StyleSheet
For Each st In doc.StyleSheets
‘ 標準のスタイル以外かつ、子要素を持たない不要スタイルを整理
If Not st.IsBuiltIn And st.Children.Count = 0 Then
On Error Resume Next
st.Delete
On Error GoTo ErrorHandler
End If
Next st
‘ — 後処理:描画更新を復元 —
Application.Optimization = originalOptimization
Application.EventsEnabled = originalEvents
Application.Refresh
‘ 完了報告
MsgBox “ドキュメントのクレンジングが完了しました!” & vbCrLf & _
“削除したカラースタイル数: ” & purgeCount & ” 個” & vbCrLf & vbCrLf & _
“※効果を確定させるため、一度『名前を付けて保存』を行ってください。”, _
vbInformation, “軽量化成功”
Exit Sub
‘ エラー発生時の安全装置(描画が止まったままになるのを防ぐ)
ErrorHandler:
Application.Optimization = originalOptimization
Application.EventsEnabled = originalEvents
Application.Refresh
MsgBox “クレンジング中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードのポイントを深掘り解説!
中級者へのステップアップとして、上記コードで特に重要な「CorelDRAW APIの仕掛け」を解説します。
① `Application.Optimization = True` の魔法
このプロパティを `True` に設定すると、CorelDRAWはマクロの実行中に画面を書き換えるのをストップします。
これにより、数百回の削除処理が一瞬で終わるようになります。ただし、処理が終わった後に `Application.Optimization = False`(元の状態)に戻して `Application.Refresh` を呼ばないと、「画面が固まったまま動かない」ように見えるので注意してください。そのため、エラーハンドラー内にも必ず復元処理を入れるのがアーキテクトの作法です。
② なぜ `Step -1` で逆順に回すのか?
例えば、要素が3つ([A], [B], [C])あるリストから、1番目の [A] を削除したとします。
すると、残った [B] が「新しい1番目」、[C] が「新しい2番目」にズレます。
直進ループ(`1 To Count`)で2回目の処理を行うと、VBAは「2番目」にアクセスしようとしますが、現在の2番目は [C] になっており、元の [B] を見落としてしまう(スキップしてしまう)のです。末尾から削除していけば、前の要素のインデックス番号は一切ズレないため、確実に全件削除できます。
—
5. 【極意】それでも軽くならない時の「極限の処方箋」
今回紹介したコードを実行してもファイルサイズが小さくならない場合、過去のバージョンから引き継がれた「重度に汚染されたスタイルツリー」がXMLの深層に残っている可能性があります。
そんな時に私たちが現場で使う「最終兵器」の考え方を伝授しておきますね。
【極意】クリーンな新ドキュメントへの「全要素移植」
ファイルそのものの「枠組み」が壊れている場合は、VBAで「新規ドキュメントを作り、そこに全オブジェクトをコピーして別名保存する」というアプローチが極めて有効です。
[汚染された重いファイル] ────────┐
│ (必要なベクターデータのみを抽出)
▼
[新規作成されたクリーンなファイル] ───> 【超軽量化されたCDR完成!】
既存のスタイル定義を引き継がずに、純粋な「図形情報だけ」を新しいキャンバスに流し込むことで、長年のゴミを100%遮断できます。このテクニックは、巨大なカタログデータや印刷所入稿用データの最終メンテで絶大な効果を発揮します。
—
6. まとめ
マクロの記録で作ったコードは、画面上の操作をそのまま追体験するため、処理が遅くゴミデータも残りやすくなります。しかし、今回のように Documentオブジェクトの階層(ColorStyles, StyleSheets, SymbolLibraryなど)に直接アクセスできるようになれば、CorelDRAWの挙動を完璧にコントロールできるようになります。
今回のポイントを復習しましょう!
1. CDRの肥大化は「見えないメタデータ(カラー・スタイル)」が原因
2. 大量削除は `Optimization = True` と `Step -1`(逆順ループ)が鉄則
3. エラー時にも画面更新を元に戻す安全設計を忘れない
このクレンジング用マクロをツールバーのボタンに登録しておけば、ワンクリックでいつでもファイルをリフレッシュできるようになりますよ。
ここをクリアできれば、CorelDRAW VBAの基本とデータ構造の理解はバッチリです!
ぜひあなたの実務ファイルでその劇的な効果を体感してみてくださいね。応援しています!
