こんにちは!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自動化ライフをさらに快適なものにしてくださいね。それでは、また次回の極意でお会いしましょう!
