CorelDRAW VBAを掌握する極限の知見:肥大化したCDRファイルを極限まで軽量化するパージ・エンジン
業務で長年運用されているCorelDRAW(CDR)ファイルを開いたとき、「なぜか数ページしかないのにファイルサイズが数十MBもある」「オブジェクトを全削除してもファイルが軽くならない」という絶望的な状況に直面したことはないだろうか。
原因は明白だ。ドキュメントの裏側で、使われなくなった無数の「カスタム・カラーパレット(スポットカラー含む)」、残骸となった「フォント・スタイル」、そして参照を失った「リソース」が肥大化し、ドキュメントデータベースの領域を圧迫し続けているのだ。
今回は、CorelDRAW VBAのオブジェクトモデルの深層に切り込み、不要なカラーパレットと未使用フォントスタイルを完全自動パージし、実務レベルでファイルサイズを劇的に圧縮する堅牢なメンテナンススクリプトを伝授する。
—
1. なぜCorelDRAWは「ゴミ」を溜め込むのか?(アーキテクチャの罠)
多くの開発者は、「不要なシェイプを `Delete` すればファイルが軽くなる」という幻想を抱いている。しかし、CorelDRAWの内部構造(RIFFベースのコンテナ構造)において、以下のリソースはユーザーが明示的にパージ(削除)命令を出さない限り、ドキュメント内部に永続保持される仕様になっている。
1. パレットの残骸 (Color Profiles / PaletteStyles):
過去にインポートした画像やEPS、他所からコピペしたオブジェクトが持っていたドキュメントパレットが、そのまま居座り続ける。
2. 未使用のテキストスタイル (Text Styles):
段落スタイルや文字スタイルが自動生成された挙句、テキストフレームを消してもスタイル定義だけがスタイルのツリー構造に残存する。
これらを人力で整理するのは、数千アイテムを抱える実務において不可能だ。だからこそ、VBAによる自動化が不可欠となる。
—
2. 堅牢なパージ・エンジン設計の3大原則
実務用の自動化スクリプトを書くにあたり、アマチュアコードとプロのプロダクションコードの境界線はどこにあるか? それは「エラーハンドリング」「オブジェクトのライフサイクル管理」「トランザクション的思考」だ。
- `On Error Resume Next` の乱用禁止:
エラーを握りつぶすと、存在しないオブジェクトへの操作でVBAがフリーズするか、メモリリークを引き起こす。正確なエラーチェックを行うか、制御されたスコープでのみトラップすること。
- コレクションの逆順ループ (Backward Loop):
配列やコレクション(特にCorelDRAWの `Styles` や `Colors`)の要素を前から順に削除すると、インデックスがズレて致命的なバグ(実行時エラーや要素のスキップ)を生む。削除は必ず末尾から先頭へ向かって行うこと。
- Undo(アンドゥ)のブロック化:
重い処理の前後に `Optimization = True` と `ActiveDocument.BeginCommandGroup` を挟み、パフォーマンスの最大化と一括アトミック処理(失敗時のロールバック)を担保する。
—
3. 実装コード:完全自動パージスクリプト
以下のコードは、現在アクティブなドキュメントから「未使用のスタイル(フォント・オブジェクトスタイル含む)」と「使われていないパレットカラー」を徹底的にスキャンし、パージするプロダクションコードだ。
Option Explicit
Sub PurgeUnusedDocumentResources()
‘ =========================================================================
‘ 処理名: CDRドキュメント軽量化パージ・エンジン
‘ 概要: 未使用のスタイルおよび不要なカラーリソースを安全に削除し、
‘ ファイルサイズを劇的に圧縮します。
‘ ターゲット: CorelDRAW 2019以降 (VBA 7.1+)
‘ =========================================================================
Dim doc As Document
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “パージ・エラー”
Exit Sub
End If
‘ 実務における鉄則:画面描画とイベントを抑制して爆発的な高速化を図る
EventsEnabled = False
Optimization = True
doc.BeginCommandGroup “Document Purge and Optimization”
On Error GoTo ErrorHandler
Dim deletedStylesCount As Long
Dim deletedColorsCount As Long
deletedStylesCount = 0
deletedColorsCount = 0
‘ ————————————————————————-
‘ 1. 未使用テキストスタイル・グラフィックスタイルのパージ
‘ ————————————————————————-
Dim i As Long
Dim st As Style
‘ コレクションの削除は必ず「後ろから前へ (Backward)」ループさせる
For i = doc.Styles.Count To 1 Step -1
Set st = doc.Styles(i)
‘ デフォルトの基本スタイル(Root, Normal等)は削除対象外とする
If Not st.IsDependent And Not IsDefaultStyle(st.Name) Then
‘ スタイルがドキュメント内のどのオブジェクトからも参照されていないか判定
If st.ReferencesCount = 0 Then
st.Delete
deletedStylesCount = deletedStylesCount + 1
End If
End If
Next i
‘ ————————————————————————-
‘ 2. 未使用パレットカラー(Spot/Custom Colors)のパージ
‘ ————————————————————————-
Dim col As PaletteColor
Dim pal As Palette
‘ ドキュメントに埋め込まれているカスタムパレットを走査
For Each pal In doc.PaletteProfiles
If pal.Type = cdrPaletteDocument Then
For i = pal.Colors.Count To 1 Step -1
Set col = pal.Colors(i)
‘ オブジェクトから参照されていないカラーを削除
If col.ReferencesCount = 0 Then
pal.Colors.Delete (i)
deletedColorsCount = deletedColorsCount + 1
End If
Next i
End If
Next pal
‘ トランザクションのコミット
doc.EndCommandGroup
Optimization = False
EventsEnabled = True
ActiveWindow.Refresh
‘ 完了レポート
MsgBox “ドキュメントの最適化が完了しました。” & vbCrLf & _
“・削除された未使用スタイル数: ” & deletedStylesCount & vbCrLf & _
“・削除された不要カラー数: ” & deletedColorsCount & vbCrLf & _
vbCrLf & “※必ず「名前を付けて保存」を行い、ファイルサイズの変化を確認してください。”, _
vbInformation, “パージ完了”
Exit Sub
ErrorHandler:
‘ 異常終了時の安全装置
doc.EndCommandGroup
Optimization = False
EventsEnabled = True
ActiveWindow.Refresh
MsgBox “パージ処理中に予期せぬエラーが発生しました。” & vbCrLf & _
“Error # ” & Err.Number & “: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ ————————————————————————-
‘ 補助関数: CorelDRAWのシステム予約スタイル名を除外するための判定
‘ ————————————————————————-
Private Function IsDefaultStyle(ByVal styleName As String) As Boolean
Select Case LCase(styleName)
Case “normal”, “graphic default”, “艺术字默认”, “標準”, “グラフィック既定”
IsDefaultStyle = True
Case Else
If InStr(1, styleName, “Default”, vbTextCompare) > 0 Then
IsDefaultStyle = True
Else
IsDefaultStyle = False
End If
End Select
End Function
—
4. このコードが「現場のプロ」に選ばれる理由
1. `Optimization = True` による爆発的な高速化:
CorelDRAWはVBAからオブジェクトを1つ操作するたびに、画面の再描画(UI Redraw)とアンドゥスタックの構築を試みる。このフラグを立てることで、メモリ上で直接一括処理を行い、処理時間を数分から数秒へと短縮する。
2. `ReferencesCount` プロパティの厳格な活用:
「現在、ドキュメント内のどこからも参照されていない」ことを論理的に証明できるため、誤ってデザインに必要なスタイルや色を消し去るリスクを完全に排除している。
3. 多言語環境(言語差異)への配慮:
CorelDRAWの標準スタイル名はインストールされているOS言語(日本語、英語、中国語等)によって名称が変わる。補助関数 `IsDefaultStyle` 内で主要なシステム予約語を弾く設計にすることで、グローバルな開発環境でも破綻しない。
—
5. チーフアーキテクトからの実践的アドバイス
このマクロを実行した後、ファイルサイズを本当に最小化させるためには「別名で保存(Save As)」を必ず行うこと。CorelDRAWの内部データベースは、ファイルを単に上書き保存しただけでは断片化された領域(フリースペース)がそのまま残る仕様になっている。「別名で保存」をかけることで、ファイル構造が再構築され、真の軽量化(パージの効果)がディスク上に反映される。
業務自動化において、コードを書くことは手段に過ぎない。真の目的は、「手作業のノイズを排除し、システムを常に健全な状態に保つこと」だ。このパージ・エンジンをあなたのパイプラインに組み込み、肥大化するCDRファイルのストレスからチームを解放してほしい。
