【実務・中級編】【パフォーマンス改善】Optimization = TrueとEventsEnabled = Falseの組み合わせによる描画停止の正しい実装手順 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:数万のオブジェクトを瞬殺する描画凍結の極意

業務自動化エンジニアの皆さん、日々のCorelDRAW自動化において、「数千、数万点におよぶオブジェクトを一括生成・変形するマクロを動かしたら、画面が激しくチラつき、砂時計が回り続け、挙句の果てにフリーズした」という絶望を味わったことはないだろうか。

素人が書いたVBAコードは、オブジェクトを1つ生成するたびに、OSへイベントを通知し、DOMツリーを再計算し、ビューポートの再描画(Invalidate/Update)を律儀に実行する。これがパフォーマンス低下の元凶だ。CorelDRAWという巨大なグラフィックエンジンを手なづけるには、「エンジンに余計な仕事をさせない」という冷徹な最適化の思想が必要不可欠となる。

今回は、CorelDRAW VBAにおけるパフォーマンス改善の絶対王者、`Optimization = True` と `EventsEnabled = False` を組み合わせた「描画完全凍結の正しい実装手順」を、プロダクションクオリティの堅牢な設計とともに伝授する。

1. なぜ「あのコード」は遅いのか? —— CorelDRAWの描画ライフサイクル

オブジェクトを大量生成するループ処理において、デフォルトの状態では以下の処理が1回ごとに発生している。

1. DOMの更新: アクティブドキュメントのオブジェクトツリーへの要素追加。
2. イベントのディスパッチ: `SelectionChange` や `ShapeCreate` などのアプリケーションイベントの監視と発火。
3. UIの再描画: 画面上のピクセルバッファのクリアと再レンダリング(画面のチラつきの発生源)。

数千回のループにおいて、純粋な計算処理は数ミリ秒であっても、UIの再描画とイベントハンドリングのオーバーヘッドによって、処理時間が何十倍にも膨れ上がる。これを根絶するのが、今回解説する2大フラグだ。

制御すべき2つのプロパティの正体

  • `Application.Optimization = True`

CorelDRAWの内部描画エンジンを一時停止させる。画面の更新や再描画、バッファのフラッシュを完全に抑止し、メモリ上でのデータ処理スピードを極限まで引き上げる。

  • `Application.EventsEnabled = False`

VBAからCorelDRAWへのイベント通知を遮断する。無駄なイベントトリガーの発生を防ぎ、予期せぬマクロの二重起動やイベントハンドラの暴走を物理的に防ぐ。

2. 【最重要】バグとリソースリークを防ぐ「鉄則の定型コード」

これら2つのフラグを操作する上で、プロフェッショナルとして絶対に守らなければならない鉄則がある。それは、「例外(エラー)が発生しても、必ずフラグが元の状態(True)に戻る構造にすること」だ。

もし、エラーハンドリング(`On Error Goto`)をサボって途中でコードが異常終了した場合、`Optimization` が `True` のまま、あるいは `EventsEnabled` が `False` のままCorelDRAWが放置される。結果、画面が一切更新されなくなったり、ユーザー操作を受け付けなくなったりという致命的な「ゾンビ状態」に陥る。

以下のプロダクションコードは、このリスクを完全に排除した、実務でそのまま使える堅牢なテンプレートである。

プロダクション・テンプレートコード

Sub MasterBatchProcessTemplate()
‘ —————————————————-
定制設計: 描画凍結と例外処理を担保した安全なバッチ処理基盤
‘ —————————————————-
Dim startTime As Double
startTime = Timer

‘ 1. 事前状態の退避(必要に応じて)
Dim originalOptimization As Boolean
Dim originalEvents As Boolean

originalOptimization = Application.Optimization
originalEvents = Application.EventsEnabled

‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler

‘ 2. 【核心】描画とイベントの完全凍結
Application.Optimization = True
Application.EventsEnabled = False

‘ 画面のちらつき防止のダメ押し(必要に応じスクリーンアップデート制御)
ActiveDocument.BeginCommandGroup “大量オブジェクト一括生成”

‘ ====================================================
‘ 【メイン処理領域】ここに重い処理を記述する
‘ ====================================================
Dim i As Long
Dim sh As Shape
Dim lyr As Layer
Set lyr = ActiveLayer

For i = 1 to 5000
‘ 例:5重心の円をランダムに敷き詰める極めて重い処理
Set sh = lyr.CreateEllipse2(Rnd 500, Rnd 500, 5, 5)
sh.Fill.UniformColor.RGBAColor 255, 0, 0
sh.Outline.SetNoOutline
Next i
‘ ====================================================

‘ トランザクションの正常終了
ActiveDocument.EndCommandGroup

‘ 3. 正常終了時の復旧
Application.Optimization = False
Application.EventsEnabled = True

‘ 強制的な画面リフレッシュと再描画
ActiveWindow.Refresh
DoEvents

MsgBox “処理が完了しました。実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub

ErrorHandler:
‘ 4. 【極めて重要】異常終了時の確実な復旧処理
‘ エラーで止まっても、ここで必ずフラグを戻し、アンドゥグループを閉じる
On Error Resume Next
ActiveDocument.EndCommandGroup

Application.Optimization = originalOptimization
Application.EventsEnabled = originalEvents

ActiveWindow.Refresh

MsgBox “致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical

End Sub

3. 現場で生きる! ファイル連携・データベース連携時の注意点

この「描画凍結テクニック」は、外部のCSV、Excel、あるいはSQLデータベースからデータをバルク(一括)取得し、CorelDRAW上で名刺やカタログ、商品タグなどを何千枚も自動生成するようなシステム連携基盤において真価を発揮する。

ここで、実務開発者が見落としがちな2つの罠を指摘しておこう。

注意点1: `DoEvents` の挿入タイミング

数万件のレコードを処理する場合、`EventsEnabled = False` にしている間はユーザーからの「キャンセル(Escキーなど)」を受け付けなくなる。もし数分単位の処理になる場合は、ループの一定数ごと(例: 500回に1回)に `DoEvents` を挟みたくなる衝動に駆られる。
しかし、`Optimization = True` の状態で下手に `DoEvents` を挟むと、CorelDRAWの内部状態が不安定になり、描画バッファの整合性が崩れてクラッシュの原因になる。重いループの中では `DoEvents` は絶対に挟まない。 代わりに、処理の粒度を細かく分割するか、プログレスバーは非同期ではなく一定間隔でステータスバー文字列を書き換える程度に留めること。

注意点2: メモリリークの防止(オブジェクトの解放)

VBAはガベージコレクションの挙動が曖昧だ。大量の `Shape` オブジェクトを生成・変形する際、ループ内で変数(`Set sh = Nothing` など)を適切に開放しないと、Windowsのメモリを食いつぶし、途中から劇的に処理速度が落ちる(あるいはOutOfMemoryで落ちる)。
大量処理のループ内では、オブジェクト変数を使い回すか、不要になった段階で明示的にメモリを解放するコーディング規準を徹底してほしい。

4. チーフアーキテクトからの総括

CorelDRAW VBAにおけるパフォーマンスチューニングは、小手先のテクニックではなく「アーキテクチャの思想」そのものだ。

  • 描画を止め、
  • イベントを遮断し、
  • トランザクションで束ね、
  • いかなる例外でも確実に元に戻す。

この鉄則を体に叩き込むことで、あなたの書くマクロは、単なる「動くスクリプト」から、現場の生産性を劇的に変える「堅牢なミドルウェア」へと昇華する。
プロフェッショナルとしての誇りを持ち、圧倒的なパフォーマンスを誇る自動化ツールを構築してほしい。健闘を祈る。

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