Страницы: 1
RSS
Макрос для учёта времени работы в файле excel
 
Коллеги, добрый день.
Есть задумка и потребность наладить автоматический учёт времени работы в excel файле.
Базовая концепция очень простая:
При открытии книги на отдельном листе создаётся строка (сессия) где в первой колонке вбивается имя юзера, во второй - текущая дата и время.
При сохранении в третью колонку заносится время сохранения, в четвертой колонке формулой прописывается разница во времени и сразу стартует аналогичная новая строка. Разница времени и будет временем работы.
И легкое усложнение - должен работать постоянный таймер обратного отсчёта после последнего действия (наверное последнего клика мышкой в данном файле) например на 15 минут после которого автоматом происходит закрытие очередной строки (сессии). При возвращении к файлу и первом клике сразу начинает писаться новая сессия.

По-моему должно быть довольно просто и удобно.  :D
Возможно кто-то делал что-то подобное? Буду очень благодарен за любую помощь и советы, так как у меня знание VBA на самом начальном уровне.
Я пока застрял на стадии отложенного старта процесса:
Код
Sub Worksheet_Change(ByVal Target As Range)
Application.OnTime Now + TimeValue("00:00:15")
MsgBox "This is fun"
End Sub
 
http://www.planetaexcel.ru/techniques/5/196/
http://www.planetaexcel.ru/techniques/5/208/
 
Цитата
mrMad-Cat написал: 15 минут
Цитата
mrMad-Cat написал: TimeValue("00:00:15")
:D
 
Ivan.kh, О, спасибо, изучу. А то через гугл что-то не получалось найти.
15 секунд так как я сейчас тестирую. ) не буду же я ждать 15 минут  во врем теста )
 
После изучения данных ссылок и другой информации в интернете сделал вариант с новыми строками всегда сверху. Вышло очень классно.
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
   'çàíîñèì äàòó-âðåìÿ âûõîäà èç ôàéëà
    Worksheets("LOG").Cells(2, 3) = Format(Now, "dd.mm.yyyy hh:mm:ss")
End Sub
 
Private Sub Workbook_Open()
   'âñòàâëÿåì íîâóþ âòîðóþ ñòðîêó è êîïèðóåì ôîðìàòû ñíèçó
    Rows(2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
   'çàíîñèì èìÿ ïîëüçîâàòåëÿ è äàòó-âðåìÿ íà÷àëà ñåññèè
    Worksheets("LOG").Cells(2, 1) = Environ("USERNAME")
    Worksheets("LOG").Cells(2, 2) = Format(Now, "dd.mm.yyyy hh:mm:ss")
End Sub
Теперь перехожу ко второй стадии - запуск таймера обратного отсчёта после последнего действия с книгой, чтобы "оборвать сессию". Это явно будет сложнее. Как я понимаю следующий макрос даст возможность отслеживать последние изменения ячеек посредством ввода/удаления данных и через 15 минут выполнять следующий макрос. Но не могу пока сообразить как остановить таймер в случае последующего изменения и запуска нового отсчёта. Буду благодарен за подсказки.
Код
Sub Worksheet_Change(ByVal Target As Range)
Application.OnTime Now + TimeValue("00:15:00"), "othersub"
End Sub
Ну и так как работа с файлом не всегда касается редактирования ячеек, а и работы с фильтрами, сводными таблицами, диаграммами, что можно еще использовать помимо Worksheet_Change?

Спасибо.
 
В общем я всё сделал. Вышло очень круто. Если кому интересно и для тех кто попадёт сюда через гугл:
Скрытый текст


Код Module1:
Код
'Вводим глобальные переменные для использования во всём документе
Public xl0 As New Excel.Application
Public xlw As New Excel.Workbook
Public endtime As Double
Public session_active As Boolean
Public log_file As String
Public timer_time As Date
Public SaveAS_Check As Boolean

Sub Write_Start() 'Заносим начало сессии
    'Вставляем новую вторую строку и копируем форматы снизу:
    xlw.Worksheets("LOG").Rows(2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
    'Заносим имя пользователя, имя файла, путь к файлу и дату-время начала сессии:
    xlw.Worksheets("LOG").Cells(2, 1) = Format(Now, "dd.mm.yyyy")
    xlw.Worksheets("LOG").Cells(2, 2) = Environ("USERNAME")
    xlw.Worksheets("LOG").Cells(2, 3) = ThisWorkbook.Name
    xlw.Worksheets("LOG").Cells(2, 4) = ThisWorkbook.Path
    xlw.Worksheets("LOG").Cells(2, 5) = Format(Now, "dd.mm.yyyy hh:mm:ss")
End Sub

'Функция поиска строки в логе
Function FindMatch(x, y, z)
    Const FirstRow = 2
    Dim LastRow As Long
    Dim CurRow As Long
    With xlw.Worksheets("LOG")
        LastRow = .Range("B:C").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        For CurRow = FirstRow To LastRow
            If .Range("B" & CurRow).Value = x And .Range("C" & CurRow).Value = y And .Range("D" & CurRow).Value = z Then
                FindMatch = CurRow
                Exit Function
            End If
        Next CurRow
    End With
    ' Если не находит строки
    FindMatch = "NO_SESSION"
End Function

Sub Write_Close() 'Заносим время окончания и разницу во времени
    Row_Number = FindMatch(Environ("USERNAME"), ThisWorkbook.Name, ThisWorkbook.Path)
    If Row_Number = "NO_SESSION" Then
        MsgBox "Такая сессия отсутсвует в логе! Данные не записаны!!!"
        Else
        xlw.Worksheets("LOG").Cells(Row_Number, 6) = Format(Now, "dd.mm.yyyy hh:mm:ss")
        xlw.Worksheets("LOG").Cells(Row_Number, 7) = "=F" & Row_Number & "-E" & Row_Number
    End If
End Sub

Sub Start_Session() 'Открываем новую сессию
    'Открываем файл лога в отдельной программе excel
    Set xlw = xl0.Workbooks.Open(log_file)
    'Вызываем саб записи
    Call Write_Start
    'Сохраняем и закрываем лог файл:
    xlw.Save
    xlw.Close
    session_active = True
End Sub

Sub Close_Session() 'Закрываем последнюю сессию
    'Открываем файл лога в отдельной программе excel
    Set xlw = xl0.Workbooks.Open(log_file)
    'Вызываем саб записи
    Call Write_Close
    'Сохраняем и закрываем лог файл:
    xlw.Save
    xlw.Close
    session_active = False
End Sub

Sub Save_Session() 'Сохраняем сессию не закрывая ее
    'Открываем файл лога в отдельной программе excel
    Set xlw = xl0.Workbooks.Open(log_file)
    'Вызываем саб записи
    Call Write_Close
    'Сохраняем и закрываем лог файл:
    xlw.Save
    xlw.Close
End Sub


Код ThisWorkbook:
Код
Sub Workbook_Open() 'Действия при открытии книги
    'Определяем путь к лог файлу
    log_file = "ПУТЬ К ФАЙЛУ ЛОГА"
    'Определяем время таймера завершения сессии
    timer_time = "00:08:00"
    'Начинаем новую сессию
    Call Start_Session
    'Запускаем таймер
    endtime = Now + TimeValue(timer_time)
    Application.OnTime endtime, "Close_Session"
    'Для корректной работы при сохранении
    SaveAS_Check = False
End Sub

Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'После каждого последнего выделения новой ячейки
    'Убиваем все активные Application.OnTime
    On Error Resume Next
    Application.OnTime endtime, "Close_Session", , False
    If session_active = True Then
        'Если сессия активна - начинаем обратный отсчёт, если время выходит - идем закрывать сессию
        endtime = Now + TimeValue(timer_time)
        Application.OnTime endtime, "Close_Session"
        Else
        'если сессия не активна - начинаем новую и начинаем обратный отсчёт
        Call Start_Session
        endtime = Now + TimeValue(timer_time)
        Application.OnTime endtime, "Close_Session"
    End If
End Sub

Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Закрытие сессии при сохранении книги
    If session_active = True Then
        Call Save_Session
    End If
    'Проверка на СохранитьКак
    If SaveAsUI Then
        SaveAS_Check = True
    End If
End Sub

Sub Workbook_AfterSave(ByVal Success As Boolean)
    'Создание новой сессии если СохранитьКак
    If SaveAS_Check = True Then
        Call Start_Session
        SaveAS_Check = False
    End If
End Sub
 
Sub Workbook_BeforeClose(Cancel As Boolean)
    'Убиваем все активные Application.OnTime чтобы файл не переоткрылся и не было лишних записей
    On Error Resume Next
    Application.OnTime endtime, "Close_Session", , False
    'Закрываем сессию если активна
    If session_active = True Then Close_Session
End Sub
Структура лог файла:
Лист LOG и колонки A-G
Date-USER-FILENAME-FILEPATH-SESSION START-SESSION END-TIME, h
Нужно разово настроить форматы колонок.
Так же лист сводной таблицы чтобы с этим работать и анализировать.
Изменено: mrMad-Cat - 21.06.2016 11:01:25
 
Обнаружил что при сохранении файла "Как" есть проблема с созданием новой сессии. Дополнил макрос чтобы исправить эту проблему.
 
Добрый день!

Отличное решение, которое как раз хотел применить у себя.

Но есть проблема, не работает поиск сессии, и при закрытии книги всегда появляется сообщение: "Такая сессия отсутствует в логе! Данные не записаны!!!" (соответственно не записывается время завершение сессии и период работы с файлом).

Код я взял без изменения.

Подскажите, пжлст, в чем может быть проблема?
 
суперская вещь. вот только у меня возникла проблема на ряде машин выдает сбой и не работает вообще. просила народ посмотреть что за сбой.

Run-time error -2147319779 (8002801d)
Automation error
Library not registered

при нажатии debug выделена вот эта строка
Set xlw = xl0.Workbooks.Open(log_file)

я так и гуглила и вертела - то ли версия офиса там не попадает, то ли еще чего-то не хватает. в итоге это не работает только на нескольких машинах.
можете посоветовать что-то?  
Страницы: 1
Наверх