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

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して図形をポチポチ動かしていた「あの頃」から一歩進み、自分の手でデザインを自在に操るプログラムを書く――最高にワクワクするステージに来ましたね。

さて、あなたが今、こんな壁にぶつかっているのを見たことがあります。

「数千個のオブジェクトをループで処理したら、画面が激しくチカチカしてフリーズしたみたいになり、終わるころにはコーヒーを一杯飲み干せるほどの時間がかかっている……」

もし心当たりがあるなら、大正解です。この記事にたどり着いたあなたは、もうただの初心者の枠を超えています。なぜなら、CorelDRAWというモンスター級の描画エンジンを相手にする時に避けて通れない「パフォーマンスの壁」に直面しているからです。

今回は、数千個のオブジェクトを一瞬で料理し、画面のちらつきを完全にねじ伏せるCorelDRAW VBAの極意「`Optimization = True` と `EventsEnabled = False` の併用」について、エンジニアの先輩として優しく、かつ本質を突き刺すように解説していきますね。

ここをクリアすれば、あなたのマクロは見違えるほど軽快になりますよ!

1. なぜCorelDRAWのマクロは遅くなるのか?(根本原因の理解)

まずは敵を知ることから始めましょう。
VBAで次のようなコードを書いたとします。

Dim i As Long
For i = 1 to 5000
ActiveLayer.CreateRectangle 0, 0, i, i
Next i

人間から見れば「ただ5000個の四角形を作るだけ」の処理ですが、CorelDRAWの内部(C++で書かれた描画エンジン)では、1回ループが回るたびに以下の大仕事をしています。

1. 「おっ、新しい図形ができたぞ! すぐに画面を再描画せよ!」(画面の更新)
2. 「ユーザーが何か触ったかもしれないから、イベントの監視を続けよう」(イベントの監視)
3. 「アンドゥ(元に戻す)用のメモリをバッチリ確保しとくぜ」(履歴の管理)

これを5000回繰り返すわけです。そりゃあ画面もフリーズしますし、パソコンのファンも爆音で回り始めますよね。画面は1回描き変われば十分なのに、1工程ごとにキャンバスを塗り直しているのが最大の無駄なのです。

2. 救世主の登場:Optimization と EventsEnabled の正体

この無駄なやり取りをピタッと止め、CorelDRAWを「無言の超高速作業マシーン」に変貌させる魔法の呪文が、以下の2つのプロパティです。

① `Optimization = True` (最適化モードの起動)

  • 意味: 「いまから大量の処理をするから、画面の再描画を一切しなくていいよ!」とCorelDRAWに命令します。
  • 効果: 画面のちらつき(フリーズ現象)が完全に消滅し、計算処理だけに集中するためスピードが劇的に跳ね上がります。

② `EventsEnabled = False` (イベント無効化)

  • 意味: 「処理の途中でユーザーからのマウス操作やイベントを検知しなくていいよ!」と伝えます。
  • 効果: 余計な割り込み処理がなくなるため、メモリの負荷が減り、安定性が増します。

この2つをセットで使うことで、CorelDRAWは背後のエンジンルームの扉をピシャリと閉め、限界突破のパフォーマンスを発揮できるようになります。

3. 実践! 劇的なスピードアップを体験するコード

百聞は一見に如かず。実際にこの極意を組み込んだプロフェッショナルなコードを見てみましょう。
今回は、アクティブページにランダムなサイズの四角形を2000個生成するスクリプトで比較してみます。

Sub HighSpeedProcessingDemo()
Dim startTime As Double
startTime = Timer ‘ 実行時間計測用

‘ ==========================================
‘ 【極意①】最適化とイベント無効化の開始
‘ ==========================================
CorelDRAW.Optimization = True
CorelDRAW.EventsEnabled = False

‘ 万が一のエラー時でも元に戻るための「保険」(超重要!)
On Error GoTo ErrorHandler

Dim i As Long
Dim s As Shape

‘ 2000個の四角形を生成するループ処理
For i = 1 To 2000
‘ 座標を少しずつずらして矩形を作成
Set s = ActivePage.CreateRectangle(i 0.5, i 0.5, i 0.5 + 10, i 0.5 + 10)

‘ 塗りつぶしの色を適当に変えるなどの処理もここで一括で行う
s.Fill.UniformColor.CmykAssign 0, 100, 100, 0
Next i

ErrorHandler:
‘ ==========================================
‘ 【極意②】後始末(絶対に忘れてはいけない!)
‘ ==========================================
CorelDRAW.EventsEnabled = True
CorelDRAW.Optimization = False

‘ 強制的に画面を1回だけ最新の状態に再描画する
ActiveWindow.Refresh

‘ 処理時間を表示
Dim endTime As Double
endTime = Timer
MsgBox “処理が完了しました! 実行時間: ” & Format(endTime – startTime, “0.00”) & ” 秒”, vbInformation

End Sub

このコードの美しさと注意すべきポイント

1. 必ず「元に戻す(Reset)」をセットで行うこと
`Optimization = True` や `EventsEnabled = False` にしたままマクロが終了してしまうと、CorelDRAWの画面が二度と更新されなくなったり、マウス操作を受け付けなくなったりする致命的なバグ(ゾンビ状態)を引き起こします。そのため、`On Error GoTo` を使って、エラーが起きようとも確実に元の状態(`False` と `True`)に戻す仕組みが必須です。
2. 最後に `ActiveWindow.Refresh` を呼ぶ
描画をずっと止めていたので、処理が終わった瞬間に「さあ、今の結果を見せてくれ!」とCorelDRAWに画面を強制更新(リフレッシュ)させます。これによって、一瞬で綺麗に成果物が画面に現れます。

4. 現場でありがちな失敗と「先輩からのアドバイス」

初心者のうちは、よく次のようなミスをやらかしてしまいます。

  • × エラー処理をサボる

「テストだから大丈夫か」と `On Error` を書かずに実行し、エラーでマクロが途中で止まった結果、CorelDRAWが固まったようになって冷や汗をかく……というのは、エンジニアの誰もが通る通過点です(笑)。必ず後始末のコードはセットで書きましょう。

  • × 処理の途中で `MsgBox` を挟む

Optimization中に `MsgBox` を出すと、画面描画のロックとポップアップの表示が干渉して挙動がおかしくなることがあります。デバッグのときは、メッセージボックスではなく `Debug.Print` をイミディエイトウインドウに出力するのがスマートです。

まとめ

いかがでしたでしょうか?
今回学んだ `Optimization` と `EventsEnabled` のコントロールは、CorelDRAW VBAにおける「パフォーマンスチューニングの基本にして極意」です。

  • 数千個のオブジェクトを扱うときは、必ず描画とイベントを止める。
  • 処理が終わったら、確実に元に戻して画面をリフレッシュする。

このお作法を身につけたあなたは、もう「マクロの記録を貼り付けるだけの初学者」ではありません。大規模なドキュメントや複雑なデザインデータをも一瞬で自動処理する、頼もしいCorelDRAW自動化エンジニアの仲間入りです。

日々のデザイン・レイアウト作業のストレスを、あなたの書いた美しいコードで華麗に吹き飛ばしてくださいね。応援しています!

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