【上級編】CorelDRAWを止めない:巨大ドキュメントを「分割攻略」するメモリ管理術
こんにちは。CorelDRAWの自動化の世界へようこそ。
日々、数百ページに及ぶ巨大なCDRファイルと格闘し、実行のたびに「メモリ不足」の警告や、突然の強制終了(クラッシュ)に頭を抱えていませんか?
「マクロの記録」から一歩踏み出し、プロとして安定したシステムを組むためには、「CorelDRAWがどのようにメモリを食い潰すか」という生態系を理解する必要があります。今日は、巨大ドキュメントを安全に処理するための「分割読み込み」と「メモリ解放」の極意を伝授します。
—
1. なぜ巨大CDRファイルでクラッシュするのか?
CorelDRAWのオブジェクトモデル(`Document`や`Page`)は、非常に強力ですが、メモリを贅沢に消費します。
数百ページあるファイルを一度に読み込み、全ページをメモリ上に展開した状態でループ処理を回すと、CorelDRAWは「ページごとの描画情報」や「UNDO履歴」をメモリ上に積み上げます。これが限界を超えた瞬間、OSからメモリ回収命令を受け取れず、無慈悲な強制終了が発生するのです。
プロの鉄則:一度にすべてを扱おうとしない。
—
2. メモリ管理の設計パターン:ページ単位の動的処理
全てのページを一つの`Document`オブジェクトとして抱えるのではなく、「処理が必要な最小単位(ページやレイヤー)のみをアクティブにする」というアプローチを取ります。
実践:メモリを保護するバッチ処理コード
以下のコードは、巨大なドキュメントをページ単位で走査し、メモリを極力解放しながら処理を継続するテンプレートです。
Sub ProcessHugeDocument_SafeMode()
Dim doc As Document
Dim i As Long
Dim totalPages As Long
‘ 画面更新を停止(描画負荷を抑える)
Application.Optimization = True
‘ ドキュメントを開く(非表示で開くとメモリ負荷が減る)
Set doc = Application.OpenDocument(“C:\Data\HugeFile.cdr”)
totalPages = doc.Pages.Count
For i = 1 To totalPages
‘ 1. 現在のページにフォーカスを当てる
doc.Pages(i).Activate
‘ 2. ここにページごとの処理を記述
Call ProcessPageContent(doc.Pages(i))
‘ 3. 【重要】メモリ解放のための小技
‘ 特定のオブジェクトを明示的にNothingにしてメモリを強制解放する
DoEvents ‘ OSに処理の隙間を与える
‘ 定期的にUNDO履歴をクリアすることでメモリを節約
If i Mod 10 = 0 Then
doc.UndoRedo.Clear
End If
Next i
‘ 終了処理
Application.Optimization = False
Application.Refresh
MsgBox “全ページ処理完了。”
End Sub
Sub ProcessPageContent(p As Page)
‘ ページ内のオブジェクト処理
‘ ここで複雑なループを回す場合は、極力変数のスコープを限定する
Dim sh As Shape
For Each sh In p.Shapes
‘ 処理内容…
Next sh
End Sub
—
3. 陥りやすいエラーと回避策
① `UndoRedo.Clear` を忘れる
CorelDRAWは、マクロによる操作一つひとつを「取り消し可能」な履歴として保持します。数千個のオブジェクトを処理すれば、履歴だけで数GBのメモリを消費します。`doc.UndoRedo.Clear` は、巨大バッチ処理における「究極のメモリクリーナー」です。
② `DoEvents` を軽視する
`DoEvents` は、VBAの処理を一時停止し、OSが溜まっているGUIイベント(ウィンドウの再描画など)を処理する機会を与えます。これがないと、CorelDRAWは「応答なし」状態と誤認されやすくなります。
③ オブジェクト変数に `Set` し続ける
ループ内で新しいオブジェクト(`Shape`や`Curve`)を生成し続けると、参照カウントが溜まり、VBA側でメモリリークを引き起こします。ループの最後で `Set sh = Nothing` と記述する癖をつけましょう。
—
4. チーフアーキテクトからのアドバイス
「マクロの記録」で生成されたコードは、いわば「初心者の書く日記」です。そこから脱却するために、今日から以下の3点を意識してください。
1. Optimization(最適化)の利用: `Application.Optimization = True` は、描画を止めることで処理速度を劇的に向上させます。
2. スコープの最小化: 変数は必要以上に外側で定義せず、使う場所の直前で定義する。
3. エラーハンドリング: `On Error GoTo` を入れ、ページごとにエラーを握りつぶさず、ログを書き出す仕組みを作る。
CorelDRAW VBAは、使いこなせば最強の武器になります。まずはこの「分割処理」のパターンを自分のライブラリに組み込んでみてください。これだけで、あなたのマクロはプロフェッショナルな品質に一歩近づきます。
何か壁にぶつかったら、いつでもここへ戻ってきてください。設計が正しければ、どんな巨大なデータも必ず制することができますよ。
