【入門編】【ログ記録強化】On Error Resume NextとErrオブジェクトを組み合わせたFSO操作エラーログ出力 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する:FSO操作の「死角」を消すエラーハンドリングの極意

こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきたエンジニア諸君。

今日はVBScriptにおける「ファイルシステム操作」の、まさに心臓部とも言えるエラーハンドリングの設計術についてお話しします。「マクロの記録」から一歩踏み出し、堅牢なスクリプトを書くために避けては通れない道です。

VBScriptでファイル操作をする際、`On Error Resume Next`をただ「エラーを無視する魔法の呪文」だと思っていませんか? それは大きな間違いです。正しく制御しなければ、あなたの書いたスクリプトは「何が起きたか分からないまま静かに死ぬ」ことになります。

今日は、FSO(FileSystemObject)を使いこなし、エラーを確実にログへ刻み込む「プロフェッショナルの作法」を伝授しましょう。

—

1. なぜ「On Error Resume Next」だけでは不十分なのか

VBScriptには、C#やJavaのような高度な`Try-Catch`構文が存在しません。そのため、エラーが発生した瞬間にスクリプトを止めるのではなく、あえて継続させ、直後にエラーの状態をチェックするという手法を取ります。

しかし、チェックを怠れば、ファイルが削除できていないのに「完了しました」というログが出る……という悲劇が起こります。これを防ぐのが`Err`オブジェクトの役割です。

エラーを「握りつぶさない」ための黄金律

1. `On Error Resume Next`を局所化する(処理の直前で有効にし、直後に戻す)。
2. `Err`オブジェクトを即座にクリアする(`Err.Clear`)。
3. エラー番号を判定し、ログに出力する。

—

2. 実践:エラーログ出力付きFSO操作テンプレート

現場でそのまま使える、堅牢なファイル削除処理のコード例です。この構造をマスターすれば、どんなファイル操作も怖くありません。

Option Explicit

‘ メイン処理の入り口
Call SafeDeleteFile(“C:\Logs\TargetFile.txt”, “C:\Logs\ErrorLog.txt”)

Sub SafeDeleteFile(strFilePath, strLogPath)
Dim fso, logFile
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. エラーハンドリング開始
On Error Resume Next

‘ 2. 実際の操作
fso.DeleteFile strFilePath, True

‘ 3. エラーが発生したか判定
If Err.Number <> 0 Then
‘ エラー発生時の処理
Set logFile = fso.OpenTextFile(strLogPath, 8, True) ‘ 8は追記モード
logFile.WriteLine Now() & ” [ERROR] ファイル削除失敗: ” & strFilePath
logFile.WriteLine “Err.Number: ” & Err.Number
logFile.WriteLine “Err.Description: ” & Err.Description
logFile.Close

‘ エラーをクリアしてシステムにクリーンな状態を戻す
Err.Clear
End If

‘ 4. エラーハンドリングを通常モードに戻す(重要!)
On Error Goto 0

Set fso = Nothing
End Sub

コードの解説

  • `8` (ForAppending): ログファイルを開く際の定数です。これを使えば既存のログを消さずに末尾に追記できます。
  • `Err.Number <> 0`: これが「エラーが起きたか?」を問う合図です。0以外であれば何かが起きています。
  • `On Error Goto 0`: これを忘れると、スクリプトの最後までエラーを無視し続けることになり、後続の致命的なバグを見逃します。必ずセットで書きましょう。

—

3. 初学者が陥りやすい「FSOの罠」

現場でよくある失敗事例を挙げておきます。これに気をつけるだけで、あなたのコードの品質は一段上がります。

  • 「ファイルが存在するか?」を確認せずに操作する:

`fso.FileExists(path)` を使わずにいきなり削除しようとすると、存在しないだけでエラーになります。基本は「存在確認」→「操作」の順序です。

  • ファイルがロックされている:

他のアプリケーションが開いているファイルは削除できません。この時、`Err.Number`は「70 (Permission Denied)」を返します。ログを見てこの番号が出たら、「あ、誰かがファイルを開いているな」と即座に切り分けができるはずです。

  • オブジェクトの解放漏れ:

`Set fso = Nothing` を書く癖をつけましょう。小規模なスクリプトなら問題ありませんが、長期稼働するバッチ処理ではメモリリークの原因になります。

—

最後に:エンジニアとしての矜持

VBScriptは古い言語だと言われることもあります。しかし、Windows環境がある限り、この「シンプルで強力な自動化ツール」は最強の武器であり続けます。

「動けばいい」コードから「エラーを語れる」コードへ。
今日学んだログ出力の仕組みは、システムが予期せぬ挙動をした時、深夜のトラブルシューティングであなたを助ける唯一の味方になります。

ここをクリアしたあなたは、もう初心者ではありません。さあ、次はどんな業務を自動化しますか? 応援していますよ。

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