こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺める段階から、一歩進んで「自分で意図した通りのスマートなツールを作りたい!」そう思い始めた頃ではないでしょうか。
今回は、CorelDRAW VBAで最も遭遇しやすく、かつ「プロのコード」と「素人芝居のコード」の分かれ道になる重要テーマを取り上げます。
そう、「ユーザーが何も選択していない状態でマクロを実行した際の例外ハンドリングとユーザー誘導」です。
ここをクリアすれば、あなたの書くマクロは見違えるほど堅牢になり、現場で愛されるツールに生まれ変わります。一緒に本質をマスターしていきましょう!
—
1. なぜ「未選択時のエラー」でマクロが爆発するのか?
CorelDRAWで何か図形を選択している状態、これをVBAの世界では `ActiveSelection` や `SelectionManager` が管理しています。
例えば、選択した図形の色を赤に変えるだけの、こんな単純なコードを書いたとします。
Sub MakeItRedBad()
‘ 選択している図形の色を赤にする(危険なコード!)
ActiveSelection.Fill.UniformColor.CreateCmyk 0, 100, 100, 0
End Sub
このコード、もしユーザーがちゃんと図形を選んでいれば問題なく動きます。しかし、何も選択していない状態(空っぽのキャンバスをクリックしたまま)でこのマクロを実行するとどうなるでしょうか?
CorelDRAWは容赦なく「実行時エラー ’91’: オブジェクト変数または With ブロック変数が見つかりません。」という、初心者泣かせの冷酷なエラーメッセージを突きつけて強制終了します。
現場のデザイナーさんがこれに遭遇したら、「このマクロ、壊れてる!」と使ってもらえなくなってしまいますよね。これが「未選択時の爆発(例外)」です。
—
2. SelectionManagerの正体と「数える」重要性
この悲劇を防ぐためには、処理を実行する前に「今、本当に何かが選択されているか?」を厳密にチェックする必要があります。
ここで登場するのが、CorelDRAWのオブジェクトモデルにおける要塞、`ActiveDocument.Selection`(または `ActiveSelectionManager`)です。
選択数を取得するプロパティの罠
選択されているオブジェクトの数を数える際、いくつかのプロパティが存在しますが、プログラミング初学者が陥りがちな罠があります。
- `ActiveSelection.Shapes.Count`: 選択されている「シェイプの数」を返します。
- `ActiveDocument.Selection.Count`: 選択範囲内の要素数を返します。
ここで知っておくべきチーフアーキテクトからの知見として、CorelDRAWのバージョンや選択状態(グループ化されているもの、単一のものなど)によって、単純な `Count` だけを叩くと予期せぬ挙動をすることがあります。
最も安全で確実な判定方法は、`ActiveSelection.Shapes.Count` を監視し、それが `0` より大きいかどうかを確認することです。
—
3. 【実践】優しく導く堅牢なコードの書き方
それでは、何も選択されていない場合にマクロを優しく中断し、さらに「どうすればいいか」をユーザーに教えてあげる(ユーザー誘導)実用的なコードを見てみましょう。
以下のコードを、あなたのCorelDRAWのVBAエディタ(Alt + F11)に貼り付けてみてください。
Sub SafeColorChanger()
‘ ==========================================
‘ 堅牢な選択チェックとユーザー誘導の実装例
‘ ==========================================
Dim sr As ShapeRange
‘ 1. 現在の選択状態をShapeRangeとして安全に取得
Set sr = ActiveSelection.Shapes
‘ 2. 選択されている図形の数をチェック
If sr.Count = 0 Then
‘ — 未選択時のハンドリング & ユーザー誘導 —
MsgBox “オブジェクトが選択されていません。” & vbCrLf & _
“色を変更したい図形を一つ以上選択してから、再度マクロを実行してください。”, _
vbExclamation + vbOKOnly, _
“操作ガイド:図形未選択”
‘ 処理を安全に終了(Exit Subでスパッと抜ける)
Exit Sub
End If
‘ 3. 選択されている場合のメイン処理(例:塗りつぶしを赤にする)
‘ ここに到達したということは、必ず「1つ以上選択されている」ことが保証されています
Dim col As New Color
col.CreateCmyk 0, 100, 100, 0 ‘ シアン0, マゼンタ100, イエロー100, 黒0 (赤)
‘ 選択されているすべてのシェイプに対して安全に処理を適用
sr.Fill.ApplyColor col
‘ 完了の合図(おまけ)
MsgBox sr.Count & “個の図形を赤色に変更しました!”, vbInformation, “処理完了”
End Sub
コードのここがポイント!
1. `Set sr = ActiveSelection.Shapes` による変数化
一度 `ShapeRange` 型の変数 `sr` に代入することで、コードの可読性が上がり、メモリ効率の面でも安全になります。
2. `If sr.Count = 0 Then` での厳密なガード
「もし選択数が0なら」という条件分岐で、エラーの芽を完全に摘み取っています。
3. `vbCrLf` と丁寧なメッセージボックス
ただ「エラーです」と言うのではなく、「図形を一つ以上選択してから〜」と、次にユーザーが取るべき行動を優しく教えてあげるのが、真に優秀なツール設計です。
4. `Exit Sub` による安全な離脱
余計な処理を一切走らせず、綺麗にマクロを終わらせます。
—
まとめ:ここをクリアすれば、VBAの基本はバッチリ!
いかがでしたか?
今回は、`SelectionManager`(および `ActiveSelection.Shapes`)を使った未選択時の例外ハンドリングと、ユーザーへの親切な誘導手法について解説しました。
- 「動くかどうかわからない状態」で処理を始めない
- 必ず `Count` で事前チェックを行う
- エラーを教えるだけでなく、次の行動をガイドする
この3つを意識するだけで、あなたが作るCorelDRAWマクロの品質は、プロのエンジニアが作った商用アドインと同等のレベルに跳ね上がります。
ここをクリアしたあなたなら、もう「マクロの記録」の卒業生です。自信を持って、次の自動化の扉を開いていきましょう!それではまた、次回の極限の知見でお会いしましょう。
