mail mail
Нужен макрос для Excel?
Сделайте заказ прямо сейчас!
Ищете готовое решение?
Выбирайте и покупайте!
У вас есть интернет-магазин?
Настроим парсер под любой сайт!

Ведение логов действий программы (модуль класса)

Для использования подобного кода записи логов необходимо скопировать (перетащив мышкой) модуль класса 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.xls55 КБ3321 неделя 9 часов назад

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Всё нормально с файлом (только что проверил)
Убедитесь, что антивирус не повреждает его после скачивания

Файл поврежден... Перезалейте пожалуйста

Приветствую. Спасибо за всё хорошее.
Полагаю, чтобы использовать LogRecorder standalone от модуля LogRecorders, стоит скопировать из второго в первый:

Public Enum LOG_TYPE ' типы лог-файлов
LOG_CURRENT = 0
LOG_DEFAULT = 1
LOG_ENCRYPTED = 2
LOG_SPECIAL = 4
LOG_ERRORS = 8

LOG_MAIL = 9
End Enum

иначе выдаёт: Compile error: User-defined type not defined

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
      _                      _       ____         
__| | _ _ __ __ | | | _ \ _ __
/ _` | | | | | \ \ /\ / / | | | | | | | '__|
| (_| | | |_| | \ V V / | |___ | |_| | | |
\__,_| \__,_| \_/\_/ |_____| |____/ |_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.