0

次のようなスクリプトを使用して、テキスト ファイル内の一部のデータをループ処理しています。

Do Until objFile.AtEndOfStream
    'Check if it is not a blank line; otherwise skip it
    If Len(Trim(objFile.ReadLine)) > 0 Then
        'Some code
    end if
Loop

毎回値を出力し、ファイルの最後まで取得します (すべての値が出力されることがわかります) が、最後に到達すると常にエラーになります。使用on error resume nextして印刷したところErr.Number、エラー番号 9 が表示されましたSubscript out of range

私がループしているファイルの問題は、最後の行が空白であることです。ファイルを開き、最後の空白行を削除してからコードを実行すると、正常に動作するため、これを知っています。ただし、これは自動化されたプロセスです (ファイルは自動的に FTP に送信され、プロセスは自動化されたタスクによって毎日実行されます)。If Len(Trim(objFile.ReadLine)) > 0 Thenこの空白行を考慮に入れるためにそれを含めましたが、データのある行では正常に機能しますが、ファイルの最後でエラーがスローされます。

空白行に達したときにループを終了させることもできますが、何らかの理由でコードの途中に空白行が表示された場合に備えて、条件を保持したいと思います。それが本当にファイルの最後の行であるかどうかを判断してから、ループを終了する方がクリーンになると思います。

何か案は?ご協力いただきありがとうございます!

4

1 に答える 1

3

まず最初に、読み込んだ行を実際にどのように処理しているかお聞きしたいと思います。どこにも保存していないからです。あなたはそれを読んでTrim()チェックのために渡しますが、後でその行にたどり着く方法はありません。

ループ内にさらに ReadLineの行がある場合 (同じ行になると考えて)、ステートメントの「空白」行を読んでいる可能性があるため、これは問題になります。ifまた、1行おきに捨てていることも意味します。

次のようなものを使用する必要があるように私には思えます:

Do Until objFile.AtEndOfStream
    thisLine = objFile.ReadLine
    If Len(Trim(thisLine)) > 0 Then
        ' Some code using thisLine, NOT another ReadLine.
    End If
Loop

もう1つ(その問題が明確になったら)、最後の行にスペースだけが含まれていると確信していますか? trim()これですべてが解消されると思います。など、問題を引き起こす他の空白がそこにある可能性がありますTAB

確認する 1 つの方法は、問題のあるファイルのコピーを取得し、最後の数行を除くすべてを削除することです。次に、デバッグ ステートメントをコードに挿入して、何が起こっているかを確認できます。

Do Until objFile.AtEndOfStream
    thisLine = objFile.ReadLine

    trimLine = Trim(thisLine)
    MsgBox ("[" & trimLine & "] " & CStr(Len(trimLine))

    If Len(Trim(thisLine)) > 0 Then
        MsgBox ("Processing it...")

        ' Some code using thisLine, NOT another ReadLine.
    End If
Loop
于 2015-01-22T06:06:46.913 に答える