Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
RAVproFFI
33 / 33 / 1
Регистрация: 15.10.2013
Сообщений: 130
1

Бездействие пользователя в книге excel

21.10.2013, 11:17. Просмотров 6553. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Есть книга excel, своего рода БД. На нее заходит, допустим, оператор и работает в ней через удаленный рабочий стол RDP. Так вот, очень часто этот ... оператор, сколько бы раз ему не говорили, в конце рабочего дня просто закрывает RDP не закрывая книгу Excel как положено.
Можно ли отследить бездействие пользователя, н-р, в течении 15мин. то закрыть книгу Excel и выйти из системы. Кстати, учетная запись заточена только для работы с 1 книгой Excel и все, нет больше ничего, ни влево ни вправо. Я сделал если оператор закрывает книгу, то она сохраняется и происходит выход из системы Shell "shutdown -l".
Или можно как нить через таймер например, каждые 15мин. определять состояние пользователя, т.е. если он просто закрывает RDP, то в диспетчере задач он отображается как Отключен. Как определить этот статус пользователя?
Или все это бесполезно, команды вообще не будут выполняться если пользователь отключен, но не вышел из системы?
Заранее спасибо!
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2013, 11:17
Ответы с готовыми решениями:

Примеры к книге Дж.Укенбах Библия пользователя Excel 2007
Доброго всем времени суток! Может у кого нибудь есть диск с примерами к книге "Excel 2007. Библия...

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

Из Excel в DBGrid. Подключиться к рабочей книге MS Excel, как к базе данных.
Доброго времени суток! У меня возникли проблемы при выводе таблицы с Excel на DBGrid, а именно:...

Поиск пользователя рассылки в адресной книге
Была поставлена задача, определить что пользователь который есть в рассылке есть и в адресной...

13
Hugo121
6557 / 2592 / 472
Регистрация: 19.10.2012
Сообщений: 7,790
21.10.2013, 11:59 2
Практически такого не делал, но если например реализовать так:
каждое изменение выделения на любом листе сбрасывает таймер и назначает новый, который через 15 минут закрывает книгу без сохранения изменений.
0
RAVproFFI
33 / 33 / 1
Регистрация: 15.10.2013
Сообщений: 130
21.10.2013, 12:38  [ТС] 3
я об этом думал, но в основном вся работа в книге реализована через формы, может он одну форму 15 мин будет заполнять. Если только за 5мин до автозакрытия выводить сообщение о скором закрытии с возможностью отмены. Но чет не красиво как то. И вешать обнуление таймера на закрытие каждой формы и каждого листа тож не выход.
Была мысль сделать через тот же таймер, например каждые 15 мин определять координаты мыши X и Y, и если они не изменились ВЫКЛ. Но не подскажите как правильно такой таймер реализовать (никогда не работал с таймером) и как определить координаты мыши?
Хотелось бы конечно реализовать через определение статуса текущего пользователя.
1
Hugo121
6557 / 2592 / 472
Регистрация: 19.10.2012
Сообщений: 7,790
21.10.2013, 12:57 4
C мышью больно мудрёно...
Вот тут примерчик в теме есть, в конце: http://www.planetaexcel.ru/forum/ind...ID=8&TID=35963
0
StepInLik
1063 / 101 / 4
Регистрация: 19.12.2012
Сообщений: 446
21.10.2013, 13:06 5
По таймеру, конечно, вариант.
Их бывает 2:
- OnTime. Но если пользователь отключился в то время, как его книга находится в режиме редактирования ячейки, то этот таймер не сработает.
- Виндовый. Более надежный в плане вызовов - вызывается всегда. Но придется набраться терпения т.к. при работе с ним возникает масса неудобств
- во-первых в процессе разработки
- во-вторых на некоторых компьютерах (очень очень очень редко и это скорее всего вас обойдет стороной, хотя ... лучше об этом знать) - при редактировании ячейки, если происходит вызов таймера - эксель вылетает без предупреждения. причину установить не удалось. первичная проверка на диалог пользователя с ячейкой тоже помогает лишь в 90% случаях ... но 10% все же остаются ...

... есть еще один способ. не обязательно отрубать книгу через 15 минут. поставьте в книге монитор по таймеру и проверяйте флаг из какого-нибудь файла в сетевом доступе. - как флаг появился, вы его сбрасываете и закрываете книгу. т.о. вы без надобности ее не закрываете, но как только потребовалось - ставите флаг с любого компа и ваш файл видя флаг, тут же закрывается.
кст, эта модель у меня работает не на закрытие, а на выполнение удаленных команд. к примеру, выдать предупреждение пользователю, что файл необходимо закрыть, выдать предупреждение и закрыть через N минут, принудительно сохранить файл, переинициализировать внутреннюю структуру кешированных данных (если пользователь звонит и жалейтся, что какая-то проблема ...) и т.д. ... - вы так же можете отправлять команды своему файлу (или оставлять их на тот момент, когда он запустится и будет работать по вашему плану команд)
0
RAVproFFI
33 / 33 / 1
Регистрация: 15.10.2013
Сообщений: 130
21.10.2013, 21:00  [ТС] 6
Цитата Сообщение от Hugo121 Посмотреть сообщение
Вот тут примерчик в теме есть, в конце: http://www.planetaexcel.ru/forum/ind...ID=8&TID=35963
прошел по ссылке, пишет тема не найдена
Цитата Сообщение от StepInLik Посмотреть сообщение
Но если пользователь отключился в то время, как его книга находится в режиме редактирования ячейки, то этот таймер не сработает.
пользователь не может редактировать ячейки, вся работа устроена через формы. Он может ток форму оставить открытой и то если "вылетит" не по собственному желанию.
а можно например запустить код в определенное время, т.е. типа планировщика задач. Это тоже былбы для меня выход. Н-р, рабочий день до 18.00, а в 19.00, если конечно книга еще открыта, запустить процедуру, вывести сообщение о закрытии и если нет реакции в течении 5 минут, закрыть ее?
1
Hugo121
6557 / 2592 / 472
Регистрация: 19.10.2012
Сообщений: 7,790
21.10.2013, 22:26 7
Да, ссылку форум покоцал. Но если проявить смекалку - то попасть туда можно - главное видно даже без клика
0
dev.Free
Заблокирован
23.10.2013, 14:57 8
1. Тебе надо отловить расположение курсора на экране, то есть его координаты.
2. Записать координаты в переменную или скрытое поле на листе или форме.
3. Теперь работа с таймером:

Visual Basic
1
Application.OnTime Now + TimeValue("00:20:00"), "ЭтаКнига.StopWork"
Visual Basic
1
2
3
4
5
6
Private Sub StopWork()
    Application.EnableCancelKey = 0
    If MsgBox("Книга будет закрыта. Сохранить?", 4) - 7 Then ThisWorkbook.Save
    If Application.Workbooks.Count = 2 Then Application.Quit
    ThisWorkbook.Close
End Sub
4. Тебе придется настроить таймер и условия, значит если в течении 20 минут, координаты мыши не меняются, значит за компьютером нету пользователя, тогда просто закрываешь книгу с сохранением данных.
0
SlavaRus
1109 / 219 / 33
Регистрация: 15.03.2010
Сообщений: 668
23.10.2013, 16:07 9
Если пользователь работатет через форму, создай событие на движение мыши на форме.
В нем и работай с тамером как написал inv.DS.
Или проблема создать событие на движение мыши на форме?
0
Hugo121
6557 / 2592 / 472
Регистрация: 19.10.2012
Сообщений: 7,790
23.10.2013, 16:19 10
С таймером ещё такая штука - если закрыть файл, но не закрыть приложение - то в намеченный срок файл как и положено откроется, чтоб спросить - а не хотите ли меня закрыть?
Поэтому время нужно задавать через переменную, которую использовать чтоб снять таймер при закрытии файла.
В хелпе почти всё есть:

Visual Basic
1
2
3
4
This example cancels the OnTime setting from the previous example.
 
Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
    Procedure:="my_Procedure", Schedule:=False
Нет переменной, с которой значительно удобнее в случае с Now + TimeValue("00:20:00")
0
RAVproFFI
33 / 33 / 1
Регистрация: 15.10.2013
Сообщений: 130
30.10.2013, 11:46  [ТС] 11
Оставив эту идею на прошлой неделе, сейчас снова вернулся к этому вопросу и все таки нашел решение причем в двух вариантах, может кому пригодится.
В обеих вариантах одинаково в событии открытия книги задаю запуск процедуры UserSleep через 15мин.
Visual Basic
1
2
3
4
5
6
Private Sub Workbook_Open()
'выполнять только для определенной учетки Windows, н-р "User_RDP"
If CreateObject("wscript.network").UserName = "User_RDP" Then
    Application.OnTime Now + TimeValue("00:15:00"), "UserSleep"
End If
End Sub
Также в отдельном модуле прописываю для получения координат мыши следующее (нашел на http://www.msoffice.nm.ru/):
Visual Basic
1
2
3
4
5
6
7
8
Public Declare PtrSafe Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
 
Public Type POINTAPI
    X As Long
    Y As Long
End Type
 
Public Xx, Yy As Long 'это уже свое для сравнения последних координат
ИТАК:
1-й вариант: как я и хотел раз в 15 мин. отслеживает положение курсора мыши и если положение курсора так и не изменилось выдает сообщение что программа закроется автоматически через 5 мин. и если пользователь не отменит автозакрытие программа сохраняется, закрывается и происходит выход из системы:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub UserSleep()
    Dim iPOINT As POINTAPI
    GetCursorPos iPOINT
    If (Xx = iPOINT.X) And (Yy = iPOINT.Y) Then
            Select Case CreateObject("WScript.Shell").Popup( _
                "Время простоя программы 15 мин., поэтому программа будет закрыта автоматически через 5 мин. в " & Format(Now + TimeValue("00:05:00"), "HH:MM:SS") & _
                vbLf & "ОТМЕНИТЬ АВТОЗАВЕРШЕНИЕ?", 300, _
                "Автозавершение программы", vbQuestion + vbYesNo)
                Case vbYes
                    Xx = iPOINT.X: Yy = iPOINT.Y
                    Application.OnTime Now + TimeValue("00:15:00"), "UserSleep"
                Case Else
                    ThisWorkbook.Save
                    Application.Quit
                    Shell "shutdown -l"
            End Select
    Else
        Xx = iPOINT.X: Yy = iPOINT.Y
        Application.OnTime Now + TimeValue("00:15:00"), "UserSleep"
    End If
End Sub

2-й вариант, который я оставил: каждые 5 минут смотрит положение курсора мыши и если оно не изменилось запускает такую штуку как query session для текущей учетки чтоб определить активен пользователь или снова просто закрыл RDP через крестик, и если пользователь отключен без вопросов сохраняет, закрывает программу и выходит из системы:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub UserSleep()
Dim iPOINT As POINTAPI
GetCursorPos iPOINT
If (Xx = iPOINT.X) And (Yy = iPOINT.Y) Then
    UserN = CreateObject("wscript.network").UserName
    Set WshShell = CreateObject("WScript.Shell")
    Set WshExec = WshShell.Exec("query session " & UserN)
    Set OutStream = WshExec.StdOut
    Do While Not OutStream.AtEndOfStream
        S = Trim(OutStream.ReadLine()) 'S присваиваем только последнюю строку
    Loop
    If (Left(S, 9) <> ">rdp-tcp#") Then
        ThisWorkbook.Save
        Application.Quit
        Shell "shutdown -l"
    Else
        Xx = iPOINT.X: Yy = iPOINT.Y
        Application.OnTime Now + TimeValue("00:15:00"), "UserSleep"
    End If
Else
    Xx = iPOINT.X: Yy = iPOINT.Y
    Application.OnTime Now + TimeValue("00:15:00"), "UserSleep"
End If
End Sub

Кстати можно с OnTime работать через переменную как предложил Hugo121, чтобы книга не открылась сама через какое то время, но у меня юсер работает только с одной книгой и она не только закрывается, но происходит выход из системы.
Сделал 2й вариант потому что 1 вариант почему то не сработал в моменте открыть сообщение CreateObject("WScript.Shell").Popup на 300 сек. Не знаю почему, но сообщение так и весит пока не нажать да или нет. Если выставить 5 или 10 сек. оно закрывается автоматом, а больше чтото считать не умеет или ограничение есть какое. Хотя пару раз сработало. Если кто знает почему буду благодарен.
Во 2м варианте оставил отслеживание курсора мыши, потому что неудобно когда каждые 15 мин. выскакивает черное окно на пару сек. во время выполнения WshShell.Exec("query session " & UserN), а так оно выскакивает если юсер либо свернул RDP либо просто его закрыл либо пошел чай пить. Знаю что Run можно запустить с параметрами свернуто, но нужно именно exec. Если кто знает как запускать exec свернуто или скрыто буду благодарен.
Будут вопросы с удовольствием отвечу.

Добавлено через 47 минут
кстати забыл сказать, приложение query.exe помойму отсутствует в Windows XP, но на 7ке есть в системной папке, так что можно еще проверки всякие дописать, но я не заморачивался, у мя все на одной машине работает.

Добавлено через 15 минут
еще вспомнил, бездействие пользователя можно отследить через query user "user" (тоже самое даст и quser). Там прям отображается время бездействия перед временем входа, его там вытащить можно через массив например. Но я выбрал query session т.к. время бездействия при отключенной сессии RDP такое же как при активности, хотя тоже можно было и через quser посмотреть статус Активно или Диск (отключен), ток вот кодировка там 866.
2
Hugo121
6557 / 2592 / 472
Регистрация: 19.10.2012
Сообщений: 7,790
30.10.2013, 13:13 12
Да, с Popup'ами такая беда есть в Экселе - работают как хотят... Свою форму выводите.
1
StepInLik
1063 / 101 / 4
Регистрация: 19.12.2012
Сообщений: 446
30.10.2013, 13:30 13
Не стал писать ране т.к. недооценивал ваш уровень. Попробуйте тему хуков. Отлавливайте активность мыши и клавиатуры.
Тема трудна, поэтому подключайте гугл в англоязычном интернете.

Добавлено через 2 минуты
и ваабще, зачем вам таймер? при запуске программы входите в вечный цикл и отдаете пользователю DoEvent. и в цикле делаете, что хотите!
2
esboy21
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 95
17.09.2015, 22:53 14
RAVproFFI, Проконсультируйте пожалуйста, хотел воспользоваться вашим вариантом закрытия файла при бездействии .
Ни один из двух вариантов не сработал.
В чем может быть причина ?
0
17.09.2015, 22:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2015, 22:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Excel обращение к книге по codename
Даров, ребя. Можно ли напрямки обраться по коднейму к определённой книге из другой? А то...

Подсчёт листов в книге Excel
Можно ли составить программу в VBA чтобы она подсчитывала количество листов в книге Excel или же...

поиск по книге excel в delphi
Други, подскажите как реализовать поиск ячейки по всей книге excel в delphi? Сломал ноги. Не могу...

Признак изменений в книге Excel
Подскажите, где находится признак того, что в книге Excel произошли изменения, необходимо его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.