こんにちは。現場の最前線でコードと格闘している皆さん。
VBScriptは、一見すると「枯れた言語」に見えるかもしれません。しかし、Windowsの心臓部を直接叩けるこの言語を掌握することは、自動化エンジニアにとっての「強力な武器」を手にすることと同義です。
今日は、多くの人が「なんとなく」で済ませてしまっている`Err`オブジェクトを深掘りします。ここを攻略すれば、デバッグのたびに迷宮を彷徨うことはなくなります。
—
なぜ、ただの「エラー番号」では不十分なのか?
初心者の頃は `If Err.Number <> 0 Then WScript.Echo “エラー発生!”` と書くだけで満足しがちです。しかし、大規模なスクリプトや複雑なCOMオブジェクトを扱う現場では、それでは全く足りません。
「どのモジュールで、なぜ発生し、どう対処すべきか」。これを即座に突き止めるためには、`Err`オブジェクトが隠し持っている情報を余すことなくログに叩き出す仕組みが必要です。
`Err`オブジェクトの主要構成要素
- Number: エラーの識別子。ただし、これだけでは「何が起きたか」の半分も分かりません。
- Description: システムが吐き出すエラーの要約。
- Source: ここが最重要です。 どのプログラム、あるいはどのライブラリ(COMオブジェクト)が悲鳴を上げているのかを示します。
- HelpContext: 公式ヘルプへのポインタ。上級者ほどここを頼りにします。
—
極限のログ出力ロジック:実装の極意
単なるメッセージボックス表示で終わらせず、運用保守に耐えうる「構造化されたエラーハンドリング」を実装しましょう。以下のコードは、まさに現場で私が採用しているテンプレートの精鋭版です。
‘ — エラー発生時の追跡ロジック —
Sub LogErrorDetails()
‘ エラーが発生していない場合は何もしない
If Err.Number = 0 Then Exit Sub
Dim strLog
‘ 発生した情報をすべて連結して構築する
strLog = “=== 致命的な例外が発生しました ===” & vbCrLf & _
“発生時刻: ” & Now & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー詳細: ” & Err.Description & vbCrLf & _
“エラー発生元: ” & Err.Source & vbCrLf & _
“ヘルプコンテキストID: ” & Err.HelpContext & vbCrLf & _
“==================================”
‘ コンソールへの出力(必要に応じてファイル書き出しに切り替えてください)
WScript.StdErr.WriteLine strLog
‘ Errオブジェクトは放置すると汚染源になるため、必ずクリアする
Err.Clear
End Sub
‘ — 使用例 —
On Error Resume Next ‘ エラー監視を開始
‘ わざとエラーを発生させる(例:存在しないオブジェクトの参照)
Dim objTest
Set objTest = GetObject(“NonExistentComponent.Something”)
If Err.Number <> 0 Then
LogErrorDetails
End If
—
コードの「魂」を読み解く:なぜこれが必要か
1. `On Error Resume Next` の正しい付き合い方
多くの解説記事では「この命令は危険だから使うな」と教えられます。ですが、現場では「エラーを制御下に置くための必須スキル」です。重要なのは、使った直後に必ず `If Err.Number <> 0 Then` で監視し、処理が終わったら即座に `On Error GoTo 0`(あるいはエラーハンドラの終了)へ戻すという「スコープの意識」です。
2. `Err.Clear` という作法
これが最も忘れられがちなポイントです。VBScriptの `Err` オブジェクトは、一度エラーが発生すると、明示的にクリアしない限りその情報を保持し続けます。つまり、前のエラーが次の処理に誤った影響を与える「幽霊のようなバグ」を生む原因になるのです。`Err.Clear` は、プログラムのクリーンさを保つための「儀式」だと考えてください。
3. `Source` プロパティの価値
外部のExcelライブラリやADODB(データベース操作)を使っているとき、`Source` プロパティには「どのドライバがエラーを返したか」が記録されます。これがあるだけで、原因切り分けの時間が数時間から数秒に短縮されます。
—
先輩エンジニアからのアドバイス
VBScriptを使いこなすということは、「Windowsという巨大なOSのAPIと対話する」ということです。
エラーは「敵」ではなく、システムがあなたに送っている「ヒント」です。`Err`オブジェクトの全貌をログに出力するということは、システムとより深い対話を行うための第一歩です。
まずは、このログ出力をあなたのスクリプトのテンプレートに組み込んでみてください。それだけで、あなたの書くスクリプトの信頼性は、他のエンジニアとは比較にならないレベルへと引き上がります。
さあ、次はどの領域を自動化しますか? 基礎を固めたあなたなら、もう怖気づく必要はありませんよ。
