【入門編】SelectionManager徹底解説:オブジェクト未選択時の例外ハンドリングとユーザー誘導UIの設計 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
あなたが「マクロの記録」ボタンを押すだけの自動化から一歩抜け出し、本当の意味で“使える”実用的なツールを作ろうとしたとき、最初に直面する壁が「オブジェクトの選択状態のハンドリング」です。

現場のデザイナーが使うマクロは、あなたが想定した通りに動いてくれないことが多々あります。その最たる例が、「何も選択されていない状態でマクロを実行してしまう」といううっかりミスです。

今回は、CorelDRAWの心臓部である `SelectionManager` を徹底的に解剖し、何も選択されていないときの絶望的なクラッシュを防ぎ、優しくユーザーを導くプロフェッショナルなエラーハンドリングの極意を伝授します。ここをクリアすれば、あなたのVBAスキルは確実に一段階上のステージに到達しますよ!

1. なぜ「何も選択されていない状態」でマクロは崩壊するのか?

CorelDRAW VBAで最もよく使うオブジェクトの一つが `ActiveSelection` や `ActiveShape` です。例えば、選択した図形の塗りつぶしを赤色に変えるだけのシンプルなコードを書いてみましょう。

Sub MakeItRed_BadExample()
‘ 選択している図形のカラーを赤にする
ActiveShape.Fill.UniformColor.RGBAColor 255, 0, 0
End Sub

このコード、ユーザーがしっかりと図形を選んでいれば見事に動きます。しかし、何も選択していない(空っぽの)状態で実行すると、容赦なく「実行時エラー 91: オブジェクト変数または With ブロック変数が見つかりません。」というエラーが発生し、マクロが強制終了します。

実務で使うツールがこんなことでエラーを出しては、使う側としてはストレスが溜まりますよね。「ちゃんと選択してから押してください!」と突き放すのではなく、「おっと、図形が選択されていませんよ。どれか選んでくださいね」と優しくエスコートするUI設計こそが、一流のエンジニアの仕事です。

2. SelectionManager の正体と、スマートな判定ロジック

CorelDRAWには、選択状態を管理するための専任マネージャーが存在します。それが `ActiveDocument.Selection`(または `ActiveSelection`)です。

このマネージャーが持つ最も重要なプロパティが `Shapes.Count` です。これを使えば、「今、いくつオブジェクトが選ばれているか」を正確に把握できます。

基礎:選択数をカウントして分岐する

まずは、最も基本となる安全な判定ロジックを見てみましょう。

Sub CheckSelection_Basic()
‘ 1. 現在のドキュメントが開かれているかチェック
If ActiveDocument Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 選択されているオブジェクトの数をチェック
If ActiveSelection.Shapes.Count = 0 Then
‘ — 未選択時のユーザー誘導 —
MsgBox “オブジェクトが選択されていません。” & vbCrLf & _
“処理したい図形を1つ以上選択して再度実行してください。”, _
vbExclamation, “選択が必要です”
Exit Sub
End If

‘ — 3. 選択されている場合のメイン処理 —
MsgBox “素晴らしい! ” & ActiveSelection.Shapes.Count & ” 個のオブジェクトが選択されています。”

‘ ここに実際の処理を書く
End Sub

このコードのポイント

  • `ActiveDocument Is Nothing`:そもそもドキュメント自体が開かれていない場合のガード(これ重要です!)。
  • `ActiveSelection.Shapes.Count = 0`:何も選択されていない状態をピンポイントでキャッチ。
  • `Exit Sub`:条件に満たない場合は、そこでスパッと処理を終了させる(ガード cláusule)。

3. 【実践】現場で使える「ユーザー誘導型」安全テンプレート

単にメッセージを出して終わるだけではなく、もう少し踏み込んでみましょう。「選択されていないなら、ユーザーに選択モードを促す」あるいは「レイヤー全体の全選択に切り替えるか聞いてみる」といった親切設計にすると、ツールとしての価値が跳ね上がります。

以下のコードは、実務でそのまま使える堅牢なテンプレートです。

Sub SafeProcessTemplate()
On Error GoTo ErrorHandler

‘ 1. ドキュメントの存在確認
If ActiveDocument Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If

‘ 2. 選択状態の厳密なチェック
Dim selCount As Long
selCount = ActiveSelection.Shapes.Count

If selCount = 0 Then
‘ 選択を促すメッセージボックス(はい/いいえ の選択肢を設ける例)
Dim userAnswer As VbMsgBoxResult
userAnswer = MsgBox(“処理対象のオブジェクトが選択されていません。” & vbCrLf & _
“アクティブレイヤーの全オブジェクトを選択して処理を続行しますか?”, _
vbYesNo + vbQuestion, “確認”)

If userAnswer = vbYesThen
‘ 代替処理:アクティブレイヤーの全シェイプを選択状態にする
ActiveLayer.Shapes.All.CreateSelection

‘ 再度カウントチェック
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “レイヤー内にオブジェクトが存在しません。”, vbExclamation
Exit Sub
End If
Else
‘ ユーザーが「いいえ」を選んだ場合は穏やかに終了
Exit Sub
End If
End If

‘ ==========================================
‘ 3. メインの業務ロジック(安全が保証された領域)
‘ ==========================================
Dim sh As Shape
For Each sh In ActiveSelection.Shapes
‘ 例:選択されたすべてのシェイプに輪郭線をつけるなど
‘ sh.Outline.Width = 0.5
Next sh

MsgBox “処理が正常に完了しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 予期せぬエラーのキャッチ
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “システムエラー”
End Sub

4. チーフアーキテクトからのワンポイントアドバイス

CorelDRAW VBAを書いていて見落としがちなのが、「マルチページ・マルチレイヤー環境」です。
`ActiveSelection` は、あくまで「現在アクティブなページで選択されているもの」を返します。もしユーザーが別のページを見ている状態でマクロが走ると、意図しない挙動やエラーの原因になります。

大規模なドキュメントを扱うプロ向けのツールを作る際は、以下のようにスコープを明確に意識してください。

  • `ActiveDocument.Selection` (ドキュメント全体での選択を保証したいとき)
  • `ActivePage.Selection` (ページ内の選択に限定したいとき)

オブジェクトのライフサイクルと、ユーザーが今どこに視覚的焦点を置いているか(UI/UX)を常にリンクさせること。これが、バグの無い洗練されたCorelDRAWマクロを書くための最大の秘訣です。

まとめ

いかがでしたか?今回は `SelectionManager` を通じた例外ハンドリングとユーザー誘導UIの設計について解説しました。

  • 何も選択されていない状態 (`Shapes.Count = 0`) は必ず事前にガードする。
  • エラーで強制終了させるのではなく、メッセージで優しく誘導する。
  • 必要であれば、全選択への切り替えなど「代替の選択肢」を提示する。

ここをクリアすれば、あなたの作ったVBAツールは一気に「プロ品質」に生まれ変わります。ぜひ、次の開発から取り入れてみてくださいね。それでは、また次回の極限知見でお会いしましょう!バッチリ使いこなしてください!

タイトルとURLをコピーしました