【入門編】【実務中級】On Error Resume Nextの正しい使い所とErrオブジェクトを活用した安全なエラーロギング機構 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押してコードを眺めるだけの日々は、もう卒業しませんか?

今回は、実務で必ず直面する「エラーとの向き合い方」について、少し踏み込んでお話しします。テーマは「`On Error Resume Next`の正しい使い所と、`Err`オブジェクトを活用した安全なエラーロギング機構」です。

「エラーが起きたらとりあえずスルーしたいから `On Error Resume Next` を書く」――もしあなたがそう教わっていたり、実際にそうコードを書いているなら、ちょっと待ってください!その書き方は、プログラムの「時限爆弾」を仕掛けているようなものです。

この記事を読み終える頃には、あなたは「ただエラーを隠すだけの初心者」から、「予期せぬトラブルをも華麗にいなす、ワンランク上のオートメーション・エンジニア」へと進化しているはずです。さあ、一緒にCorelDRAW VBAの本質をマスターしていきましょう!

1. なぜ「`On Error Resume Next`」は諸刃の剣なのか?

VBAを書いていると、どうしても避けられないのがエラーです。
例えば、「指定した名前のレイヤーが存在しない」「選択していない状態で処理を実行してしまった」「ロックされたオブジェクトを削除しようとした」などなど。

ここで初心者がやりがちなのが、これです。

‘ 【やってはいけないアンチパターン】
Sub DangerousMacro()
On Error Resume Next ‘ エラーが起きたら次の行へ進め!

‘ 存在しないレイヤーをアクティブにしようとする(ここでエラー発生)
ActiveDocument.Layers(“存在しないレイヤー”).Activate

‘ 【危険】前の行でエラーが起きているのに、何食わぬ顔で処理が継続される
ActivePage.ActiveLayer.CreateRectangle 0, 0, 100, 100

MsgBox “処理が完了しました!”
End Sub

このコードの何が怖いか分かりますか?
`Layers(“存在しないレイヤー”)` の取得に失敗しているにもかかわらず、VBAは何事もなかったかのように次の行(四角形の作成)へ進みます。その結果、「意図しないレイヤーに図形が描画されてしまい、気づいたときには手遅れ」という大惨事を引き起こします。

`On Error Resume Next` は、「エラーを無視する魔法の呪文」ではなく、「これから起きるエラーを、自分が責任を持って処理しますという宣戦布告」でなければならないのです。

2. 許されるのは「ピンポイント」と「即時チェック」だけ

では、`On Error Resume Next` は使ってはいけないのでしょうか?
いいえ、そんなことはありません。プロの現場でも頻繁に使います。ただし、使い所に絶対のルールがあります。

それは、「エラーが起きることが事前に分かっており、かつそのエラーを直ちに検知して処理を分岐させる場合のみ」に限定することです。

良い例:オブジェクトの存在確認

CorelDRAWでは、「特定の名前のレイヤーがあるか?」を事前に調べるスマートな方法が用意されていないケースがあります。そんな時、エラーハンドリングを逆手に取ります。

Dim targetLayer As Layer
On Error Resume Next
Set targetLayer = ActiveDocument.Layers(“MyCustomLayer”)
On Error GoTo 0 ‘ すぐに通常のエラー監視に戻す!

If targetLayer Is Nothing Then
MsgBox “レイヤーが見つかりませんでした。新規作成します。”
Set targetLayer = ActiveDocument.Layers.Add(“MyCustomLayer”)
Else
MsgBox “既存のレイヤーを使用します。”
End If

ここでのポイントは、エラーを無視した直後 (`On Error GoTo 0`) に監視を元に戻している点と、`Err`オブジェクト(あるいは `Is Nothing`)を使って「本当に成功したのか?」を必ず検証している点です。

3. 【実務的設計】Errオブジェクトでスマートなエラーロギング機構を作る

実務の現場では、万が一マクロが失敗したとき、ユーザーを画面の前でフリーズさせてはいけません。また、「動かなかった」という報告を受けるだけでは、開発者としてデバッグのしようがありません。

そこで、「エラーが発生したら、処理を安全に中断し、原因をテキストファイルに自動記録(ログ出力)する仕組み」を作りましょう。

以下のコードは、実務でそのまま使える堅牢なエラーハンドリングのテンプレートです。

Sub ProfessionalMacroTemplate()
‘ 1. エラーが発生したときのジャンプ先を指定
On Error GoTo ErrorHandler

‘ — 【メインの処理領域】 —
Dim doc As Document
Set doc = ActiveDocument

‘ わざとエラーを起こしてみるテスト(存在しないレイヤーを操作)
doc.Layers(“幻のレイヤー”).Activate

‘ 通常の処理がここに入ります…
MsgBox “正常に処理が終了しました。”, vbInformation
Exit Sub ‘ 正常終了時はここで抜ける

ErrorHandler:
‘ — 【エラーハンドリング領域】 —
‘ 発生したエラーの情報を変数に退避(Errオブジェクトは別のエラーで上書きされるため)
Dim errNum As Long
Dim errDesc As String
Dim errSource As String

errNum = Err.Number
errDesc = Err.Description
errSource = Err.Source

‘ ログファイルに書き出す
Call WriteErrorLog(errNum, errDesc, errSource)

‘ ユーザーへの優しい通知
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“詳細をログに記録しましたので、システム管理者にお問い合わせ してください。” & vbCrLf & _
“エラー番号: ” & errNum, vbCritical, “CorelDRAW 業務自動化システム”

End Sub

‘ —————————————————————–
‘ 共通エラーロギング関数
‘ —————————————————————–
Private Sub WriteErrorLog(ByVal errNum As Long, ByVal errDesc As String, ByVal errSource As String)
Dim fso As Object
Dim logFile As Object
Dim logPath As String

‘ ログの保存先(ここではCorelDRAWがインストールされているドライブのC:\Tempやドキュメントフォルダなどを想定)
‘ ※実務では環境に合わせてパスを変更してください
logPath = Environ$(“USERPROFILE”) & “\Documents\CorelDRAW_Macro_Error.log”

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルが存在しない場合は新規作成、存在する場合は追記モード(ForAppending = 8)で開く
‘ 3番目の引数 True は「ファイルがない場合に作成する」設定
Set logFile = fso.OpenTextFile(logPath, 8, True)

‘ タイムスタンプ付きで詳細をフォーマットして書き込み
logFile.WriteLine “—————————————-”
logFile.WriteLine “発生日時: ” & Now
logFile.WriteLine “エラー番号: ” & errNum
logFile.WriteLine “エラー内容: ” & errDesc
logFile.WriteLine “発生源: ” & errSource
logFile.WriteLine “—————————————-”

logFile.Close

‘ オブジェクトの解放(メモリリーク防止のプロの作法)
Set logFile = Nothing
Set fso = Nothing
End Sub

このコードの優れた設計ポイント

1. `Err`プロパティの即時退避
エラーハンドラーに入った直後、`Err.Number` などの情報をローカル変数に退避させています。エラー処理の途中で別のオブジェクト操作等を行うと、`Err` の中身が上書きされて消えてしまうのを防ぐための、プログラマの常套手段です。
2. FileSystemObject (FSO) による安全なテキスト出力
VBAの古い `Open` ステートメントではなく、FSOを使うことで、ファイルの競合や文字コードのトラブルを最小限に抑えています。また、`Environ$(“USERPROFILE”)` を使っているため、ユーザー名に依存せず確実に「マイドキュメント」にログを残せます。
3. リソースの確実な解放
FSOなどのCOMオブジェクトは、使い終わったら明示的に `Set logFile = Nothing` と解放してメモリをクリーンに保ちます。この積み重ねが、長時間のバッチ処理でもCorelDRAWを落とさない秘訣です。

4. チーフアーキテクトからのエール

ここまでお読みいただきありがとうございます!

「エラーを隠すコード」から「エラーを記録し、システムを守るコード」へ。この視点の切り替えができるようになったあなたは、もはや単なるマクロの利用者ではなく、立派な業務自動化エンジニアです。

現場でマクロを動かすとき、エラーは必ず起きます。大切なのは「エラーを一切出さないこと」ではなく、「エラーが起きたときに、プログラムが暴走せず、原因を瞬時に特定できる状態を作っておくこと」です。

ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!
あなたの自動化ライフが、より堅牢で快適なものになることを応援しています。それでは、次のアーキテクチャ解説でお会いしましょう!

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