こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して図形を動かしてみたものの、「なんだか実行するたびに画面がカクカクして遅いな…」「処理が終わるまで何秒も待たされるのはストレスだな…」と感じたことはありませんか?
マクロの記録が吐き出すコードをそのまま実行すると、VBAは親切心(?)から、図形が1ミリ動くたび、1つ生成されるたびに、画面の再描画とイベントの監視を律儀に行います。 これが、大量のオブジェクトを扱うときにマクロが劇的に遅くなる本当の原因です。
今回は、CorelDRAW VBAのパフォーマンスを極限まで引き出し、プロのエンジニアが必ず実装している「画面描画とイベントの完全停止テクニック」を、優しく、そして本質的なところまで徹底的に解説していきますね。
ここをクリアすれば、あなたのマクロは見違えるほどのスピードを手に入れますよ!
—
なぜCorelDRAWのマクロは遅くなるのか?
まずは敵を知ることから始めましょう。
CorelDRAWで何千個もの丸や四角をコードで並べると想像してください。通常の状態では、VBAは次のようなサイクルをぐるぐる回しています。
1. 「四角形を1個描いたよ!」 $\rightarrow$ (画面をパッと再描画)
2. 「ユーザーが触っていないかイベントを監視!」
3. 「次の四角形を描いたよ!」 $\rightarrow$ (また画面をパッと再描画)
4. 「イベント監視!」
人間には認識できないほどの高速とはいえ、この「描画」と「監視」のコストは、CPUやメモリにとって非常に重労働です。これが「画面のちらつき(フリッカー)」を引き起こし、全体の処理時間を何倍にも膨れ上がらせています。
解決の鍵は「Optimization」と「EventsEnabled」
CorelDRAW VBAには、この無駄なやり取りをピタッと止めるための強力なプロパティが用意されています。
- `Optimization = True` : 画面の再描画(レンダリング)を一時停止し、メモリ上で黙々と作業を進めます。
- `EventsEnabled = False` : ドキュメントの変更イベントなどの監視を一時停止し、余計な割り込みを防ぎます。
この2つを組み合わせることで、CorelDRAWを「超集中モード」に突入させることができるのです。
—
プロが使っている「鉄壁の定型パターン」
それでは実際のコードを見ていきましょう。
ただ止めるだけではなく、「エラーが発生しても必ず元の状態に戻す(さもないとCorelDRAWがフリーズしたような状態になる)」という、実務で絶対に守るべき安全管理も含めた実装パターンです。
以下のコードをコピーして、VBAエディタ(Alt + F11)に貼り付けてみてください。
Sub HighSpeedShapeGeneration()
Dim startTime As Double
startTime = Timer ‘ 実行時間計測用
‘ — 【重要】安全な最適化の開始 —
‘ 万が一エラーが起きても元の状態に戻せるよう、エラー処理を準備します
On Error GoTo ErrorHandler
‘ 1. 画面の再描画をストップ!
CorelDRAW.Optimization = True
‘ 2. イベントの監視をストップ!
CorelDRAW.EventsEnabled = False
‘ 3. 画面の更新を完全に凍結(CorelDRAW固有の強力なメソッド)
ActiveDocument.BeginCommandGroup “高速図形生成”
‘ ———————————
‘ ここからが実際の重い処理(例:1000個の円をランダムに配置)
Dim i As Long
Dim s As Shape
For i = 1 to 1000
‘ 画面が描画されないため、このループは一瞬で終わります
Set s = ActiveLayer.CreateEllipse(Rnd 200, Rnd 200, Rnd 200 + 10, Rnd 200 + 10)
s.Fill.UniformColor.AssignCreateCMYK 0, 100, 100, 0 ‘ 赤色にする
Next i
‘ — 【重要】最適化の終了処理 —
‘ 処理が成功したら、必ず元に戻します
ActiveDocument.EndCommandGroup
CorelDRAW.EventsEnabled = True
CorelDRAW.Optimization = False
‘ 最後に1回だけ画面を強制再描画
ActiveWindow.Refresh
MsgBox “処理が完了しました! 実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub
ErrorHandler:
‘ 【超重要】エラー時にここへジャンプし、CorelDRAWが固まるのを防ぎます
ActiveDocument.EndCommandGroup
CorelDRAW.EventsEnabled = True
CorelDRAW.Optimization = False
ActiveWindow.Refresh
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
コードの解説:ここがポイント!
1. `On Error GoTo ErrorHandler` のお約束
`Optimization = True` や `EventsEnabled = False` にした状態でコードがエラーを起こして途中で止まると、CorelDRAWの画面が二度と再描画されなくなったり、イベントがフリーズしたままになる致命的な状態に陥ります。
そのため、必ずエラーハンドラ(避難経路)を用意し、どんな状況でも必ず元の状態に戻す(`Optimization = False` にする)のがプロの鉄則です。
2. `BeginCommandGroup` と `EndCommandGroup`
これらは、大量の操作を「1つのグループ(アンドゥの単位)」としてCorelDRAWに認識させるためのものです。これを使用することで、処理が速くなるだけでなく、マクロ実行後にCtrl+Z(元に戻す)を押したとき、1000個作った図形が一発で綺麗に消えるようになります。ユーザービリティの観点からも欠かせない記述です。
3. 終わりの合図 `ActiveWindow.Refresh`
処理の最後で `Optimization = False` に戻したら、最後に手動で `ActiveWindow.Refresh` を呼び出してあげましょう。これで、隠されていた成果物が「ドーン!」と一気に美しく画面上に描き出されます。
—
まとめ:今日からあなたのマクロは生まれ変わる
今回は、CorelDRAW VBAにおける高速化の極意、`Optimization` と `EventsEnabled` の使い方を解説しました。
- 処理の最初で画面描画とイベントを止める!
- 重い処理を黙々と実行させる!
- 処理の最後(またはエラー時)に必ず元の状態に戻し、最後に画面をリフレッシュする!
この型を覚えるだけで、今までイライラしていた大量データの処理が、まるで嘘のように快適に動くようになります。ぜひ、あなたの日常業務やデザイン自動化のスクリプトに取り入れてみてくださいね。
ここをクリアすれば、CorelDRAW VBAの基本はもうバッチリです!
次のステップでも、現場で役立つマニアックで実践的な知見をお届けしていきますので、お楽しみに!
