こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録から一歩踏み出し、自分だけの自動化ツールを作り始めると、こんな壁にぶつかりませんか?
「VBAで100個のオブジェクトを整列させるマクロを作ったぞ!……おっ、でも実行した後に『Ctrl + Z(元に戻す)』を押したら、なんと100回も「元に戻す」を連打しないと元の状態に戻らない……!?」
これ、すごくよくある悩みです。
プログラムが高速に100回の操作を行うため、CorelDRAWの歴史(Undoバッファ)には100個の「変更履歴」がバラバラに記録されてしまうんですね。これでは、マクロを実行してくれたユーザーを絶望させてしまいます。
大丈夫。今回は、このバラバラの履歴を魔法のように「1つのまとまり」に束ね、ユーザーが「Ctrl + Z」一発で元の状態に戻せるようにする極意を伝授します。
ここをクリアすれば、あなたの作るマクロは「おもちゃ」から「プロのツール」へと一気に格上げされますよ。さあ、一緒に見ていきましょう!
—
1. CorelDRAWの「Undo(元に戻す)」の仕組みを知る
まず、CorelDRAWの頭の中を少し覗いてみましょう。
私たちがVBAでコードを書くとき、CorelDRAWのエンジンに対して「線を描け」「色を塗れ」「移動しろ」と命令のシャワーを浴びせます。
デフォルトの状態では、CorelDRAWは「命令が1つ実行されるたびに、1つの履歴を作る」というまじめすぎる性格をしています。
【通常のマクロ実行時】
VBA実行 ──> 命令1 履歴追加
──> 命令2 履歴追加
──> 命令3 履歴追加 ⇒ ユーザー「Ctrl+Z」 ──> 命令3だけ戻る(中途半端!)
これを防ぐために用意されているのが、今回主役となるトランザクション制御です。
具体的には、以下の2つのメソッド(命令)を使います。
1. `Application.BeginCommandGroup(“グループ名”)`:ここから「元に戻す」のまとめ作業を開始するよ!
2. `Application.EndCommandGroup`:ここまでで1つのまとまりにする作業は完了!
この2つでVBAの処理を挟み込むだけで、CorelDRAWは「あ、これらは全部ひとまとめの処理なんだな」と理解し、履歴を1つに統合してくれるのです。
【コマンドグループ使用時】
VBA実行 ──> BeginCommandGroup (「一括処理」スタート)
──> 命令1 履歴をグループへ
──> 命令2 履歴をグループへ
──> 命令3 履歴をグループへ
──> EndCommandGroup (終了) ⇒ ユーザー「Ctrl+Z」 ──> 一発で全部戻る! ✨
—
2. 実践!履歴を1つにまとめるVBAコード
百聞は一見にしかず。実際に「10個の円をランダムに配置する」という、バラバラの履歴が生まれやすいマクロを書いてみましょう。
以下のコードをCorelDRAWのVBAエディタ(Alt + F11)に貼り付けて実行してみてください。
Sub CreateRandomCirclesWithUndoGroup()
‘ 画面描画を一時停止して処理を爆速にする(プロの基本テクニック!)
ActiveDocument.BeginOptimization
‘ 【重要】ここから「元に戻す」のグループ化を開始!
‘ 引数に指定した文字列は、CorelDRAWの「編集」メニューの「元に戻す:[ここに入れた文字]」に表示されます
Application.BeginCommandGroup “ランダム円の自動生成”
On Error GoTo ErrorHandler ‘ エラー時のりカバー用(後述します)
Dim i As Integer
Dim s As Shape
Dim posX As Double, posY As Double
‘ 基準となるレイヤーを取得
Dim lyr As Layer
Set lyr = ActivePage.ActiveLayer
‘ 10個の円をランダムに作成するループ処理
For i = 1 To 10
‘ ランダムな座標を算出 (X: 0〜200mm, Y: 0〜200mm)
posX = Rnd 200
posY = Rnd 200
‘ 円を描画
Set s = lyr.CreateEllipse(posX, posY, posX + 10, posY + 10)
‘ ついでに色もランダムに変えてみる
s.Fill.UniformColor.CmykAssign Rnd 100, Rnd 100, Rnd 100, 0
Next i
ErrorHandler:
‘ 【重要】エラーが起きようが起きまいが、必ずグループ化を終了させる!
Application.EndCommandGroup
‘ 画面描画の停止を解除して画面をリフレッシュ
ActiveDocument.EndOptimization
‘ 完了メッセージ
MsgBox “10個の円を作成しました!「Ctrl + Z」で一発で元に戻せるか試してみてください。”, vbInformation, “完了”
End Sub
このコードの素晴らしいポイント
- `BeginOptimization` / `EndOptimization` との組み合わせ: 大量のオブジェクトを生成する際、画面の再描画をストップすることで爆発的なスピードアップを図っています。
- ユーザーへの親切心: `BeginCommandGroup “ランダム円の自動生成”` と名前を付けることで、CorelDRAWの「編集」メニューを見たときに「元に戻す:ランダム円の自動生成」と表示されます。何をしたときの履歴なのかが一目瞭然ですね。
—
3. ⚠️ 絶対に守るべき「エンジニアの鉄則」(エラーハンドリング)
コマンドグループを使う上で、絶対に避けて通れない注意点があります。
それは、`BeginCommandGroup` を呼び出したあとに、もしVBAのコード内でエラー(ゼロ除算やオブジェクトが存在しないエラーなど)が発生してプログラムが途中で止まってしまった場合の恐怖です。
もし `EndCommandGroup` に到達する前にエラーでコードが止まると、CorelDRAWは「あれ?グループの終わりが来ないぞ……?」と混乱状態に陥り、最悪の場合、その後の操作も含めてアプリケーション全体の「元に戻す」機能がおかしくなることがあります。
そのため、先ほどのコードでも入れている通り、必ずエラーハンドリング(`On Error GoTo`)をセットで使い、万が一途中でエラーが起きたとしても、必ず `EndCommandGroup` が実行される仕組みを担保するようにしてください。
Application.BeginCommandGroup “安全なグループ”
On Error GoTo CatchError ‘ エラー時の避難先を指定
‘ — ここにメインの処理を書く —
‘ (もしここでエラーが起きても…)
CatchError:
‘ 必ずここでグループを閉じる!
Application.EndCommandGroup
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
この「保険」をかけておくかどうかが、プロのエンジニアとアマチュアの分かれ道です。
—
まとめ:親切なマクロ設計があなたの評価を変える
今回は、CorelDRAW VBAにおける `BeginCommandGroup` と `EndCommandGroup` を使った、Undoバッファのコントロール方法を解説しました。
- 大量のオブジェクトを操作するマクロには、必ずコマンドグループを適用する。
- 「Ctrl + Z」で一発で元に戻せるようにするだけで、ユーザーのストレスはゼロになる。
- エラー時でも確実にグループを閉じられるよう、エラーハンドリングをセットで記述する。
ここをクリアすれば、あなたの書くCorelDRAW VBAのクオリティは一段とプロフェッショナルなものになります。ぜひ、明日からの開発に取り入れてみてくださいね。それでは、次回の極限の知見でお会いしましょう!
