VBScriptを掌握する:TextStreamの「現在地」を把握し、エラーを瞬殺する技術
こんにちは。自動化の現場でVBScriptと長年向き合ってきたエンジニアです。
VBScriptでファイル操作を行う際、`FileSystemObject (FSO)`にお世話にならない日はありませんよね。しかし、多くの初心者が陥る罠が「巨大なテキストファイルを読み込んでいる最中に、どこで何が起きたのか分からなくなる」という問題です。
「データが途中で途切れた」「不正な形式の行がある」。そんな時、ログに「エラーが発生しました」とだけ書かれていても、何の手がかりにもなりません。
今回は、`TextStream`オブジェクトが持つ隠れた名機能、`Line`プロパティと`Column`プロパティを使い、エラーの発生場所をピンポイントで特定する「プロのデバッグ術」を伝授します。
—
1. なぜ「現在地」を知ることが重要なのか?
`TextStream`は、ファイルを「読み取り専用のテープ」のように扱います。一度通り過ぎた場所へは、原則として戻れません。
もし、10万行あるCSVファイルを処理していて、98,542行目で計算エラーが起きたとしたら?
- 悪い例: 「読み込み失敗」とだけ表示する。→ 巨大ファイルの中から該当箇所を探す地獄の作業へ。
- 良い例: 「98,542行目の12列目で不正な値を発見」と記録する。→ すぐに修正可能。
この「正確な現在地」を教えてくれるのが、`Line`(行番号)と`Column`(列番号)です。
—
2. 実践:エラー位置を特定するスマートな解析コード
まずは、このコードを見てください。ここには「読み込みながら、どこでつまづいたかを記録する」ための勘所がすべて詰まっています。
Option Explicit
Dim fso, ts, filePath
Dim currentLine, currentCol
Set fso = CreateObject(“Scripting.FileSystemObject”)
filePath = “C:\Data\LargeLogFile.txt”
‘ ファイルが存在するか確認(基本中の基本!)
If fso.FileExists(filePath) Then
Set ts = fso.OpenTextFile(filePath, 1) ‘ 1 = ForReading
On Error Resume Next ‘ エラーをトラップするために一時停止
Do Until ts.AtEndOfStream
‘ 現在位置を保存しておく
currentLine = ts.Line
Dim lineContent
lineContent = ts.ReadLine
‘ ここでデータのバリデーション(検証)を行う
‘ 例えば「数値であるべき場所に文字が入っていないか」をチェック
If Not IsNumeric(lineContent) Then
‘ エラー発生!その時の列番号も取得
currentCol = ts.Column
WScript.Echo “【解析エラー】”
WScript.Echo “場所: ” & currentLine & ” 行目、” & currentCol & ” 列目付近”
WScript.Echo “内容: 非数値データが検出されました -> ” & lineContent
Exit Do ‘ 致命的なエラーならここで抜ける
End If
Loop
If Err.Number <> 0 Then
WScript.Echo “予期せぬシステムエラー発生: ” & Err.Description
End If
ts.Close
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
Else
WScript.Echo “ファイルが見つかりません。”
End If
Set ts = Nothing
Set fso = Nothing
—
3. コードの「魂」を解説します
① `ts.Line` と `ts.Column` の正体
- `ts.Line`: ファイルの先頭から数えて、現在何行目を読み込もうとしているかを示します。
- `ts.Column`: 現在の行内で、カーソルが何文字目にあるかを示します。
注意点として、`ReadLine`を実行した直後、`Line`プロパティは「次の行」を指すようになります。 そのため、エラー判定をする前に、ループの冒頭で現在の行番号を一旦変数に退避させておくのがコツです。
② `On Error Resume Next` の正しい付き合い方
VBScriptにおいて、この命令は「エラーを無視する」ためのものではありません。「エラーが発生したときにプログラムを強制終了させず、その情報をこちらで制御する」ために使います。これを使わないと、ファイル破損などの予期せぬ事態で即座にスクリプトが落ち、原因不明のまま終わってしまいます。
③ 読み込みは慎重に
`ReadLine`は非常に便利ですが、大きなファイルを扱うときはメモリ消費に注意が必要です。もし1行が数ギガバイトあるような異常なファイルなら、`Read(1)`で1文字ずつ解析するアプローチに切り替える判断力も、プロのエンジニアには求められます。
—
4. 最後に:初心者から脱却するために
ここまで読んだあなたは、もう「マクロの記録」をただ貼り付けるだけのユーザーではありません。「処理のプロセスを可視化し、異常を追跡する」という、エンジニアとしての第一歩を踏み出しました。
VBScriptは古い言語と言われますが、Windows環境でこれほど軽量で強力な自動化ツールはありません。この`Line`と`Column`を使いこなすだけで、あなたの作るスクリプトの信頼性は、他の開発者が書くものとは比較にならないほど高まります。
次はぜひ、このエラー情報をファイルに出力して、「エラーログ解析ツール」を作ってみてください。きっと、あなたの業務負荷は劇的に減るはずです。
何か分からないことがあれば、またいつでも聞きに来てくださいね。応援しています!
