こんにちは!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が驚くほど軽快に、あなたの命令を忠実にこなしてくれる相棒に変わります。
ここをクリアしたあなたなら、もう「マクロの記録」の初心者ではありません。自信を持って、次のステップへ進んでくださいね!
