VBA错误52读取日志文件的最后一行

时间:2018-10-09 12:59:03

标签: excel vba excel-vba

我正在使用此代码打开日志文件,并读取最后一行,以查看该文件上次是否正确关闭。如果不是,它将在日志中添加一行,指定“致命错误”。但是,当代码运行时,我收到一条错误52消息。我已经在这里阅读了很多文章和其他论坛,更改了我的代码,并使用了一些文章使它起作用,但是没有任何效果。

编辑为更好的MCVE:

Public Function WriteLogFile(strMsg As String)

Const LogFileName As String = "\log\FrenteCaixa.log"

Dim FileNum As Integer, strLogMsg As String, strAddFatalError As String
FileNum = FreeFile

If Right(strMsg, 6) = "aberto" Then
    Open ThisWorkbook.Path & LogFileName For Input Access Read Lock Read As #FileNum
        Dim lngCounter As Long, strLastLine As String
        lngCounter = 0
        Do Until EOF(lngCounter) **--> THE ERROR IS HERE!**
            Line Input #FileNum, strLastLine
            If Left(strLastLine, 8) <> "<!-- EoF" Then strAddFatalError = "<!-- FATAL ERROR -->"
            lngCounter = lngCounter + 1
        Loop
    Close #FileNum
End If

Open ThisWorkbook.Path & LogFileName For Append As #FileNum
If strAddFatalError <> "" Then Print #FileNum, strAddFatalError
Print #FileNum, strLogMsg
Close #FileNum

End Function

1 个答案:

答案 0 :(得分:2)

您对EOF(lngCounter)的使用是错误的。根据其文档,此函数需要一个文件号:

Function EOF(FileNumber As Integer) As Integer

您正在用一个行计数器开始输入,该计数器在开始时为0。这可能是您看到错误的原因。

尝试将EOF(lngCounter)替换为EOF(FileNum),看看是否可行。


此外,如果我没记错的话,这里根本不需要该行计数器lngCounter。通过Line Input读取一行将使行指针前进,以便下次执行该语句时,它将读取下一行。

Public Sub WriteLogFile(strMsg As String)

    Const LogFileName As String = "\log\FrenteCaixa.log"

    Dim FileNum As Integer, strLogMsg As String, strAddFatalError As String
    FileNum = FreeFile

    If Right(strMsg, 6) = "aberto" Then
        Open ThisWorkbook.Path & LogFileName For Input Access Read Lock Read As #FileNum
        Dim strLastLine As String
        Do Until EOF(FileNum)                 '**--> THE ERROR IS HERE!**
            Line Input #FileNum, strLastLine
            If Left(strLastLine, 8) <> "<!-- EoF" Then strAddFatalError = "<!-- FATAL ERROR -->"
        Loop
        Close #FileNum
    End If

    Open ThisWorkbook.Path & LogFileName For Append As #FileNum
    If strAddFatalError <> "" Then Print #FileNum, strAddFatalError
    Print #FileNum, strLogMsg
    Close #FileNum

End Sub

我也将其设为Sub,因为您没有分配任何返回值,因此将其作为函数会有些误导。