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这也意味着您将丢弃每一行。

在我看来,你应该使用类似的东西:

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

另一件事(一旦澄清了这个问题),你确定最后一行只包含空格吗?我认为这一切trim()都摆脱了。可能是那里有其他空白导致您出现问题,TAB例如 .

找出问题的一种方法是复制一个有问题的文件并删除除最后几行之外的所有内容。然后您可以在代码中插入调试语句以查看发生了什么:

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 回答