こんにちは。CorelDRAWの自動化という「深淵」へようこそ。
マクロの記録ボタンを押して生成されるコードは、いわば「見習いが描いた荒いスケッチ」です。数個のファイルを処理するならそれで十分ですが、何千個ものCDRファイルを連続処理するとなると、そのコードは瞬く間にメモリを食い荒らし、CorelDRAWを「ゾンビ」に変えてしまうでしょう。
今日は、プロの現場で生き残るための「メモリ管理と安定性の極意」を伝授します。これを身につければ、あなたはもう初心者ではありません。
—
1. なぜあなたのマクロは「ゾンビ化」するのか?
CorelDRAWのVBAは、COM(Component Object Model)という仕組みの上で動いています。ここで最も恐ろしいのが「参照リーク」です。
VBAで `Set doc = Application.OpenDocument(path)` と書いたとき、メモリ上には「CDRファイル」という実体と、「doc」というそれを見張るポインタが生成されます。処理が終わった後に `Set doc = Nothing` を忘れると、CorelDRAWは「まだ誰かが見ているかもしれない」と勘違いし、メモリを解放しません。
これが何千回と繰り返されると、メモリは枯渇し、CorelDRAWは応答不能な「ゾンビプロセス」と化します。
—
2. ゾンビを生まないための「黄金のルール」
安全なバッチ処理を行うためのコード構造は、以下の3つを鉄則とします。
1. 参照を必ず Nothing にする: `Set` で代入したオブジェクトは、使い終わったら必ず `Nothing` にする。
2. エラーハンドリングで逃げ道を作る: 途中でファイルが壊れていても、プロセスを終了させない。
3. CorelDRAWの余計な機能をオフにする: 画面描画やプレビューはメモリを食います。バッチ処理中はこれらを抑制します。
—
3. 実践:何千個も安全に処理する「鉄壁のバッチフレームワーク」
以下は、メモリリークを極限まで排除したプロ仕様のテンプレートです。
Sub BatchProcessCommander()
Dim doc As Document
Dim folderPath As String
Dim fileName As String
‘ 1. 処理を高速化し、メモリ負荷を抑える設定
Application.Optimization = True
Application.EventsEnabled = False
folderPath = “C:\TargetFiles\” ‘ 処理対象フォルダ
fileName = Dir(folderPath & “.cdr”)
Do While fileName <> “”
‘ エラーハンドリング:ファイルが壊れていても次へ進む
On Error Resume Next
Set doc = Application.OpenDocument(folderPath & fileName)
If Err.Number = 0 Then
‘ — ここにメインの処理を記述 —
Call ProcessDocument(doc)
‘ 2. 処理後は必ず閉じてメモリを解放
doc.Close
Set doc = Nothing
Else
Debug.Print “エラー発生: ” & fileName
End If
On Error GoTo 0
fileName = Dir() ‘ 次のファイルへ
Loop
‘ 設定を元に戻す
Application.Optimization = False
Application.EventsEnabled = True
MsgBox “全処理が完了しました。”
End Sub
Sub ProcessDocument(ByRef doc As Document)
‘ 個別のドキュメントに対する処理
‘ ここでもオブジェクト生成(例: Shape)を行う場合は、
‘ 最後に Nothing にすることを忘れないこと
Dim s As Shape
For Each s In doc.ActivePage.Shapes
‘ 何らかの処理
Next s
Set s = Nothing
End Sub
—
4. プロとして気をつけるべき「落とし穴」
画面描画の最適化(Optimization)
`Application.Optimization = True` は魔法のコードです。これをONにすると、CorelDRAWは画面の再描画を停止します。これにより、処理速度が劇的に向上し、画面更新によるメモリ消費も抑えられます。ただし、処理終了後に必ず `False` に戻すことを忘れないでください。さもないと、CorelDRAWの画面が真っ白なまま動かなくなります。
オブジェクトの入れ子に注意
`doc.ActivePage.Layers(1).Shapes(1)` のようにドットで繋いでアクセスするのは便利ですが、これは内部で一時的な「参照」を無意識に生成しています。
何千回もループする処理では、できるだけ中間変数に格納し、適切に `Nothing` を代入する習慣をつけてください。
—
最後に:エンジニアとしてのマインドセット
CorelDRAW VBAは非常にパワフルですが、同時に「作り手の管理能力」を試すツールでもあります。
「コードが動く」ことはゴールではありません。「何千回繰り返しても、メモリ使用量がフラットに保たれていること」が、プロの書くコードの基準です。
今日学んだ `Set = Nothing` とエラーハンドリングをマスターすれば、もうあなたのマクロが真夜中にメモリを食い尽くしてクラッシュすることはありません。さあ、次はどんな巨大なプロジェクトを自動化しましょうか?
ここをクリアしたあなたなら、もうCorelDRAW自動化の門を完全にくぐり抜けたと言っていいでしょう。応援しています!
