VBScriptを「使いこなす」ための極意:堅牢なエラーハンドリングでスクリプトを止めるな
こんにちは。システム自動化の現場で長年戦ってきたエンジニアです。
VBScriptを書き始めた多くの人が最初にぶつかる壁、それは「ちょっとしたエラーでスクリプトが即死する」という絶望です。画面に表示されるダイアログボックス一つで、数時間かかるはずの自動処理が停止する……これほど悲しいことはありません。
今日は、VBScriptにおける「エラーハンドリングの真髄」をお教えします。これをマスターすれば、あなたのスクリプトはただの「動くコード」から、現場で信頼される「堅牢なツール」へと進化します。
—
1. なぜ `On Error Resume Next` を使うのか?
VBScriptにおいて、例外処理の出発点は `On Error Resume Next` です。
これは、「エラーが発生しても止まるな、次の行へ行け」という命令です。
「エラーを無視するのか?」と不安になるかもしれませんが、違います。「エラーを無視するのではなく、エラーの発生を検知するための権利を自分で握る」のです。
陥りがちな罠
初心者は `On Error Resume Next` を書くだけで満足しがちですが、これだけでは「沈黙のバグ」を生むだけです。「なぜ動かないのか分からない」という状態が一番の悪夢です。
—
2. プロ仕様の構造化エラーハンドリング・モジュール
エラーを「捕まえて、記録して、正しく処理する」。この3ステップを自動化する仕組みを構築しましょう。
以下に、現場でそのまま使える「汎用エラーログ関数」を実装したテンプレートを提示します。
‘ — メイン処理 —
On Error Resume Next ‘ エラー監視を開始
‘ わざとエラーを発生させる例:存在しないファイルへのアクセス
Dim fso, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set file = fso.OpenTextFile(“C:\Dummy\NotExists.txt”, 1)
‘ エラーをチェックする
If Err.Number <> 0 Then
Call LogError(“ファイル読み込みエラー”, Err)
‘ ここで終了処理やリトライ処理を記述する
Err.Clear ‘ 重要:エラー情報をクリアしないと次の行まで引きずる
End If
On Error Goto 0 ‘ エラー監視を解除(標準の動作に戻す)
‘ — 汎用エラーログ関数 —
Sub LogError(context, objErr)
Dim fso, logFile, ts
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログファイルへの追記(なければ新規作成)
Set logFile = fso.OpenTextFile(“C:\Logs\ErrorLog.txt”, 8, True)
‘ 発生時刻、状況、エラー番号、詳細を記録
ts = Now & ” [ERROR] ” & context & vbCrLf
ts = ts & “Number: ” & objErr.Number & vbCrLf
ts = ts & “Source: ” & objErr.Source & vbCrLf
ts = ts & “Description: ” & objErr.Description & vbCrLf
ts = ts & “———————————–”
logFile.WriteLine(ts)
logFile.Close
‘ 必要に応じてユーザーに通知
WScript.Echo “エラーが発生しました。ログを確認してください。”
End Sub
—
3. コードの解説:ここがプロのこだわり
このコードには、現場のエンジニアなら必ず守る「3つの鉄則」が詰まっています。
1. `Err.Number <> 0` による判定
VBScriptの `Err` オブジェクトは、エラーが発生した瞬間にその詳細を保持します。0であれば正常、それ以外なら異常。このシンプルな判定が全ての基礎です。
2. `Err.Clear` の徹底
これを忘れると、最初のエラーがずっと残り続け、後続の正常な処理まで「エラー」として扱われるという悲劇が起きます。エラーを処理したら、必ずクリアする。 これが鉄則です。
3. `On Error Goto 0` で閉じる
エラー監視は、必要な場所だけで行うのがスマートです。監視範囲を限定することで、思わぬバグが隠蔽されるリスクを最小限に抑えます。
—
4. 現場で生き残るためのアドバイス
VBScriptは古い言語と言われますが、Windowsの管理業務においては今なお最強のツールです。
- 「何が起きたか」を饒舌に記録する:
ログファイルには `Err.Description` だけではなく、その処理が「どこで(Context)」起きたかを必ず引数として渡すようにしてください。ログを見た瞬間に原因が特定できるかどうかが、プロとアマの分かれ道です。
- 例外処理を「隠蔽」に使わない:
「エラーを握りつぶしてなかったことにする」のは悪手です。必ず「ログに書く」「管理者にメールする」「処理をリトライする」といった、明確なアクションを伴わせてください。
—
まとめ:あなたのスクリプトは進化する
エラーハンドリングを構造化するということは、「システムに起きたトラブルを、自分の制御下に置く」ということです。
最初は難しく感じるかもしれませんが、このテンプレートをコピー&ペーストして、あなたのプロジェクトに合わせてカスタマイズしてみてください。一度この「守りの型」を身につければ、どんな複雑なバッチ処理を組んでも怖くはありません。
ここをクリアしたあなたは、もう「マクロの記録」を使っていた頃のあなたとは別次元にいます。自信を持って、次の自動化へ踏み出しましょう!
もし分からないことがあれば、いつでも聞いてくださいね。応援しています。
