【実務・中級編】Optimization = TrueとEventsEnabled = Falseの併用による「描画フリーズ防止と高速化」の極意 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBA開発において、数千個のオブジェクトをループで処理するマクロを組んだ際、画面が激しく点滅し、処理が完了するまでPCがフリーズしたような状態に陥ったことはないだろうか。

実務で使える堅牢な自動化ツールを目指すなら、画面描画とイベントの制御は避けて通れない最重要課題だ。今回は、CorelDRAWのポテンシャルを極限まで引き出し、処理速度を劇的に向上させるための2大巨頭「Optimization = True」「EventsEnabled = False」の併用による極意を伝授する。

なぜデフォルトのままでは遅いのか? CorelDRAWの描画ライフサイクル

CorelDRAWは、VBAからオブジェクトが1つ生成・変形されるたびに、以下の重い処理を裏で実行している。

1. 画面の再描画(Redraw): 変更があった矩形領域を計算し、ビューポートを強制的に更新する。
2. UIとイベントの同期: 選択状態の変化やドキュメントの変更を監視し、ドッキングウィンドウやプロパティバーを更新する。

数千回のループ内でこれが起これば、CPUの大部分が「描画」と「UIの監視」に奪われる。VBAのコード自体は一瞬で終わるはずの計算が、描画のオーバーヘッドによって何十倍もの時間を要することになるのだ。

この無駄を根絶し、CPUのパワーを純粋なデータ処理に集中させるのが今回の最適化テクニックである。

最速を生み出す2つのスイッチ

CorelDRAW VBAには、このオーバーヘッドを強制遮断するための強力なプロパティが用意されている。

1. `Application.Optimization = True`

これを発動すると、CorelDRAWの画面描画エンジンが一時停止(サスペンド)される。オブジェクトの追加、削除、移動を行っても、画面は一歩も動かない。メモリ上だけで高速に図形が構築されていく。

2. `Application.EventsEnabled = False`

VBAの実行中に発生するCorelDRAWの内部イベント(`DocumentAfterCreate`や選択変更など)を無効化する。これにより、余計なイベントハンドラの暴発やUIの更新処理を防ぎ、予期せぬバグや速度低下を完全にシャットアウトする。

【重要】絶対に守るべき「エラーハンドリング」の鉄則

これら2つのプロパティを操作する上で、絶対に破ってはならない鉄則がある。それは、「処理の途中でエラーが発生し、`Optimization`や`EventsEnabled`が元の状態に戻らないままマクロが終了すると、CorelDRAWのUIが壊れたままフリーズする」という点だ。

最悪の場合、CorelDRAWを強制終了するしかなく、未保存のデータが吹き飛ぶ。したがって、実務で使うプロダクションコードでは、必ず `On Error Goto` を使った確実な復元(クリーンアップ)構造を組まなければならない。

コピペで使える!プロダクション・テンプレートコード

以下のコードは、数千個の円をグリッド状に一括生成する処理を、極限まで最適化した実務仕様のサンプルだ。安全なエラーハンドリングと、処理時間の計測ロジックも組み込んでいる。

Sub CreateThousandsOfObjectsOptimized()
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

‘ Undo(元に戻す)のグループ化を開始(処理単位でまとめることでメモリ効率向上)
Dim undoScopeID As Long
undoScopeID = Application.BeginUndo(“大量オブジェクトの一括生成”)

‘ —————————————————-
‘ 3. メインの重い処理(例:2500個の円を描画)
‘ —————————————————-
Dim doc As Document
Set doc = ActiveDocument

Dim i As Long, j As Long
Dim x As Double, y As Double
Dim s As Shape

‘ アクティブレイヤーを取得
Dim layer As layer
Set layer = doc.ActiveLayer

For i = 1 to 50
For j = 1 to 50
x = i 10
y = j 10
‘ 形状の作成(画面描画は完全抑制されているため一瞬)
Set s = layer.CreateEllipse(x, y, x + 8, y + 8)
s.Fill.UniformColor.RGBAAssign 255, 100, 50
s.Outline.SetNoOutline
Next j
Next i

‘ —————————————————-
ウ 4. 正常終了時のクリーンアップ
‘ —————————————————-
Application.EndUndo undoScopeID

‘ 設定を必ず元に戻す
Application.Optimization = originalOptimization
Application.EventsEnabled = originalEvents

‘ 画面を強制的に一度だけ再描画
Application.ActiveWindow.Refresh

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

ErrorHandler:
‘ —————————————————-
‘ 5. 異常終了時のフェイルセーフ
‘ —————————————————-
If undoScopeID > 0 Then
Application.AbortUndo
End If

‘ エラーが発生しても必ず描画フラグを元に戻す!
Application.Optimization = originalOptimization
Application.EventsEnabled = originalEvents
Application.ActiveWindow.Refresh

MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub

チーフアーキテクトからの実務アドバイス

このテクニックを導入するだけで、体感速度は10倍から場合によっては100倍以上に跳ね上がる。「マクロが重い」「実用に耐えない」と諦める前に、まずはこのフレームワークを適用してほしい。

さらに実務の現場では、データベースや外部CSVから数万件のデータを読み込んでCorelDRAW上に展開する処理も多い。その際も、データ処理のループ全体をこの `Optimization` で挟むことで、安定かつ高速なインポートツールを構築できる。

プロフェッショナルなVBA開発者とは、ただ動くコードを書く人間ではなく、「システムの負荷とリスクを完全にコントロールできる人間」を指す。この極意をあなたの開発武器庫に加え、堅牢で爆速なCorelDRAWソリューションを構築してほしい。

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