【入門編】実行時エラー「オブジェクト変数または With ブロック変数が見つかりません」を根絶するNothing判定の実装パターン – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺める段階から、一歩進んで「自分で自由自在にデザインを自動化したい!」そう思ってコードを書き始めると、必ずと言っていいほどぶ N2 壁(いや、壁)にぶつかるエラーがあります。

それが、実行時エラー 91:「オブジェクト変数または With ブロック変数が見つかりません」 です。

「ちゃんとコードを書いたのに、なんでエラーが出るんだ……!」と、画面の前頭を抱えた経験はありませんか?
でも安心してください。ここをクリアすれば、あなたのCorelDRAW VBAスキルは「初心者」から「現場で頼られるエンジニア」へと一気にステップアップします。

今日は、この恐怖のエラーを完全に無力化する「`Nothing` 判定による安全な存在確認」の極意を、優しく、そして本質的なところまで深く伝授しましょう。ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!

1. なぜ「オブジェクト変数が見つからない」エラーが起きるのか?

マクロの記録が教えてくれる世界は、いわば「すべてが絶対にそこにある」という理想郷です。
例えば、選択している図形の色を変えるとき、記録コードはこう書きます。

ActiveSelection.Fill.UniformColor.CmykAssign 0, 100, 100, 0

しかし、現実の作業現場はどうでしょう?
「何も選択されていない状態」でこのマクロを実行したらどうなるでしょうか? CorelDRAWはパニックを起こします。「おい、変えろって言われた図形がどこにもねぇぞ!」と。これが、エラー 91 の正体です。

VBAにおいて、目に見えない「オブジェクト(図形やレイヤー、ドキュメントなど)」を変数に代入しようとしたとき、「そんなもの、どこにも存在しないよ」という状態を、VBAの世界では `Nothing`(ナッシング=無) と呼びます。

存在しないもの(`Nothing`)に対して「色を変えろ」「サイズを教えろ」と命令した瞬間、VBAは容赦なくエラーを投げつけて強制終了するのです。

2. 解決の鍵:`Is Nothing` という最強の盾

実務で使える堅牢なマクロを書く鉄則、それは「信じるな、確認せよ(Trust, but verify)」です。

オブジェクトを取得した直後に、それが本当に存在しているのか?それとも `Nothing`(空振り)なのかを、VBAの `Is` 演算子を使って事前にチェックする。これがプロのエンジニアの作法です。

基本の構文パターン

Dim shp As Shape
Set shp = ActiveSelection.Shape

‘ 存在確認(Nothingではないか?)
If Not shp Is Nothing Then
‘ 【成功ルート】図形が存在する場合の処理
MsgBox “図形を発見しました!”
Else
‘ 【フォールバック(避難)ルート】存在しない場合の処理
MsgBox “図形が選択されていません。何か選択してください。”, vbExclamation
End If

この `If Not shp Is Nothing Then` という構文。これが、あなたのコードを突然死から守る最強の盾となります。

3. 【実践】現場でそのまま使える!安全なオブジェクト取得テンプレート

では、CorelDRAW VBAの現場でよくあるシチュエーションを例に、具体的なコードを見ていきましょう。
今回は、「現在アクティブなページにある、特定の名前がついたレイヤーから図形を探す」という、少し実践的な処理を書いてみます。

Sub SafeObjectFindSample()
Dim doc As Document
Dim lyr As Layer
Dim targetShape As Shape

‘ 1. アクティブドキュメントの存在確認
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox “開かれているドキュメントがありません。”, vbCritical
Exit Sub ‘ ここで処理を安全に終了
/End If

‘ 2. 特定のレイヤー(例: “CutContour”)の存在確認
‘ ※ Layer.FindShape などの前に、レイヤー自体の存在を担保する
On Error Resume Next ‘ 念のためエラートラップを敷く
Set lyr = doc.ActivePage.Layers.Item(“CutContour”)
On Error GoTo 0 ‘ エラートラップを即座に解除

If lyr Is Nothing Then
MsgBox “指定されたレイヤー ‘CutContour’ が見つかりません。”, vbExclamation
Exit Sub
End If

‘ 3. レイヤー内の特定図形を取得
Set targetShape = lyr.Shapes.Item(1) ‘ レイヤー内の最初の図形を取得してみる

If targetShape Is Nothing Then
MsgBox “レイヤー内に図形が存在しません。”, vbInformation
Exit Sub
End If

‘ — すべての安全確認をクリアしたエリートゾーン —
‘ ここに到達したということは、オブジェクトは確実に存在します
MsgBox “処理を実行します。対象図形タイプ: ” & targetShape.Type

‘ 例:色を赤に変える
targetShape.Fill.UniformColor.CmykAssign 0, 100, 100, 0

End Sub

コードのポイント解説

1. 多段階のチェック(フェイルセーフ)
CorelDRAWでは「ドキュメントがない」「ページがない」「レイヤーがない」「図形がない」という4段階の壁があります。上流から順に `Is Nothing` で弾いていくことで、どこで問題が起きたのかが自分でもユーザーでも一目でわかるようになります。
2. `On Error Resume Next` の正しい使い方
存在しないアイテム名(`Layers.Item(“存在しない名前”)` など)を指定すると、VBAは通常そこでエラーを吐いて止まります。これを一時的にスルーさせ、直後の `If lyr Is Nothing Then` で美しくハンドリングするのがプロの技です。(※スルーしっぱなしにせず、すぐに `On Error GoTo 0` で戻すのが鉄則です)

4. ありがちなアンチパターンと、その修正

ここで、初学者がやりがちな「やってはいけない書き方」を確認しておきましょう。

❌ 悪い例(エラー必至)

Dim shp As Shape
‘ 選択されていない状態でこれを実行すると即エラー91!
ActiveSelection.Shape.Fill.UniformColor.CmykAssign 100, 0, 0, 0

ドット(`.`)でオブジェクトのプロパティやメソッドを何個も繋げる(メソッドチェーン)書き方はスマートに見えますが、途中の要素が `Nothing` だった瞬間にすべてが崩壊します。

⭕ 良い例(安全設計)

Dim shp As Shape
Set shp = ActiveSelection.Shape

If Not shp Is Nothing Then
shp.Fill.UniformColor.CmykAssign 100, 0, 0, 0
Else
MsgBox “図形が選択されていません。”
End If

一度変数に受け止め(`Set`)、`Is Nothing` で検問を行ってから触る。この一手間を惜しまないことが、安定稼働するマクロを作る唯一の近道です。

まとめ:今日からあなたのコードは生まれ変わる

CorelDRAW VBAにおける `Is Nothing` 判定は、いわば「デジタル世界のシートベルト」です。

マクロの記録を卒業し、自分でコードを組み立てるようになると、思い通りにいかないエラーにイライラすることも増えるかもしれません。しかし、「オブジェクトは常にそこにあるとは限らない。ないかもしれない」という前提(ゼロ・トラストの精神)に立った瞬間から、あなたの書くコードは見違えるほど頑健(ロバスト)なものに変わります。

「オブジェクト変数または With ブロック変数が見つかりません」というエラーに出会ったら、こう呟いてください。
――「おっと、存在確認をサボっていたな」と。

さあ、この知見を武器に、あなたのCorelDRAW自動化ライフをさらに快適なものにしてくださいね。それでは、また次回の極意でお会いしましょう!

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