我正在使用此代码打开日志文件,并读取最后一行,以查看该文件上次是否正确关闭。如果不是,它将在日志中添加一行,指定“致命错误”。但是,当代码运行时,我收到一条错误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
答案 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
,因为您没有分配任何返回值,因此将其作为函数会有些误导。