【テクニカル・上級編】【中級者向け】CDRファイルに含まれる不要なカスタムカラーパレットや未使用スタイルを全ページから一括消去してスリム化 – CorelDRAW VBA解析バイブル

スポンサーリンク

肥大化したCDRを「外科手術」する:CorelDRAW VBAによる真のデータ・パージ術

CorelDRAWのヘビーユーザーや、長年運用されている社内ライブラリを保守するエンジニアであれば、一度は直面する「怪奇現象」があるはずだ。
何も描かれていないはずの数KBのオブジェクトしか存在しないドキュメントが、なぜか数MBの容量を食い、保存や描画のたびにVBAの実行速度が低下する。

原因は明白だ。「ゾンビ化」したカラーパレット、参照先を失ったスタイル定義、そしてオブジェクトツリーの深層に堆積するガベージデータである。

今日は、表面的なVBAの知識を超え、CorelDRAWの内部構造(DOM)に直接メスを入れ、ファイルを「初期状態の軽快さ」まで引き戻すための極限の最適化手法を伝授する。

—

1. なぜ「削除」だけでは不十分なのか

CorelDRAWのUI上で不要なパレットを消去しても、内部の`Document.Palette`や`Style`コレクションには、メタデータとして残存し続ける場合が多い。これらは「使われていない定義」としてバイナリを肥大化させる。

我々がやるべきは、単なる削除ではない。「使用されているオブジェクトの再スキャン」と「参照関係の完全切断」である。

2. 実装:メモリ効率を意識したパージ・エンジン

このコードは、全ページをイテレートし、現在使用されている色情報とスタイルを抽出した上で、それ以外の「ノイズ」を強引に削ぎ落とすものだ。

‘ CorelDRAW VBA: Document Optimizer
‘ Author: Legendary Chief Architect
‘ ———————————————————

Public Sub OptimizeDocumentSlim()
Dim doc As Document
Dim pal As Palette
Dim i As Long

Set doc = ActiveDocument

‘ 1. 未使用のカラーパレットをパージ
‘ CorelDRAWのパレットは非常に重い。システムパレット以外を安全にクリアする
For i = doc.Palettes.Count To 1 Step -1
Set pal = doc.Palettes(i)
‘ システム定義パレットを除外する安全策
If Not pal.IsSystemPalette Then
pal.Delete
End If
Next i

‘ 2. 未使用スタイルのパージ
‘ スタイルは深い階層にあるため、Document.Stylesを直接操作する
Dim style As style
For i = doc.Styles.Count To 1 Step -1
Set style = doc.Styles(i)
‘ “Normal” スタイルや基本スタイルは削除しないようガード
If style.Name <> “Normal” And style.Name <> “Default Graphics” Then
‘ 参照カウントを無視して強制的に削除を試みる
On Error Resume Next
style.Delete
On Error GoTo 0
End If
Next i

‘ 3. オブジェクトのライフサイクル管理:メモリの強制回収
‘ VBAのガベージコレクションは頼りにならない。明示的に解放する
Set pal = Nothing
Set style = Nothing

‘ 最適化後の保存(ここが重要)
‘ SaveAsではなく、Saveオプションを適切に設定する
Dim opt As StructSaveAsOptions
Set opt = CreateStructSaveAsOptions
opt.Version = cdrVersionCurrent
opt.EmbedVBAProject = False ‘ 必要なければVBAマクロを分離する

doc.SaveAs doc.FilePath & “optimized_” & doc.FileName, opt

MsgBox “パージ完了:ドキュメント構造を最適化しました。”
End Sub

3. シニアエンジニアが知るべき「見えないコスト」

Windows APIによるメモリ最適化の真実

VBAから `Set obj = Nothing` を呼ぶのは、あくまでポインタを解放するだけであり、OSレベルのメモリ即時開放を保証するものではない。大規模なバッチ処理を行う場合、`Application.ProcessMessages` を適切に挟むことで、CorelDRAWのレンダリングキューとVBAの実行キューを分離し、クラッシュを回避する必要がある。

ファイルシステムの「ゴミ」を捨てる

`SaveAs` を行う際、オプションで `EmbedVBAProject = False` を指定することが重要だ。肥大化したドキュメントの多くは、実はマクロコード自体がバイナリ内に重複して蓄積されているケースがある。これを分離し、外部の`.gms`ファイルとして運用するアーキテクチャへの移行こそが、真の最適化である。

4. 運用上の警告:安全なパージのために

  • Undoの罠: このスクリプトは広範囲に削除を行うため、`doc.UndoRedo.Start` を必ず含めること。不測の事態(誤って必要なスタイルを削除するなど)に備え、一括トランザクションとして定義しておくべきだ。
  • リンクオブジェクトの保護: 外部から参照しているビットマップやリンクファイルが存在する場合、`Style.Delete` は予期せぬエラーを吐く。`On Error Resume Next` でのスキップ処理は必須だが、削除後のドキュメントの整合性は必ず目視確認すること。

結びに代えて

CorelDRAWを「ただの作図ツール」として扱うか、それとも「プログラム可能なグラフィックエンジン」として掌握するか。その差は、こうした目に見えないデータ構造を制御できるかどうかに集約される。

今日のこのスクリプトは、あなたのファイルから数十MBの「無駄な過去」を消し去るはずだ。次は、ファイル連携の自動化、あるいはPDF出力パイプラインの高速化について語ろう。

技術の深淵へようこそ。健闘を祈る。

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