こんにちは。CorelDRAW VBAの世界へようこそ。
私は長年、数えきれないほどのドキュメント自動化エンジンを構築してきたチーフアーキテクトです。
マクロの記録を卒業し、自分の手でコードを書き始めたあなたが最初に出会う「高い壁」。それは、「プログラムが途中で止まってしまう(ランタイムエラー)」という現象ではないでしょうか。
「昨日まで動いていたのに、ページを一枚消しただけで動かなくなった」
「レイヤー名を変えたら、黄色いデバッグ画面が出て操作不能になった」
こうしたトラブルは、CorelDRAW VBAがあなたの指示通りに動こうとして、「指定された対象(ページやレイヤー)が見つからない!」とパニックを起こしている証拠です。
今日は、プロの現場で必ず実装される「堅牢なエラーハンドリング」を伝授します。ここをマスターすれば、あなたのマクロは「ただ動くツール」から「誰が使っても壊れないプロ仕様のシステム」へと進化しますよ。
—
1. なぜ「マクロの記録」だけでは不十分なのか?
マクロの記録機能は優秀ですが、致命的な弱点があります。それは「決め打ち(ハードコーディング)」です。
記録されたコードは、例えば `ActiveDocument.Pages(2).Activate` (2ページ目を開く)という動作を記録します。しかし、もしユーザーが1ページしかないドキュメントでそのマクロを実行したらどうなるでしょう?
VBAは「2ページ目なんてないよ!」と叫び、強制終了してしまいます。
これを防ぐのが、今回解説する「エラーハンドリング(例外処理)」です。
—
2. 魔法の呪文 `On Error GoTo` を使いこなす
VBAには、エラーが起きたときに「パニックにならず、あらかじめ決めた場所に避難してね」と指示を出す仕組みがあります。
基本の構造
Sub SafeLayerOperation()
‘ 1. エラーが起きたら「ErrorHandler」というラベルに飛ぶよう予約する
On Error GoTo ErrorHandler
‘ — ここにメインの処理を書く —
Dim lr As Layer
Set lr = ActivePage.Layers(“下書き用”) ‘ もしこの名前のレイヤーがなければエラーになる
lr.Visible = False
‘ —————————-
‘ 2. 正常に終わった場合は、エラー処理に入らないようにSubを抜ける
Exit Sub
ErrorHandler:
‘ 3. エラーが起きた時の対応(避難場所)
MsgBox “エラーが発生しました:” & Err.Description, vbCritical, “システム通知”
End Sub
この構造を作るだけで、不意の強制終了を回避し、ユーザーに優しいメッセージを表示できるようになります。
—
3. 実践:存在しないページ指定をスマートに回避する
ページ操作は、最もエラーが起きやすい場所の一つです。まずは「指定したページが存在するか?」を確認するプロの手法を見てみましょう。
ページ切り替えの安全設計
Sub GoToPageSafely()
Dim targetPageIndex As Integer
‘ ユーザーに入力を促す(例として)
targetPageIndex = InputBox(“移動したいページ番号を入力してください”)
‘ エラーハンドリング開始
On Error GoTo PageError
‘ 【プロの知見】エラーを待つ前に、まずは自分で数を確認する(防御的プログラミング)
If targetPageIndex > 0 And targetPageIndex <= ActiveDocument.Pages.Count Then
ActiveDocument.Pages(targetPageIndex).Activate
MsgBox targetPageIndex & "ページ目に移動しました。"
Else
' あえてエラーを発生させるか、メッセージを出して終了
MsgBox "指定されたページは存在しません。", vbExclamation
End If
Exit Sub
PageError:
MsgBox "ページ移動中に予期せぬエラーが発生しました。", vbCritical
End Sub
---
4. 応用:レイヤーの有無をチェックしてガイド線を引く
次に、特定のレイヤー(例:「ガイド層」)を探し、なければ自動で作ってからガイド線を引くという、少し高度な自動化に挑戦しましょう。
ここでのポイントは、「オブジェクトが存在するかどうかを判定する専用の関数」を作ってしまうことです。これができるようになると、コードの再利用性が劇的に高まります。
レイヤー制御とガイド線自動配置の極意
Sub SetupGuidesWithSafety()
Dim targetLayerName As String: targetLayerName = “自動ガイド層”
Dim lr As Layer
On Error GoTo Finalize
‘ 1. レイヤーが存在するかチェック(自作関数を呼び出す)
If Not DoesLayerExist(targetLayerName) Then
‘ 存在しなければ作成する
Set lr = ActivePage.CreateLayer(targetLayerName)
lr.Color.CopyAssign CreateRGBColor(0, 255, 255) ‘ シアン色に設定
MsgBox “新しいレイヤー「” & targetLayerName & “」を作成しました。”
Else
‘ 存在すればそのレイヤーを取得
Set lr = ActivePage.Layers(targetLayerName)
End If
‘ 2. ガイド線を引く(例:用紙の端から10mmの位置)
‘ CorelDRAWの内部単位は「インチ」であることが多いため、注意が必要
ActiveDocument.Unit = cdrMillimeter ‘ 単位をミリに固定
‘ 水平ガイド線を追加
ActivePage.Guides.AddHorizontal 10
‘ 垂直ガイド線を追加
ActivePage.Guides.AddVertical 10
MsgBox “ガイド線の配置が完了しました。”, vbInformation
Exit Sub
Finalize:
MsgBox “エラー内容: ” & Err.Description, vbCritical, “アーキテクト通知”
End Sub
‘ — 【超重要】レイヤーの存在確認用ヘルパー関数 —
Function DoesLayerExist(lyrName As String) As Boolean
Dim ly As Layer
On Error Resume Next ‘ エラーが起きても次の行へ進む(一時的な無視)
Set ly = ActivePage.Layers(lyrName)
‘ lyに値が入っていれば存在、Nothingなら存在しない
DoesLayerExist = Not (ly Is Nothing)
On Error GoTo 0 ‘ エラー無視設定を解除
End Function
—
5. チーフアーキテクトからのアドバイス
今回のコードで登場した `On Error Resume Next` と `On Error GoTo 0`。これは、特定の1行だけエラーを無視したい時に使うテクニックです。
「存在するかどうかを確認するためだけにエラーを起こしてみる」というのは、VBAにおいて非常に一般的で、かつ効率的な手法です。
陥りやすい罠:エラーハンドラーの閉じ忘れ
`Exit Sub` を書き忘れると、プログラムが正常に終わった後も、一番下の `ErrorHandler:` の中身が実行されてしまいます。
「成功したはずなのにエラーメッセージが出る!」という場合は、必ず `Exit Sub` の位置を確認してくださいね。
—
まとめ:ここをクリアすれば、CorelDRAW VBAの基本はバッチリです
エラーハンドリングを学ぶことは、「マクロが壊れた時のことまで責任を持つ」という、プロフェッショナルへの第一歩です。
1. `On Error GoTo` で全体の安全網を張る。
2. `Exit Sub` で正常終了を確保する。
3. `If`文 で事前にオブジェクトの存在(Pages.Countなど)を確認する。
4. `On Error Resume Next` を使った存在確認関数を武器にする。
この4点を意識するだけで、あなたの作成するマクロの信頼性は格段に向上します。CorelDRAWという広大なキャンバスを、あなたのコードで自由自在に操れる日はすぐそこです。
次回のステップでは、さらに複雑な「ドキュメントをまたいだオブジェクトの移動」に挑戦していきましょう。応援していますよ!
