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ソリューションを構築してほしい。
