CorelDRAW VBAを掌握する極限の知見:画面描画のちらつきを完全になくす!OptimizationとEventsEnabledを使ったマクロ高速化の極意
開発プロジェクトのリーダーである私たちが、現場のデザイナーやオペレーターから最も頻繁に受けるクレームは何だか知っているか?
「マクロを実行すると、画面が激しく点滅して固まったようになり、終わるまで何も操作できない」
そして、こう続く。「手動でやった方が早いんじゃないか?」と。
もし、あなたの書いたCorelDRAWのVBAコードが、1つ図形を生成するたびにキャンバスを再描画し、ユーザーの操作イベントを律儀に監視しているとしたら……それはエンジニアとしての怠慢と言わざるを得ない。CorelDRAWのオブジェクトモデルの重み、そしてWindows GDIの描画コストを理解していれば、そんな実装は絶対に選ばないはずだ。
今回は、CorelDRAW VBAにおけるパフォーマンスチューニングの絶対王者であり、プロフェッショナルであれば「呼吸をするように記述すべき」2大巨頭——`Optimization` と `EventsEnabled` の極意を伝授する。
—
なぜデフォルトのコードは遅いのか?(オブジェクトモデルの残酷な真実)
CorelDRAWで数千個のオブジェクトをループ処理で生成・変形するマクロを書いたとしよう。素人が書いたコードはこうだ。
‘ 【アンチパターン】絶対にやってはいけないコード
Dim i As Long
For i = 1 to 5000
ActiveLayer.CreateRectangle 0, 0, 10, 10
Next i
このコードが実行されるとき、CorelDRAWの内部では何が起きているか?
1. 1オブジェクト生成ごとにDOM(Document Object Model)が更新される。
2. 1オブジェクト生成ごとに画面(UIビューポート)の再描画(Paintイベント)が走る。
3. ユーザーのマウスやキーボード操作、ドキュメントの変更イベントを監視し続ける。
結果として、CPUは「図形の計算」よりも「画面の描き直し」と「イベントの監視」にリソースの大半を奪われ、処理速度は極限まで低下する。これが、画面がちらつき、フリーズしたようになる根本原因だ。
我々はプロだ。CPUのリソースを「真に意味のある演算(ジオメトリの生成)」だけに集中させなければならない。
—
爆速化の二大巨頭:Optimization と EventsEnabled
CorelDRAWのVBA環境において、この無駄なオーバーヘッドを断ち切るスイッチが用意されている。それが `Application` オブジェクトが持つ以下の2つのプロパティだ。
1. `Optimization`
- 画面の再描画を完全に凍結(フリーズ)させる。
- 内部のバッファだけで演算を行い、処理が完了した瞬間に一括して画面へ反映させる。
2. `EventsEnabled`
- アプリケーションが発火するイベントの監視を一時的に無効化する。
- 不要なイベントフックを防ぎ、メモリ消費とCPU負荷を劇的に軽減する。
この2つを適切に組み合わせることで、処理速度が数倍〜数十倍に跳ね上がり、画面のちらつきは「完全にゼロ」になる。
—
【実務必須】バグを生み出さない堅牢なテンプレート構造
ここで最も重要な注意点がある。`Optimization = True` や `EventsEnabled = False` にしたコードの途中で、もし実行時エラー(Runtime Error)が発生したらどうなるか?
答えは悪夢だ。画面は描画されないままフリーズし、イベントは受け付けず、CorelDRAWはゾンビ状態(ハングアップ)に陥る。最悪の場合、未保存のデータが吹き飛ぶ。
したがって、プロの現場では `On Error GoTo` による確実な例外処理(クリーンアップ処理) とのセットが絶対のルールとなる。
以下に、実務でそのまま使えるプロダクションコードのテンプレートを提示する。
‘ ==============================================================================
‘ Module: 業務効率化・一括処理標準モジュール
‘ Theme: 画面描画最適化とイベント無効化による爆速処理テンプレート
‘ ==============================================================================
Sub MasterBatchProcessTemplate()
Dim startTime As Double
startTime = Timer
‘ 1. エラーハンドラーの宣言
On Error GoTo ErrorHandler
‘ 2. 【最重要】最適化とイベント無効化の適用
With Application
.Optimization = True ‘ 画面描画を停止
.EventsEnabled = False ‘ イベント監視を停止
.UndoStart “一括処理バッチ” ‘ Undo(元に戻す)のグループ化
End With
‘ — ここからメインの重い処理 —
Dim i As Long
Dim sh As Shape
Dim activeDoc As Document
Set activeDoc = ActiveDocument
‘ 例:5000個の矩形を高速生成するシミュレーション
For i = 1 To 5000
‘ 座標を計算して配置(CorelDRAWの内部メモリ上で完結)
Set sh = activeDoc.ActiveLayer.CreateRectangle( _
(i Mod 50) 10, _
(i \ 50) 10, _
(i Mod 50) 10 + 8, _
(i \ 50) 10 + 8 _
)
‘ 必要であればプロパティを操作
sh.Fill.UniformColor.RGBAssign 255, 100, 0
Next i
‘ — メイン処理ここまで —
‘ 3. 正常終了時のクリーンアップ
With Application
.UndoFinish
.Optimization = False ‘ 描画を再開(ここで一括描画される)
.EventsEnabled = True ‘ イベント監視を再開
.Refresh ‘ 強制リフレッシュ
End With
MsgBox “処理が完了しました。実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 4. 異常終了時のフォールバック(ここがプロの生命線)
On Error Resume Next
With Application
.UndoCancel
.Optimization = False ‘ 必ず描画を戻す!
.EventsEnabled = True ‘ 必ずイベントを戻す!
.Refresh
End With
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
アーキテクトからの実践的アドバイス:ファイル・DB連携時の罠
実務では、この高速化ロジックに外部ファイル(CSVやExcel、あるいはSQL Serverなどのデータベース)からのデータインポートが絡んでくる。
ここで1点、現場でよくある失敗を指摘しておこう。
> 「データを外部から読み込みながら、ループの内部で都度データベースにログを書き込もうとするな」
もしデータベース連携や外部ファイルへの書き出しを行う場合、それらのI/O(入出力)処理は、CorelDRAWの `Optimization` ブロックの外で行うか、あるいはデータをすべてメモリ上の配列(Array)やコレクションに一度ロードし、CorelDRAW側の描画ブロックの最中には「描画のみ」を行わせるアーキテクチャにすべきだ。
ネットワークI/OやディスクI/Oが挟まると、VBAの実行コンテキストが変わり、予期せぬ描画の乱れやパフォーマンス低下を引き起こす。
「メモリ上でデータを完結させ、CorelDRAWのキャンバス操作はOptimizationで包み込む」。この分離設計(レイヤード・アーキテクチャの精神)を忘れてはならない。
—
結びにかえて
プロとアマの差は、コードが動くかどうかではない。
「システム全体のリソースを支配し、予期せぬ障害(エラー)に対しても系を安全な状態に収束させられるか」、その一点に尽きる。
今回紹介した `Optimization` と `EventsEnabled`、そして堅牢なエラーハンドリングの組み合わせは、あなたが作るすべての業務自動化ツールにおいて標準装備(マスト)となるべきパターンだ。
明日からの開発で、この知見をフルに活用し、ユーザーを唸らせる圧倒的なパフォーマンスを持つツールを構築してほしい。健闘を祈る。
