Для использования подобного кода записи логов необходимо скопировать (перетащив мышкой) модуль класса LogRecorder из прикреплённого файла в ваш файл.
Sub ПримерИспользованияКласса_LogRecorder()
' создаём новый экземпляр лог-рекордера
Dim LR As LogRecorder: Set LR = New LogRecorder
' задаём имя файла для лога (указываем полный путь)
LR.LogFileFullName = ThisWorkbook.Path & "\common.log"
LR.OpenLog ' открываем лог (очистка файла + запись стартовой строки)
For i = 1 To 10
' здесь ваш код ...
' заносим запись в лог
LR.AddRecord "Событие " & i, "Информация " & i, 1
If i Mod 3 = 0 Then ' i делится на 3 без остатка
' добавляем запись, до и после неё вставляем строку-разделитель
LR.AddRecord "Значение " & i & " делится на 3 без остатка", _
"дополнительная проверка", 2, LOG_SEPARATOR_BEFORE_AND_AFTER
End If
Next i
LR.AddRecord "Цикл завершен", "Проверено 10 чисел", 1, LOG_SEPARATOR_AFTER
LR.CloseLog ' закрываем лог (очистка буфера + запись конечной строки)
' LR.Show ' запуск текстового файла с логом (для просмотра
End Sub
Можно при добавлении записей в лог указать уровень записей - чтобы выделять отдельные записи отступом слева, как на этом скриншоте: http://ExcelVBA.ru/pictures/20110829-cd9-96kb.jpg
Кроме того, можно задать максимальное значение буфера лога (запись непосредственно в файла происходит не при каждом выполнении команды AddRecord, а только при превышении размера буфера, принудительном сохранении лога опцией ForceSavingLog=TRUE, а также при сохранении лога командой SaveLog, и при закрытии лога методом CloseLog )
Размер буфера можно изменить, задав значение свойства maxLogSizeBeforeSave (количество символов, при котором лог-файл будет сохранён принудительно, по умолчанию = 5000)
Результатом работы этого кода будет создание файла с именем common.log в той же папке, где расположен файл Excel с макросом:
==================================================
2011-08-29 10:19:30 Starting Log Record...
2011-08-29 10:19:30 Событие 1 Информация 1
2011-08-29 10:19:30 Событие 2 Информация 2
2011-08-29 10:19:30 Событие 3 Информация 3
==================================================
2011-08-29 10:19:30 Значение 3 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 4 Информация 4
2011-08-29 10:19:30 Событие 5 Информация 5
2011-08-29 10:19:30 Событие 6 Информация 6
==================================================
2011-08-29 10:19:30 Значение 6 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 7 Информация 7
2011-08-29 10:19:30 Событие 8 Информация 8
2011-08-29 10:19:30 Событие 9 Информация 9
==================================================
2011-08-29 10:19:30 Значение 9 делится на 3 без остатка дополнительная проверка
==================================================
2011-08-29 10:19:30 Событие 10 Информация 10
2011-08-29 10:19:30 Цикл завершен Проверено 10 чисел
==================================================
2011-08-29 10:19:30 Finishing Log Record...
==================================================
Для создания сразу нескольких логов удобно использовать дополнительный модуль класса LogRecorders (также присутствует в прикреплённом файле)
Код модуля класса LogRecorder:
Public Enum LOG_SEPARATOR_TYPE ' добавление разделителей в лог
LOG_SEPARATOR_NONE = 0
LOG_SEPARATOR_BEFORE = 1
LOG_SEPARATOR_AFTER = 2
LOG_SEPARATOR_BEFORE_AND_AFTER = 3
End Enum
Public LogFileFullName As String
Public LogIndex As LOG_TYPE
Public index As Long
Public Buffer As String
Public maxLogSizeBeforeSave As Long
Public LogSeparator As String
Private Sub Class_Terminate()
Buffer = "" 'CloseLog
End Sub
Private Sub Class_Initialize()
LogSeparator = String(50, "=") & vbNewLine
If maxLogSizeBeforeSave = 0 Then maxLogSizeBeforeSave = 5000
End Sub
Sub SaveLog()
If AddIntoTXTfile(LogFileFullName, Buffer) Then
Buffer = Empty
Else
Debug.Print "Ошибка записи лога в файл " & LogFileFullName
End If
End Sub
Sub OpenLog()
Buffer = "" ' очистка буфера
SaveTXTfile LogFileFullName, "" ' сохранение пустого файла
AddRecord "Starting Log Record...", , , LOG_SEPARATOR_BEFORE, True ' стартовая запись
End Sub
Sub CloseLog()
AddRecord "Finishing Log Record...", , , LOG_SEPARATOR_AFTER, True ' конечная запись
Buffer = "" ' очистка буфера
End Sub
Sub Show()
'On Error Resume Next
Path$ = Chr(34) & LogFileFullName & Chr(34)
CreateObject("wscript.shell").Run Path$
End Sub
Sub AddRecord(ByVal EventX As String, Optional ByVal Info As String, _
Optional ByVal Level As Integer = 0, _
Optional ByVal LogSeparatorType As LOG_SEPARATOR_TYPE = LOG_SEPARATOR_NONE, _
Optional ByVal ForceSavingLog As Boolean = False)
txt = String(160, " "): Mid(txt, 1) = Left(EventX, 45): Mid(txt, 51) = Info
txt = String(Level, vbTab) & Format(Now, "YYYY-MM-DD HH:NN:SS") & String(2, vbTab) & Trim(txt) & vbNewLine
txt = IIf(LogSeparatorType = LOG_SEPARATOR_BEFORE Or LogSeparatorType = LOG_SEPARATOR_BEFORE_AND_AFTER, LogSeparator, "") & _
txt & IIf(LogSeparatorType = LOG_SEPARATOR_AFTER Or LogSeparatorType = LOG_SEPARATOR_BEFORE_AND_AFTER, LogSeparator, "")
Buffer = Buffer & txt
If ForceSavingLog Or (Len(Buffer) > maxLogSizeBeforeSave) Then SaveLog
End Sub
Sub SaveLogAs(ByVal filename As String, Optional ByVal Overwrite As Boolean = False)
On Error Resume Next
txt = ReadTXTfile(LogFileFullName)
If Overwrite Then
SaveTXTfile filename, txt
Else
AddIntoTXTfile filename, txt
End If
End Sub
' ===============
Private Function ReadTXTfile(ByVal filename As String) As String
Set FSO = CreateObject("scripting.filesystemobject")
Set ts = FSO.OpenTextFile(filename, 1, True): ReadTXTfile = ts.ReadAll: ts.Close
Set ts = Nothing: Set FSO = Nothing
End Function
Private Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
On Error Resume Next: Err.Clear
Set FSO = CreateObject("scripting.filesystemobject")
Set ts = FSO.CreateTextFile(filename, True)
ts.Write txt: ts.Close
SaveTXTfile = Err = 0
Set ts = Nothing: Set FSO = Nothing
End Function
Private Function AddIntoTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
On Error Resume Next: Err.Clear
Set FSO = CreateObject("scripting.filesystemobject")
Set ts = FSO.OpenTextFile(filename, 8, True): ts.Write txt: ts.Close
Set ts = Nothing: Set FSO = Nothing
AddIntoTXTfile = Err = 0
End Function
Вложение |
Размер |
Загрузки |
Последняя загрузка |
LOG_class.xls |
55 КБ |
35 |
20 недель 3 дня назад |