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

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺めて、「なんだか処理が遅いな」「画面がチラチラして目が疲れるな」と感じたことはありませんか?

そう、あなたが今直面しているそのもたつき、そして画面のちらつき――それはコードの書き方が悪いわけでも、PCのスペック不足でもありません。「CorelDRAWの描画エンジンに、余計な仕事を毎ミリ秒ごとにお願いしてしまっていること」が真の原因です。

今回は、数千個のオブジェクトを瞬時に、かつ美しく一括処理するための「描画停止の黄金律」を伝授します。ここをクリアすれば、あなたのマクロは見違えるほどの爆速に生まれ変わりますよ。さあ、一緒に本物のエンジニアへの階段を登りましょう!

なぜCorelDRAWのマクロは「遅い」と感じるのか?

私たちがVBAで「100個の四角形を作りなさい」と指示したとき、デフォルトの状態では、CorelDRAWは以下のような過酷な仕事を裏でこなしています。

1. 四角形を1つ作る
2. 「画面を再描画して!」(←余計なお世話)
3. 「ユーザーがマウスやキーボードを触ってないかイベントを監視して!」(←これも毎回の過剰な気配り)
4. 次の四角形を作る
5. 「また画面を再描画して!」

これを何百回、何千回と繰り返すのですから、画面がパカパカと点滅し、砂時計アイコンがクルクル回るのも無理はありません。CorelDRAWは優秀ゆえに、あなたが指示した細かな変更のたびに「画面の更新」と「イベントの監視」を律儀に実行してしまうのです。

これをピタッと止め、作業机の電気を消して集中モードに入るためのスイッチが、`Optimization = True``EventsEnabled = False` です。

爆速化の二大巨頭:Optimization と EventsEnabled の正体

この2つのプロパティの役割を、現場の感覚で分かりやすく整理しておきましょう。

  • `Optimization = True`(最適化モードの開始)
  • CorelDRAWの描画エンジンに対し、「今から大量の裏方仕事をするから、画面の描き直し(再描画)は一切しなくていいよ!」と命令します。結果、メモリの無駄な消費と画面のチラつきが完全に消え去り、処理速度が何倍にも跳ね上がります。
  • `EventsEnabled = False`(イベント無効化)
  • ドキュメントの変更やユーザーからの操作を受け付ける「イベントの検知」を一時的にシャットダウンします。これにより、マクロ実行中の予期せぬフリーズや、無駄な割り込み処理を防ぐことができます。

この2つは、いわば「大量生産工場のシャッターを下ろす行為」です。外野の雑音をシャットアウトし、一気に仕事を終わらせるための最強の組み合わせと言えます。

【実践】これだけは覚えておくべき鉄則の定型コード

実務でそのままコピペして使える、極めて安全かつ堅牢なプロシージャのテンプレートを用意しました。

CorelDRAW VBAにおける最大の鉄則、それは「エラー時や処理の途中でマクロが中断しても、必ず元の状態(描画・イベント有効)に戻すこと」です。これを怠ると、CorelDRAWの画面が固まったまま二度と操作できなくなる(いわゆるゾンビ状態)という悲劇が起きます。

そのため、VBAの `On Error GoTo` を使った「後始末の担保」が絶対に必要です。以下のコードをベースにすべてのバッチ処理を組み立てるようにしてください。

Sub BatchProcessTheWorld()
‘ —————————————————-
‘ 【重要】安全な変数の宣言
‘ —————————————————-
Dim startTime As Double
startTime = Timer ‘ 処理速度計測用

‘ —————————————————-
‘ 【鉄則1】エラーハンドリングの準備
‘ —————————————————-
On Error GoTo ErrorHandler

‘ —————————————————-
‘ 【鉄則2】描画停止とイベント無効化の実行(工場のシャッターを下ろす)
‘ —————————————————-
CorelDRAW.Optimization = True
CorelDRAW.EventsEnabled = False

‘ 画面の更新を完全にストップ(より強力にチラつきを防ぐ)
ActiveDocument.BeginCommandGroup “大量オブジェクト一括生成”

‘ —————————————————-
‘ ここからが「重たい」一括処理の本番
‘ (例:1000個の円をランダムに配置する地獄の処理)
‘ —————————————————-
Dim i As Long
Dim sh As Shape

For i = 1 to 1000
‘ 形状をバクバク作る(画面は一切描き直されないので爆速)
Set sh = ActiveLayer.CreateEllipse(i 2, i 2, 10, 10)
sh.Fill.UniformColor.CmykAssign 0, 100, 100, 0
Next i

‘ —————————————————-
‘ 【鉄則3】処理の完了とコマンドグループの確定
‘ —————————————————-
ActiveDocument.EndCommandGroup

‘ —————————————————-
‘ 【鉄則4】必ず元の状態に戻す(正常終了ルート)
‘ —————————————————-
CorelDRAW.Optimization = False
CorelDRAW.EventsEnabled = True

‘ 最後に一度だけ画面を強制リフレッシュ
ActiveWindow.Refresh

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

ErrorHandler:
‘ —————————————————-
‘ 【鉄則5】万が一エラーが起きたときの後始末(これがないと地獄を見ます)
‘ —————————————————-
On Error Resume Next

‘ コマンドグループが開いたままなら閉じる
ActiveDocument.EndCommandGroup

‘ 確実に設定を元に戻す
CorelDRAW.Optimization = False
CorelDRAW.EventsEnabled = True
ActiveWindow.Refresh

MsgBox “エラーが発生しました: ” & Err.Description, vbCritical

End Sub

コードの読み解きと知っておくべき注意点

上記のコードには、プロのエンジニアとしてのこだわりが詰まっています。いくつか重要なポイントを補足しておきましょう。

1. `ActiveWindow.Refresh` のタイミング

処理の途中で `Refresh` を入れる必要はありません。すべての処理が終わったあとに、一番最後の `Optimization = False` の下、またはその直後で1回だけ呼ぶのが正解です。これによって、仕上がった美しいデザインが一瞬で画面に表示されます。

2. なぜ `BeginCommandGroup` を使うのか?

Optimizationをかけている間は、CorelDRAWの「元に戻す(Undo)」の履歴管理も一時停止することがあります。`BeginCommandGroup` と `EndCommandGroup` で挟むことで、この一連の大量処理を「1つのUndoアクション」としてまとめることができ、メモリの節約とユーザビリティの向上を同時に達成できます。

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

今回は、大量処理におけるパフォーマンス改善の決定版である `Optimization = True``EventsEnabled = False` の正しい実装手順を解説しました。

  • 処理の前で描画とイベントを止める(工場のシャッターを閉める)
  • `On Error GoTo` を使って、中断時でも必ず元に戻すコードを書く(安全第一の保険)
  • 処理の最後で一気に画面をリフレッシュする(美しく仕上げる)

この型を一度マスターしてしまえば、どんなに複雑で重たいデザイン自動化スクリプトを書いても、怖くありません。CorelDRAWが驚くほど軽快に、あなたの命令を忠実にこなしてくれる相棒に変わります。

ここをクリアしたあなたなら、もう「マクロの記録」の初心者ではありません。自信を持って、次のステップへ進んでくださいね!

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