こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを眺める段階から、「自分の手で自由自在にデザインを自動化したい!」という次のステージに進むと、必ずと言っていいほど直面する壁があります。
それが、実行時エラー「オブジェクト変数または With ブロック変数が見つかりません」(エラー424)です。
「さっきまで動いていたのに、特定のファイルを開くとエラーで止まる…」
「選択していない状態で実行したら、マクロが強制終了した…」
そんな悩みを抱えていませんか?
今回は、CorelDRAWのオブジェクトモデルの特性を紐解きながら、このエラーを完全に根絶するための「鉄壁のNothing判定(存在確認)」の極意を、優しく、そして深く伝授します。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に一歩近づきますよ!
—
1. なぜエラー424は起きるのか?(CorelDRAWの闇と光)
Excel VBAと比べると、CorelDRAW VBAは「キャンバス(ドキュメント)」「レイヤー」「シェイプ」という視覚的・階層的な世界を相手にします。
例えば、あなたがコードの中で「現在選択しているシェイプ」を操作しようとしたとします。しかし、ユーザーが何も選択していなかったらどうなるでしょうか?
CorelDRAWの心の中はこうです。
「おい、『選択中のシェイプ』って言われても、何も選ばれてないぞ!そんなメモリ上の住所(オブジェクト)は存在しない!」
ここでVBAはパニックを起こし、エラー424を吐いて強制終了してしまうのです。
マクロの記録しか使っていないと、「オブジェクトが存在するのが当たり前」という前提でコードが書かれているため、こうした予期せぬ状況にめっぽう弱くなります。
—
2. 「オブジェクトがない」とはどういう状態か? (`Nothing`の正体)
VBAにおいて、変数に「何もしめす実体がない」状態を `Nothing` と呼びます。
数字の `0` や文字の `””`(空文字)とは違います。`Nothing` は、「変数という名の空っぽの箱だけがあって、中身のメモリが存在しない」状態です。
したがって、存在しないかもしれないシェイプやドキュメントを変数に代入した直後は、「この箱の中身は本当に存在するか?」をVBAに確認させなければなりません。 これが `Nothing` 判定の本質です。
—
3. 実装パターン:これだけ覚えれば完璧な「安全設計コード」
それでは、実際の現場で即座に使える、堅牢な判定コードの書き方を見ていきましょう。
パターンA:選択中のシェイプを安全に取得して処理する
ユーザーがオブジェクトを選択しているかどうかをチェックし、選択していれば色を赤に変え、していなければ優しくメッセージを出すコードです。
Sub SafeChangeColor()
Dim sh As Shape
‘ 1. 現在選択されている最初のシェイプを変数に代入
‘ ※何も選択されていない場合、ActiveSelection.Shapes(1) は取得できずエラーになるかNothingになります
On Error Resume Next ‘ 万が一のエラーを一旦スルーさせるテクニック
Set sh = ActiveSelection.Shapes(1)
On Error GoTo 0 ‘ エラー監視を元に戻す
‘ 2. 【最重要】中身が本当に存在するか(Nothingではないか)を判定する
If sh Is Nothing Then
MsgBox “シェイプが選択されていません。何かオブジェクトを選んでから実行してください。”, vbExclamation, “確認”
Exit Sub ‘ ここで処理を安全に終了
End If
‘ 3. オブジェクトが存在することが確約された安全な世界での処理
‘ ここに来たということは、shは確実に存在します!
sh.Fill.UniformColor.CmykAssign 0, 100, 100, 0 ‘ シアン以外の100%レッドに変更
MsgBox “選択シェイプの色を赤に変更しました!”, vbInformation
End Sub
パターンB:特定の名前のシェイプを探して操作する
ドキュメント内から「MyLogo」という名前のシェイプを探し、存在する場合だけ処理を行うパターンです。
Sub FindAndProcessShape()
Dim doc As Document
Dim targetShape As Shape
Set doc = ActiveDocument
‘ ドキュメントが開かれていない場合のガード
If doc Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical
Exit Sub
End If
‘ 名前を指定してシェイプを検索(存在しない場合はNothingが返るように設計する)
On Error Resume Next
Set targetShape = doc.ActivePage.FindShape(“MyLogo”)
On Error GoTo 0
‘ Nothing判定
If targetShape Is Nothing Then
MsgBox “指定されたシェイプ ‘MyLogo’ が見つかりませんでした。”, vbExclamation
Exit Sub
End If
‘ 存在した場合の処理
targetShape.RotationAngle = 45
MsgBox “‘MyLogo’ を45度回転させました。”, vbInformation
End Sub
—
4. コードの解説と知っておくべきポイント
上記のコードで使われている、CorelDRAW VBAを極めるための重要なポイントを整理しておきましょう。
1. `Set` キーワードを使う理由
数値や文字列を入れるときは `Dim a As Integer: a = 10` と書きますが、オブジェクト(シェイプやドキュメントなど)を代入するときは必ず `Set` が必要です。「メモリ上の実体(参照)を箱に入れる」という意味合いを持つため、ここを忘れると別のエラー(オブジェクトが必要です)が発生します。
2. `Is Nothing` で比較する
VBAでNothingを判定するときは、`=`(イコール)ではなく `Is` を使います。
- ❌ `If sh = Nothing Then` (間違い)
- ⭕ `If sh Is Nothing Then` (正しい)
3. `On Error Resume Next` との組み合わせ
CorelDRAWでは、存在しないインデックス(例: 選択していないのに `Shapes(1)` を指定する等)を指定すると、判定する前にVBA自体がクラッシュすることがあります。そのため、あらかじめエラーを一時的に無効化(`On Error Resume Next`)し、その直後に `If sh Is Nothing Then` で正しく捕まえるのが、プロのエンジニアが使う鉄板の防御的プログラミング手法です。
—
まとめ:ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!
いかがでしたでしょうか?
「オブジェクト変数または With ブロック変数が見つかりません」というエラーは、初心者を絶望させるエラーの代表格ですが、その正体は「VBAからのSOS(そこに何も無いよ!)」に他なりません。
今回紹介した、
- オブジェクトの代入には `Set` を使うこと
- 取得した後は必ず `If ○○ Is Nothing Then` で生存確認をすること
- 不測のエラーを防ぐために一時的なエラー回避を挟むこと
この3つを意識するだけで、あなたの書くマクロは見違えるほど安定し、実用的な自動化ツールへと生まれ変わります。
エラーに怯える日々は今日で終わりです。ぜひ明日の開発から、この「鉄壁のNothing判定」を取り入れてみてくださいね。あなたのCorelDRAWライフが、より快適でクリエイティブなものになることを応援しています!
