こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録から一歩踏み出し、自分の手で業務を効率化するツールを作り始めると、誰もが最初に直面する「あるあるの壁」があります。
それが、「オブジェクトを選択していない状態でマクロを実行した瞬間に、容赦なく突き刺さる実行時エラー」です。
せっかく書いたコードなのに、何も選択せずに実行した途端、画面が黄色くハイライトされて「実行時エラー ’91’: オブジェクト変数または With ブロック変数が見つかりません。」なんて表示されたら、心が折れそうになりますよね。
今回は、このエラーを完全に無力化し、ユーザーに優しく寄り添うスマートな判定手法を、チーフアーキテクトの視点から分かりやすく伝授します。ここをクリアすれば、あなたのVBAスキルは「初心者」から「プロのエンジニア」へと一段階上に飛躍しますよ!
—
なぜエラーが起きるのか? CorelDRAW VBAの「お作法」
CorelDRAWでオブジェクトを操作するとき、私たちはよく `ActiveDocument.Selection` や `ActiveSelection` という言葉を使います。
これらは現在の「選択状態」を管理する `SelectionManager`(セレクションマネージャー)という非常に重要なオブジェクトの仲間たちです。
ここで知っておくべきCorelDRAW VBAの鉄則があります。
> 「ユーザーが何も選択していないとき、`Selection` は『空っぽ(Nothing)』ではなく、『エラーの地雷原』になる」
何も選択されていない状態で無理やり `ActiveSelection.Shapes` などのプロパティにアクセスしようとすると、CorelDRAWは「操作対象がないよ!」とパニックを起こし、容赦なくマクロを強制終了させてしまうのです。
—
解決策:`Shapes.Count` と `Nothing` 判定の二段構え
この悲劇を防ぐには、コードを実行する前に「今、何か選択されていますか?」と優しく確認してあげるガード節(Guard Clause)を挟むのがプロの常道です。
以下のコードを見てください。これが現場で即戦力となる安全な判定パターンの決定版です。
実用サンプルコード
Sub SafeProcessSelectedObjects()
Dim sr As ShapeRange
‘ 1. まず、ドキュメントが開かれているか確認する(基本の防衛)
If ActiveDocument Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If
‘ 2. 選択状態(Selection)そのものが取得できるか安全にキャッチ
‘ ActiveDocument.Selection は ShapeRange オブジェクトを返します
Set sr = ActiveDocument.Selection
‘ 3. 選択されている個数(Count)をチェックする
‘ もし何も選択されていなければ Count は 0 になります
If sr.Shapes.Count = 0 Then
MsgBox “オブジェクトが選択されていません。” & vbCrLf & _
“処理したいオブジェクトを選択してから再度実行してください。”, _
vbInformation, “お知らせ”
Exit Sub ‘ ここで安全に処理を終了(脱出)する
End If
‘ ==========================================
‘ 4. ここから下が「安全地帯」!実際の処理を記述します
‘ ==========================================
Dim sh As Shape
MsgBox “現在、 ” & sr.Shapes.Count & ” 個のオブジェクトが選択されています。”, vbInformation, “成功”
‘ 例:選択されたすべてのオブジェクトの輪郭線を赤色に変える処理
For Each sh In sr.Shapes
sh.Outline.Color.RGBAXColorAssign 255, 0, 0, 0 ‘ 赤色を設定
Next sh
MsgBox “選択されたオブジェクトの処理が完了しました!”, vbInformation, “完了”
End Sub
—
コードのポイント解説:なぜこの書き方が最強なのか?
初心者の方がやりがちなミスは、いきなり `ActiveSelection.Shapes.Count` と書いてしまうことです。これだと、何も選択されていない状態のときにオブジェクトの階層たどりきれず、エラーになってしまいます。
上記のコードでは、以下の3つのステップで鉄壁の守りを固めています。
1. ドキュメント自体の存在チェック (`ActiveDocument Is Nothing`)
そもそもCorelDRAWで何もファイルが開かれていない状態での暴発を防ぎます。
2. `ShapeRange` として受け取る (`ActiveDocument.Selection`)
CorelDRAW VBAにおいて、選択状態は `ShapeRange` というコレクション(束ねられたオブジェクト)として安全に変数に格納できます。
3. `Count = 0` で判定する
「選択されている数」が0個であれば、親切なメッセージを出して `Exit Sub` で華麗に処理を抜け出します。これにより、肝心のメイン処理がエラーの洗礼を受けることがなくなります。
—
まとめ:優しさの数だけ、コードは強くなる
業務で使うマクロは、自分だけでなく、他のデザイナーやスタッフが使うことも多いはずです。そのとき、予期せぬ操作をしただけで「実行時エラー(デバッグ画面)」がいきなり立ち上がったら、使っている人はそれだけで萎縮してしまいますよね。
「何も選択されていないときには、優しく教えてあげる」
このひと手間のエラーハンドリング(ガード節)を入れるだけで、あなたの書くマクロの品質はプロフェッショナルなレベルへと一気に引き上げられます。
ここをクリアすれば、CorelDRAW VBAのオブジェクトモデルの機嫌を取るコツはもうバッチリです!
さあ、安心して次の自動化の扉を開きましょう。あなたの開発ライフを心から応援しています!
