Есть таймер, который автоматически включается при открытии книги, работает в фоновом режиме и при закрытии книги записывает время проведенное пользователем в этом файле, каждый раз суммируя время предыдущего сеанса с текущим. P.S. отдельная благодарность Sanja за помощь
Скрытый текст
Public StartTime As Date Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayAlerts = False With Лист1.[A1] .Value = .Value + (Time - StartTime) End With ThisWorkbook.Save End Sub Private Sub Workbook_Open() StartTime = Time End Sub
Помогите, пожалуйста, дополнить его одной важной для меня особенностью: таймер при открытии книги начинает работать в фоновом режиме, однако, когда пользователь не проводит никаких манипуляций с этой книгой (файлом) на протяжении 1 минуты, таймер останавливался, а когда пользователь продолжит работу с книгой любым образом, таймер продолжит работу и при закрытии книги забьет время активной работы данного сеанса + сумма предыдущих сеансов. Буду очень признателен, если у кого будет время и желание помочь мне с данным вопросом!
kleono, здравия. Предложу др. вариант отслеживания времени работы с файлом: 1) на событие откр. файла в переменную или куда ещё записываем Now; 2) на событие закр. файла в другую переменную или куда ещё записываем Now; 3) разница второй и первой записи и будет время работы пользователя с файлом.
Формула массива (ФМ) вводится Ctrl+Shift+Enter Memento mori
JayBhagavan, Так в прикрепленном файле это уже реализовано, он все суммирует и записывает время открытия файла. А мне надо, чтобы он останавливался на паузу, если человек не совершает никаких действий. Например, человек открыл файл, таймер пошел, он поработал в нем 30 минут, а дальше пошел заниматься своими делами, а компьютер включен и файл он не закрывал, таймер будет считать все время. А мне надо, чтобы таймер становился на паузу, если у пользователя файл excel неактивен (он не совершает никакой работы в нем, вообще) на протяжении 1 минуты, а как только пользователь переключится на файл или совершит в нем любое действие, таймер дальше продолжил свою работу и в итоге записал в ячейку сумму времени старого сеанса и этого, но только активное время работы по принципу описанному выше. Реально вообще такое задать с помощью VBA?
Public StartTime As Date, LastActionTime As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
On Error Resume Next
Application.EnableEvents = False
With Лист1.[A1]
.Value = .Value + (Now - StartTime)
End With
Application.EnableEvents = True
Me.Save
End Sub
Private Sub Workbook_Open()
StartTime = Now
LastActionTime = StartTime
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Check
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Check
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Check
End Sub
'========================================
'можно добавить вызов Check и на другие события книги: WindowActivate, SheetFollowHyperlink и т.д.
'========================================
Private Sub Check()
Dim nw As Date
nw = Now
If nw > LastActionTime + #12:01:00 AM# Then 'если со времени пред. действия прошло больше 1 мин,
'фиксируем прошедший отрезок и запускаем новый
On Error Resume Next
Application.EnableEvents = False
With Лист1.[A1]
.Value = .Value + (LastActionTime - StartTime)
End With
Application.EnableEvents = True
StartTime = nw
Else
LastActionTime = nw
End If
End Sub
Казанский, попробовал. После того, как я жду минуту в офлайн режиме (не пользуюсь excel файлом), захожу в него и вижу "############" в ячейке. Само значение в ячейке почему-то становится отрицательным, именно по этому оно его и не переводит во время. Я не силен в макросах, признаться. Если где-то затупил, не обессудьте Еще ошибка в неправильном формате файла, я пересохранил с поддержкой макросов. У меня 2013 год, если что.
Товарищи, напишите, это вообще реально реализовать или что я неправильно понял из поста #4? Прошу прощения, что поднимаю тему, но, по моему, ответ где-то близко Вдруг, кто подскажет
Юрий М, я в VBA, признаться, мало что понимаю. Если не составит труда, подскажите, что туда надо бы вписать для корректной работы? Премного благодарен.
Потестил я этот макрос как мог, пришел к выводу, что в нем, скорее всего, неправильно записана работа клика. В общем, после "простоя", захожу в файл и клацаю по любой ячейке, время в ячейке начинает отниматься и от множества кликов уходит в минус. Насколько я понял, это происходит потому что ласттайм по каждому клику (экшн) отнимает старттайм. Подскажите пожалуйста, что вообще с этим сделать или где я оказался неправ, потому как я не силен в VBA.
Насколько я понимаю, она работает правильно. Потому что, в противном случае, если убрать "StartTime", будет суммироваться сегодняшняя дата. Мне нужно, чтобы в итоге это штука работала очень много, на протяжении недель и поэтому формат ячейки ставлю "время", где после 24:00 не обнуляется счетчик. Убрав "StartTime", выписывает текущие значение + теперешнее время = 1013869:51:49. то есть, вычитать оно должно, по идее, только проблема в том, что после "простоя" в 1 минуту, далее она вычитает после каждого клика в excel файле. я только не понимаю, почему Now меньше, чем StartTime. странно как-то.