Страницы: 1
RSS
Макрос закрытия книги при бездействии пользователя
 
Есть у меня вот такой код:
Код
Private Type POINTAPI
X As Long
Y As Long
End Type

Private Declare Function GetCursorPos _
    Lib "user32.ddl" (IpPoint As POINTAPI) As Long
Sub Auto_Open()
GetCursorPosition
End Sub

Private Sub GetCursorPosition()
Dim oPOINT As POINTAPI, pauseTime, Start, Finish, TotalTime
Application.DisplayAlerts = True 'Разрешаем предупреждения на время работы

GetCursorPos IPoint 'запрашиваем позицию курсора
Xx = IPoint.X
Yy = IPoint.Y

pauseTime = 10 ' время в секундах

Start = Timer 'Старт
Do While Timer < Start + pauseTime 'Запускаем цикл таймера
DoEvents 'Выход на другие процессы
Loop
Finish = Timer 'Время вышло
TotalTime = Finish - Start 'Подсчет времени простоя
GetCursorPos IPoint 'Запрашиваем позицию курсора
Xx2 = IPoint.X
Yy2 = IPoint.Y

If Xx = Xx2 And Yy = Yy2 Then 'Сравниваем 1 и 2 положение курсора
'Начинаем действия при простое
If ActiveWorkbook.ReadOnly Then 'проверяем файл на "Только чтение"
Excel.ActiveSheet.Cells(1, 1).Select 'переходим на ячейку 1,1 для устранения не оконченного ввода
Application.DisplayAlerts = False 'подавляем предупреждения
Aplication.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True 'Разрешаем предупреждения на время работы
Else
Application.DisplayAlerts = False 'подавляем предупреждения
Excel.ActiveWorkbook.Save 'сохраняем активную книгу
Aplication.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True 'Разрешаем предупреждения на время работы
End If
End
Else
'тут пользователь двигал курсор
End If
cicle 'переходим к процедуре цикла
End Sub
Private Sub cicle()
GetCursorPosition 'Зацикливаем процедуру пока не будет бездействия юзера
End Sub
Взял я его отсюда.
Попробовал применить не получается...может что-то не то сделал...
создал модуль в него вставил. не работает. может кто подскажет как его запустить, чтобы он работал?

Подскажите как его применить? что куда правильно вставить чтобы он работал?
Изменено: ivan31888 - 19.01.2017 12:01:42

Бессмысленно осмысливать смысл неосмысленными мыслями.
 
Есть ли возможность мне помочь?
Изменено: ivan31888 - 20.01.2017 11:54:47

Бессмысленно осмысливать смысл неосмысленными мыслями.
 
Вы наделали кучу ошибок при наборе кода
Согласие есть продукт при полном непротивлении сторон
 
Sanja, спасибо!  

Бессмысленно осмысливать смысл неосмысленными мыслями.
 
Добрый день!
Подскажи пожалуйста, как данный код применить для ексель 2013?
 
Не работает именно в 2013?
 
Юрий М, да.
 
Прикладываю файл. Может кто поможет разобраться. У меня не получилось к сожалению (
 
а 2013 какой) 32 или 64?
Там есть строчка
Код
Private Declare Function GetCursorPos Lib "user32.dll" (IpPOINT As POINTAPI) As Long
и в 64 она, насколько помню, не работает.
 
Впрочем у  меня 2016/32, и тоже не работает...
Наверно при открытии книги надо что-то запустить...
Изменено: Михаил С. - 29.04.2017 14:44:08
 
2010 (32) - работает.
 
2013 (64) не работает ....
Ничего нельзя сделать?
 
2013 (32) работает.
Если поменять строку
Код
Private Declare Function GetCursorPos Lib "user32.dll" (IpPOINT As POINTAPI) As Long
на
Код
Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" (IpPOINT As POINTAPI) As Long
будет работать?
 
Jungl,  спасибо....заменила...работает
 
этот макрос работает если в принципе не двигать мышку. а если эксель файл сейчас открыт, но не активен, а я работаю в другой программе он почему-то не закрывает файл. можно это исправить ?
спасибо
 
ИМХО все это - из пушки по воробьям. Можно по ontime проверять файл на saved и сохранять каждый раз. В очередной раз проверки, если saved=true закрывать файло. Для безопасности можно при открытии создавать бэкап-копию.
Я сам - дурнее всякого примера! ...
 
доброго времени. у меня вин 10 64 бит.офис 2016 х.з. скока вит, оба файла блокируют меню екселя, ничего не работает кроме выделения ячеек.
Инженер не тот, кто все знает, а тот кто знает где найти ответ.
 
А в этом коде обязательно отслеживать ОБЕ координаты курсора?
Может достаточно следить только за одной из них? Ибо практически невозможно сдвинуть мышь, чтобы X или Y оставались константой.
Изменено: jack_21 - 12.03.2019 04:56:54
 
jack_21,  А в чем смысл такой оптимизации? Да и сдвинуть только по одной координате возможно, например при помощи трэк-поинт или просто по кромке экрана. В целом если с разницей в 10 сек, курсор будет оказываться в одном конкретном из углов экрана, то это простой, хотя между может что-то происходить.
По вопросам из тем форума, личку не читаю.
 
А если в Xx = записывать ActiveCell.Address, то отслеживаться будет адрес текущей ячейки в excel. И тогда действия юзера в другом приложении не влияет на таймер.

Скрытый текст

и не нужно к user32.dll обращаться.
 
Классная идея!
А как использовать данный код? Попробовал вставить его в модуль, а в модуль книги вставил его вызов при открытии. Но выдает ошибку функция не определена.
 
Это он выдает ошибку на строке:
Код
cicle ' Переходим к процедуре цыкла

Т.е. этот цикл необходимо взять из изначального кода ivan31888 ?

 
Разобрался
Страницы: 1
Наверх