こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して自動生成されたコードを動かしてみたものの、「あれ? ドキュメントが開いていない状態で実行したら、謎のエラーでCorelDRAWごと強制終了した……」なんて冷や汗をかいた経験はありませんか?
「マクロの記録」は便利な出発点ですが、実務で耐えうるプロレベルの自動化ツールを目指すなら、「何もない状態(異常系)」を完璧にいなす防御力が不可欠です。
今回は、CorelDRAW VBAの生命線である `ActivePage` と `ActiveLayer` の足元をすくい取る罠を完全網羅し、絶対にクラッシュしない堅牢なエラーハンドリングの極意を、優しく、そして徹底的に伝授します。
ここをクリアすれば、あなたの書くVBAコードは見違えるほどプロの仕上がりになりますよ。それでは、一緒に本質へ迫っていきましょう!
—
なぜ、あなたのマクロはすぐにクラッシュするのか?
CorelDRAW VBAで最もやりがちな、そして最も危険なミス。それは、以下のようなコードを無防備に書くことです。
‘ 【危険なアンチパターン】
Sub DangerousMacro()
‘ 今アクティブなページに、いきなり何かを描こうとする
ActivePage.Layers(“Layer 1”).CreateRectangle 0, 0, 100, 100
End Sub
このコード、何が問題か分かりますか?
もしユーザーがCorelDRAWを起動しただけで、まだ一度もドキュメント(ActiveDocument)を作っていない状態だったり、あるいはすべてのドキュメントを閉じてしまった状態でこのマクロを実行すると……容赦なくエラーが発生し、最悪の場合は作業中のデータが吹き飛ぶ原因になります。
CorelDRAWのオブジェクトモデルにおいて、`ActiveDocument`、`ActivePage`、`ActiveLayer` といった「Active」と名のつくプロパティは、「今、たまたまそこに存在していれば」オブジェクトを返しますが、存在しなければ容赦なく「Nothing(空っぽ)」を返します。
空っぽの箱に向かって「四角形を作れ!」と命令するのですから、プログラムがパニックを起こすのは当然ですよね。
—
鉄則:オブジェクトの「生存確認(Nothing判定)」を怠るな
プロのエンジニアが現場で書くコードには、必ず「事前の安全確認」が組み込まれています。VBAにおいて、オブジェクトが正体不明(Nothingかもしれない)のときに行うべき判定が、`Is Nothing` です。
これを使って、ドキュメント、ページ、レイヤーの生存を上流から順にチェックしていきましょう。
1. ドキュメントの存在チェック
まずは、大元である「ドキュメントが開かれているか」を確認します。
If ActiveDocument Is Nothing Then
MsgBox “ドキュメントが開かれていません。新規作成してください。”, vbCritical, “エラー”
Exit Sub
End If
2. アクティブページの存在チェック
次に、ドキュメントがあっても、ページが存在しない(極稀なケースや特殊なドキュメント構造)状態をガードします。
If ActivePage Is Nothing Then
MsgBox “有効なページが見つかりません。”, vbCritical, “エラー”
Exit Sub
End If
3. アクティブレイヤーの存在チェック & 自動生成・表示制御
ここが今回の最も重要なテーマです。ページがあっても、描画しようとしているレイヤーが削除されていたり、あるいは「非表示(Visible = False)」や「ロック(Locked = True)」になっていたらどうでしょう?
レイヤーがロックされている状態で図形を描こうとすると、やはりエラーになります。したがって、レイヤーの存在確認だけでなく、「書き込み可能な状態か」まで制御するのがプロの技です。
—
【実践】実務で使える!完全防御型のテンプレートコード
それでは、これまでの知見をすべて詰め込んだ、実務でそのまま使える「堅牢なガイド線・オブジェクト配置テンプレート」を公開します。
このコードは、以下の条件をすべてクリアしています。
1. ドキュメントがなくても落ちない。
2. ページがなくても落ちない。
3. 指定したレイヤーがなければ自動で新規作成する。
4. レイヤーが非表示やロック状態なら、自動で表示・ロック解除して書き込みを成功させる。
Sub RobustAutomationTemplate()
‘ ==========================================
‘ 1. 大元のドキュメントが存在するかチェック
‘ ==========================================
If ActiveDocument Is Nothing Then
MsgBox “処理を実行できるドキュメントが開かれていません。”, vbExclamation, “警告”
Exit Sub
End If
‘ ==========================================
‘ 2. アクティブページの存在チェック
‘ ==========================================
Dim targetPage As Page
Set targetPage = ActivePage
If targetPage Is Nothing Then
MsgBox “アクティブなページが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ ==========================================
‘ 3. 対象レイヤーの存在チェック & 自動担保
‘ ==========================================
Dim targetLayerName As String
targetLayerName = “自動配置レイヤー”
Dim targetLayer As Layer
Dim layerExists As Boolean
layerExists = False
‘ ページ内のレイヤーを総当たりでチェック
For Each targetLayer In targetPage.Layers
If targetLayer.Name = targetLayerName Then
layerExists = True
Exit For
End If
Next targetLayer
‘ レイヤーが存在しない場合は、新規作成する
If Not layerExists Then
Set targetLayer = targetPage.Layers.Add(targetLayerName)
End If
‘ ==========================================
‘ 4. レイヤーの表示・編集プロパティの強制制御
‘ ==========================================
‘ 非表示だと描画が見えないため、強制的に表示させる
If Not targetLayer.Visible Then
targetLayer.Visible = True
End If
‘ ロックされていると描画エラーになるため、強制的に解除する
If targetLayer.Locked Then
targetLayer.Locked = False
End If
‘ ==========================================
‘ 5. 安全な状態が担保された上で、処理を実行
‘ ==========================================
‘ 処理の基準とするために、このレイヤーをアクティブにする
targetLayer.Activate
‘ 例として、安全に長方形を描画してみる
Dim rect As Shape
Set rect = targetLayer.CreateRectangle(10, 10, 110, 60)
‘ ついでにガイド線(ガイドライン)を安全に引いてみる
‘ ガイド線用レイヤー(ガイド線は特殊レイヤーに属することもあります)の操作も同様に行えます
MsgBox “エラーなく安全に処理が完了しました!”, vbInformation, “成功”
End Sub
—
コードの深掘り:なぜここまでやるのか?
上記のコードを見ると、「ちょっと厳重すぎない?」と感じるかもしれません。しかし、CorelDRAWを業務で使うデザイナーやオペレーターの操作は千差万別です。
- 「うっかり必要なレイヤーを削除してしまった」
- 「レイヤーに鍵(ロック)をかけたままマクロを実行してしまった」
- 「オブジェクトを全選択しているついでに変なタイミングで実行した」
こうしたヒューマンエラーや環境の揺らぎに対して、VBA側が「エラーを出して強制終了する」のではなく、「足りなければ作り、隠れていれば暴き、ロックされていれば外して処理を完遂する」。この優しさを持ったコードこそが、現場で愛される「神マクロ」の条件です。
—
まとめ:ここをクリアすれば、CorelDRAW VBAの基本はバッチリ!
今回は、`ActivePage` と `ActiveLayer` の存在チェックを軸に、無限ループや予期せぬクラッシュを防ぐ堅牢なエラーハンドリングを解説しました。
- 「Active」なオブジェクトは常に `Nothing` の可能性を疑う。
- 処理の前に必ず `If Object Is Nothing Then` でガードする。
- 描画先レイヤーの「Visible(表示)」や「Locked(ロック)」の状態までコードで担保する。
この3つの鉄則を意識するだけで、あなたの書くマクロの信頼性はプロのレベルへと一気に引き上げられます。ぜひ、日々の業務自動化に取り入れてみてくださいね。
CorelDRAW VBAの荒波を華麗に乗りこなすあなたを、私は心から応援しています!それでは、次回の応用テクニックでお会いしましょう。
