Страницы: 1
RSS
Автоматический запуск таймера с учетом активной работы в книге, учитывать именно активную работу пользователя в книге
 
Есть таймер, который автоматически включается при открытии книги, работает в фоновом режиме и при закрытии книги записывает время проведенное пользователем в этом файле, каждый раз суммируя время предыдущего сеанса с текущим.
P.S. отдельная благодарность Sanja за помощь
Скрытый текст
Помогите, пожалуйста, дополнить его одной важной для меня особенностью:
таймер при открытии книги начинает работать в фоновом режиме, однако, когда пользователь не проводит никаких манипуляций с этой книгой (файлом) на протяжении 1 минуты, таймер останавливался, а когда пользователь продолжит работу с книгой любым образом, таймер продолжит работу и при закрытии книги забьет время активной работы данного сеанса + сумма предыдущих сеансов.
Буду очень признателен, если у кого будет время и желание помочь мне с данным вопросом!  
Изменено: kleono - 27.08.2015 01:40:09
 
kleono, здравия. Предложу др. вариант отслеживания времени работы с файлом:
1) на событие откр. файла в переменную или куда ещё записываем Now;
2) на событие закр. файла в другую переменную или куда ещё записываем Now;
3) разница второй и первой записи и будет время работы пользователя с файлом.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Так в прикрепленном файле это уже реализовано, он все суммирует и записывает время открытия файла. А мне надо, чтобы он останавливался на паузу, если человек не совершает никаких действий.
Например, человек открыл файл, таймер пошел, он поработал в нем 30 минут, а дальше пошел заниматься своими делами, а компьютер включен и файл он не закрывал, таймер будет считать все время. А мне надо, чтобы таймер становился на паузу, если у пользователя файл excel неактивен (он не совершает никакой работы в нем, вообще) на протяжении 1 минуты, а как только пользователь переключится на файл или совершит в нем любое действие, таймер дальше продолжил свою работу и в итоге записал в ячейку сумму времени старого сеанса и этого, но только активное время работы по принципу описанному выше.
Реально вообще такое задать с помощью VBA?  
 
kleono, пробуйте
Код
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 год, если что.  
Изменено: kleono - 27.08.2015 19:44:42
 
Товарищи, напишите, это вообще реально реализовать или что я неправильно понял из поста #4?
Прошу прощения, что поднимаю тему, но, по моему, ответ где-то близко :) Вдруг, кто подскажет  
 
Посмотрите, какие значения у переменных StartTime и LastActionTime
 
Юрий М, я в VBA, признаться, мало что понимаю. Если не составит труда, подскажите, что туда надо бы вписать для корректной работы?
Премного благодарен.  
 
Потестил я этот макрос как мог, пришел к выводу, что в нем, скорее всего, неправильно записана работа клика.
В общем, после "простоя", захожу в файл и клацаю по любой ячейке, время в ячейке начинает отниматься и от множества кликов уходит в минус.
Насколько я понял, это происходит потому что ласттайм по каждому клику (экшн) отнимает старттайм.
Подскажите пожалуйста, что вообще с этим сделать или где я оказался неправ, потому как я не силен в VBA.  
 
Вот эта строка
Код
.Value = .Value + (Now - StartTime)
действительно производит вычитание: текущее значение ячейки = текущему значению ячейки + разница (из текущего времени вычитаем StartTime)
 
Насколько я понимаю, она работает правильно. Потому что, в противном случае, если убрать "StartTime", будет суммироваться сегодняшняя дата.
Мне нужно, чтобы в итоге это штука работала очень много, на протяжении недель и поэтому формат ячейки ставлю "время", где после 24:00 не обнуляется счетчик.
Убрав "StartTime", выписывает текущие значение + теперешнее время = 1013869:51:49.
то есть, вычитать оно должно, по идее, только проблема в том, что после "простоя" в 1 минуту, далее она вычитает после каждого клика в excel файле.
я только не понимаю, почему Now меньше, чем StartTime. странно как-то.  
Изменено: kleono - 28.08.2015 13:59:49
Страницы: 1
Наверх