こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺める段階は、もう卒業しましたか?
「何千個ものオブジェクトを整列させたり、一括で色を変えたりするマクロを作ったはいいものの、途中で画面がフリーズしたように固まってしまい、終わる頃にはコーヒーがすっかり冷めていた……」
そんな悲しい経験はありませんか?
実はこれ、CorelDRAWの「Undo(アンドゥ)機能の罠」が原因です。
今回は、大規模なループ処理でその呪縛を断ち切り、爆速で処理を完了させるための奥義`UndoLock`について、プロの知見を交えて優しく、そして深く解説していきます。
ここをクリアすれば、あなたのVBAスキルは「初学者」から確実に「実務中級のエンジニア」へとステップアップしますよ!
—
1. なぜCorelDRAWの大規模ループは遅いのか?(Undoバッファの正体)
CorelDRAWは非常に優秀なデザインソフトです。ユーザーが「一歩戻る(Ctrl + Z)」できるように、私たちがVBAで書いたコードの1行1行の操作を、すべて裏側の「履歴(Undoバッファ)」に記録しています。
例えば、次のようなコードを書いたとします。
Dim i As Long
For i = 1 to 5000
ActiveLayer.CreateRectangle 0, 0, 10, 10
Next i
このコードを実行すると、CorelDRAWは「5000個の四角形を描いた」という事実だけでなく、「5000個の履歴データ」をメモリ上にせっせと積み上げます。
5000回分の「やり直し用データ」を毎回メモリに書き込んでいるのですから、後半になればなるほど処理が重くなり、最悪の場合はメモリ不足でフリーズします。
私たちは人間です。スクリプトで一瞬にして生成した5000個のオブジェクトを、わざわざ1個ずつ「Ctrl + Z」で5000回戻すことなどありませんよね?
つまり、この裏側の履歴記録は、大量処理の最中には「ただの邪魔な重り」でしかないのです。
—
2. 救世主 `UndoLock` の登場
そこで登場するのが、今回の主役である `UndoLock` です。
`ActiveDocument.UndoLock` は、CorelDRAWに対して「今から面倒な処理をするから、終わるまで一切のUndo履歴の記録を禁止しなさい!」と命令するプロパティです。
使い方はとてもシンプル。処理の開始時にロックをかけ、処理が終わったら解除するだけです。
基本の構文構造
‘ 1. Undoの記録をロックする
ActiveDocument.UndoLock = True
‘ — ここに重たいループ処理を書く —
‘ 2. 処理が終わったらロックを解除する(元の状態に戻す)
ActiveDocument.UndoLock = False
たったこれだけ?と思うかもしれませんが、この2行を挟むだけで、数分かかっていた処理が数秒で終わるようになります。メモリの消費量も劇的に削減されます。
—
3. 【実践】爆速化テンプレートコード
それでは、実務でそのまま使える「安全かつ高速なループ処理」のテンプレートコードを見てみましょう。
プロのエンジニアが書くコードには、エラーが起きても確実にUndoLockが解除されるような「保険(例外処理)」が組み込まれています。
Sub FastBatchProcessingSample()
Dim startTime As Double
startTime = Timer ‘ 処理時間計測用
‘ 画面描画を停止してさらにスピードアップ
ActiveDocument.BeginBatch
‘ 【重要】Undoの記録をロック(メモリの肥大化を防ぐ)
ActiveDocument.UndoLock = True
On Error GoTo ErrorHandler ‘ エラー時のジャンプ先を指定
Dim i As Long
Dim sh As Shape
‘ — ここから大規模ループ処理 —
For i = 1 To 2000
‘ 例:ランダムな位置に円を1000個作成する処理
Set sh = ActiveLayer.CreateEllipse(i 2, 0, (i 2) + 5, 5)
sh.Fill.UniformColor.CmykAssign 0, 100, 100, 0 ‘ 赤色にする
Next i
‘ — ループ処理ここまで —
ErrorHandler:
‘ 【重要】エラーの有無に関わらず、必ずUndoLockを解除する
ActiveDocument.UndoLock = False
‘ 画面描画の停止を解除し、画面をリフレッシュ
ActiveDocument.EndBatch
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “処理が完了しました! 実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
End If
End Sub
コードのポイント解説
1. `ActiveDocument.BeginBatch` と `EndBatch`
- オブジェクトが生成されるたびに画面がパチパチと再描画されるのを防ぎます。UndoLockとセットで使うことで、CorelDRAWのパフォーマンスを限界まで引き出せます。
2. `On Error GoTo ErrorHandler`
- もしループの途中でエラー(ゼロ除算やオブジェクト参照エラーなど)が発生した場合、VBAはそこでストップします。もし `UndoLock = False` を通らずにプログラムが止まってしまうと、CorelDRAW全体のUndo機能がロックされたまま(Ctrl + Zが効かない状態)になってしまい、ユーザーが非常に困ります。
- そのため、エラーが起きても必ず `UndoLock = False` を通過する安全装置(ErrorHandler)がプロの現場では必須となります。
—
4. 陥りやすい罠と注意点
`UndoLock` は魔法の杖ですが、正しく使わないと予期せぬトラブルを引き起こします。以下のポイントに注意してください。
- 「やり直し(Ctrl + Z)」が1回分のまとめ技になる
- `UndoLock = True` の間に行われた数千回の操作は、履歴上では「1つのまとまり」として扱われます。もし処理後に「Ctrl + Z」を押すと、数千個のオブジェクトが一瞬で全て消える(または全て元に戻る)ことになります。ユーザーにその仕様をあらかじめ伝えておくか、そもそも戻す必要がない自動生成・データ変換処理に絞って使いましょう。
- ユーザー定義関数(UDF)内での過信は禁物
- ドキュメントの構造を大きく変更するような複雑なネスト構造のループでは、UndoLockの効果が薄れる場合があります。基本は「フラットな大量生成・プロパティ一括変更」のシーンで使ってください。
—
まとめ
いかがでしたか?今回は、CorelDRAW VBAにおけるパフォーマンス最適化の急所である `UndoLock` について解説しました。
- 何千回もオブジェクトを操作するループでは、Undoバッファが肥大化してフリーズの原因になる。
- `ActiveDocument.UndoLock = True` で履歴記録を止め、爆速化を実現する。
- エラー発生時でも確実にロックを解除できるよう、`On Error` 構文を必ずセットで使うこと。
このテクニックを身につけたあなたなら、もう重いデータ処理に怯える必要はありません。ぜひ、日々の業務マクロに取り入れて、圧倒的なスピード感を体感してください。
それでは、次回の高度なVBA解説でお会いしましょう!CorelDRAWライフを存分に楽しんでくださいね。
