【実務・中級編】【メモリリーク対策】Document.Close呼び出し時のSaveChangesパラメータの正しい制御とオブジェクト変数のNothingクリア – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの「死」を回避せよ:メモリリークを根絶するDocument管理の極意

現場で自動化ツールを開発していると、必ず直面する壁がある。スクリプトを走らせるたびにCorelDRAWのプロセス(`CorelDRW.exe`)がタスクマネージャに居座り、メモリを食いつぶしていく現象だ。

「マクロを実行するたびにPCが重くなる」。これはプロのエンジニアとしてあってはならない。今回は、CorelDRAWのオブジェクトライフサイクルを掌握し、メモリリークを物理的に封殺するための「堅牢なドキュメント処理術」を伝授する。

1. なぜ「Close」だけでは不十分なのか?

CorelDRAWのオブジェクトモデルにおいて、`Document`オブジェクトは非常に重い。単に `.Close` を呼べば済むと思ったら大間違いだ。

  • 参照の解放漏れ: 変数にドキュメントを格納したままにすると、VBAは「まだこのドキュメントが必要だ」と判断し、メモリ上に保持し続ける。
  • Dirtyフラグの迷走: `SaveChanges`引数を適切に制御しないと、ダイアログが裏側でポップアップし、プロセスがデッドロック状態に陥る。
  • 非同期的なプロセス終了: `Application.Quit`を呼ぶタイミングを誤ると、ファイルI/Oが完了する前にプロセスが消失し、データ破損を招く。

これらを解決する唯一の道は、「スコープの限定」と「明示的な破棄」の徹底である。

2. 堅牢なドキュメント制御のプロダクション・コード

以下のコードは、数千件のファイル処理にも耐えうる、実務向けのテンプレートだ。

Public Sub ProcessDocumentSafely(ByVal filePath As String)
Dim doc As Document

‘ エラーハンドリングの要。どんな状況でもメモリを解放する
On Error GoTo Cleanup

‘ 1. ドキュメントを開く(非表示で開くことで描画負荷を軽減)
Set doc = Application.OpenDocument(filePath)

‘ — ここに業務ロジックを記述 —
‘ 例: doc.ActiveLayer.CreateArtisticText 0, 0, “Processed”
‘ —————————-

Cleanup:
‘ 2. エラー発生時でも必ずここを通す
If Not doc Is Nothing Then
‘ 保存せずに閉じる場合は cdrDoNotSaveChanges を指定
‘ 変更を反映する場合は cdrSaveChanges を使用
doc.Close cdrDoNotSaveChanges

‘ 3. 最重要:オブジェクト変数を明示的にNothingへ
Set doc = Nothing
End If

‘ エラー発生時は呼び出し元へ通知
If Err.Number <> 0 Then
MsgBox “処理中にエラー発生: ” & Err.Description, vbCritical
End If
End Sub

3. 開発者が守るべき「3つの鉄則」

① `cdrSaveChanges` と `cdrDoNotSaveChanges` の使い分け

バッチ処理において最も怖いのは「保存確認ダイアログ」がバックグラウンドで出ることだ。スクリプトが止まり、ユーザーはUIが見えないためフリーズしたと勘違いする。
「自動処理ならダイアログは絶対に出さない」。これが鉄則だ。特定の条件を満たした時のみ `doc.Save` を叩き、それ以外は `cdrDoNotSaveChanges` で閉じる設計にすべきだ。

② `Nothing` 代入の哲学

VBAのガベージコレクションは優秀ではない。スコープ(`End Sub`)を抜ければ自動的に解放されるという甘い考えは捨てろ。「使い終わった瞬間に `Set obj = Nothing`」。この習慣が、長時間のバッチ処理における安定性を担保する。

③ データベース連携時のトランザクション管理

CorelDRAWで生成した情報をDBに送る場合、必ず「DB更新成功」を確認してから `doc.Close` を実行せよ。もしDB更新に失敗した際にドキュメントを閉じてしまうと、再試行が不可能になる。

  • 良い設計: `Open` -> `Logic` -> `DB Update` -> `Close` -> `Nothing`
  • 悪い設計: `Open` -> `Close` -> `Nothing` -> `DB Update` (参照が消えており、メタデータが取得できない)

最後に:プロとアマの境界線

メモリリーク対策を「後回し」にするエンジニアは、ツールを「使い捨て」と捉えている。だが、私たちが作る自動化ツールは、現場の業務を支えるインフラだ。

CorelDRAWのオブジェクトモデルは、確かにレガシーな側面も持つ。しかし、その内部構造を理解し、メモリのライフサイクルを制御下に置くことができれば、CorelDRAWは極めて強力な自動化エンジンに変貌する。

次回のコードレビューでは、`Nothing` を怠っていないか、`On Error` で後処理が担保されているかを厳しくチェックしてほしい。それが、世界最高峰のエンジニアへの第一歩だ。

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