【入門編】【上級プロ向け】Application.Optimization = True を駆使した超高速バッチ処理とメモリリーク完全防止のメモリ管理術 – CorelDRAW VBA解析バイブル

スポンサーリンク
スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:数百ページを爆速で捌く「最適化」と「メモリ管理」の極意

こんにちは。自動化の深淵へようこそ。

「マクロの記録」から一歩踏み出し、自分でコードを書き始めたあなた。素晴らしい一歩です。しかし、ある時、あなたは壁にぶつかるはずです。「コードは正しいはずなのに、なぜこんなに遅いんだ?」「ページ数が増えると、CorelDRAWが固まって動かなくなる……」と。

それは、あなたがCorelDRAWという巨大なアプリケーションの「挙動(ライフサイクル)」を、まだコントロールできていないからです。

今日は、単なるコードの書き方ではなく、プロのエンジニアが現場で行う「Application.Optimization」を駆使した超高速化テクニックと、システムをクラッシュさせないための「メモリ管理術」を伝授します。ここをクリアすれば、あなたのVBAは「ただ動くツール」から「プロフェッショナルな自動化エンジン」へと進化します。

1. なぜあなたのマクロは「遅い」のか?

CorelDRAWは、非常にリッチなグラフィックエンジンを持っています。あなたがVBAで「ガイド線を1本引く」という命令を出した瞬間、CorelDRAWの裏側では以下のことが起きています。

1. コマンドを実行する
2. 画面を描画し直す(リフレッシュ)
3. ユーザーインターフェース(UI)の状態を更新する
4. 他のイベント(マウス操作など)を受け付けられる状態にする

数百ページのドキュメントに対して、ループ処理でガイド線を引いたりレイヤーを追加したりすると、この「描画」と「UI更新」が毎回発生します。計算そのものよりも、この「画面への表示」に膨大なCPUリソースが奪われているのです。

これこそが、低速化の正体です。

2. 魔法の杖 `Application.Optimization`

この無駄なプロセスを完全に封印するのが、`Application.Optimization` プロパティです。

Application.Optimization = True

これを `True` に設定した瞬間、CorelDRAWは「描画モード」から「思考モード」へと切り替わります。画面の更新を停止し、内部的な計算だけに集中する。これにより、処理速度は劇的に、時に数十倍に跳ね上がります。

しかし、ここには致命的な罠があります。

⚠️ プロが教える「致命的な罠」

`Optimization = True` にしたまま処理を終えたり、途中でエラーが発生してマクロが止まったりすると、CorelDRAWの画面が一切更新されなくなります。 ユーザーから見れば「フリーズした」ようにしか見えません。

これを防ぐために、必ず「エラーハンドリング」と「最後に必ずFalseに戻す処理」をセットで書くのが鉄則です。

3. メモリリークを根絶する「オブジェクトの解放」

大規模なバッチ処理において、もう一つ重要なのがメモリ管理です。

VBAでは、`Set Page = ActiveDocument.Pages(1)` のようにオブジェクトを変数に代入します。このとき、変数 `Page` は、メモリ上にある実際のページオブジェクトを指し示す「ポインタ(参照)」を持ちます。

ループの中で大量のオブジェクト(ページ、レイヤー、図形)を生成し続けると、それらの参照がメモリに残り続け、CorelDRAWがメモリ不足でクラッシュする……これが「メモリリーク」です。

「使い終わったら、明示的に `Nothing` を代入して、参照を切り離す」
これが、伝説のアーキテクトが守る鉄の掟です。

4. 【実践】超高速バッチ処理のテンプレート

それでは、これまでの知見をすべて詰め込んだ、実戦投入可能なコードを紹介します。
このコードは、全ページに対して「新しいレイヤーを追加し、特定の場所にガイド線を配置する」という重い処理を、極限まで高速化して実行するものです。

Option Explicit

''' <summary>
''' 全ページに対してレイヤー追加とガイド線配置を高速に行うプロフェッショナル・ルーチン
''' </summary>
Sub HighSpeedBatchProcess()
    Dim doc As Document
    Dim pg As Page
    Dim lyr As Layer
    Dim gLine As Guide
    
    ' 1. エラーハンドリングの設定(重要!)
    ' エラーが発生しても、必ず「後片付け」のセクションへ飛ばす
    On Error GoTo ErrorHandler

    Set doc = ActiveDocument
    If doc Is Nothing Then
        MsgBox "ドキュメントが開かれていません。", vbCritical
        Exit Sub
    End If

    ' 2. 最適化の開始(描画停止・爆速モードへ)
    ' これにより、描画によるオーバーヘッドを完全に排除します
    Application.Optimization = True
    ' 画面更新の抑制(さらに念入りに)
    Application.EventsEnabled = False 

    Debug.Print "処理開始: " & Now

    ' 3. メインループ処理
    For Each pg In doc.Pages
        ' --- レイヤー操作 ---
        ' 新しいレイヤーを作成
        Set lyr = pg.CreateLayer("Auto_Layer_" & pg.Index)
        
        ' --- ガイド線操作 ---
        ' 垂直ガイド線を中央に配置する例
        Set gLine = pg.AddGuide(cdrVerticalGuide, pg.SizeWidth / 2)
        
        ' --- メモリ管理の極意 ---
        ' ループ内で作成したオブジェクトの参照を、
        ' 次のループへ行く前に「明示的に解放」することでメモリリークを防ぎます。
        ' ※ 単純な変数なら自動解放されますが、大規模処理では習慣化が重要です。
        Set gLine = Nothing
        Set lyr = Nothing
        ' Pageオブジェクト自体はループの継続に必要なので、ここでNothingにはしません
    Next pg

    ' 4. 正常終了時の後片付け
    GoTo CleanUp

ErrorHandler:
    ' エラーが発生した場合のログ出力
    MsgBox "エラーが発生しました: " & Err.Description, vbExclamation

CleanUp:
    ' 5. 最適化の解除(ここが最も重要!)
    ' どんな状況でも、必ず描画モードに戻し、イベントを再開させます。
    Application.Optimization = False
    Application.EventsEnabled = True
    
    ' 画面を強制的に再描画して、結果を表示させる
    Application.Refresh
    
    Debug.Print "処理完了: " & Now
    MsgBox "バッチ処理が正常に完了しました。", vbInformation

End Sub

5. コードの解説とプロの視点

なぜ `On Error GoTo ErrorHandler` が必要なのか?

もし、途中でエラーが起きてマクロが止まり、`Optimization = True` のまま放置されたらどうなるか? あなたのCorelDRAWは、操作を受け付けない「死んだ状態」になります。`CleanUp` セクションへジャンプさせることで、「エラーが起きても必ず描画モードを元に戻す」という安全装置を組み込んでいるのです。

`Application.Refresh` の重み

`Optimization = False` にしただけでは、画面は古い情報のままです。`Application.Refresh` を呼び出すことで、CorelDRAWに対して「さあ、計算が終わったから、最新の状態を画面に描いてくれ!」と命令します。これが、プロの仕上げです。

開発のアドバイス

最初は、この「最適化」を外して動かしてみてください。そして、ページ数を50、100と増やしていくと、速度の差に驚愕するはずです。

まとめ:ここをクリアすれば、基本はバッチリです

1. `Application.Optimization = True` で描画を止め、爆速化せよ。
2. エラーハンドリングを必ず実装し、途中で止まっても「描画モード」を戻せるようにせよ。
3. `Set obj = Nothing` を意識し、メモリの浪費を防げ。
4. 最後に `Application.Refresh` で、美しい結果を画面に映し出せ。

これらを意識できるようになった時、あなたは単なる「マクロ利用者」を卒業し、CorelDRAWを自在に操る「自動化エンジニア」の仲間入りを果たしています。

さあ、次はもっと複雑な、数千ページに及ぶ巨大なプロジェクトに挑戦してみましょう。応援していますよ!

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