Страницы: 1
RSS
Автозакрытие книги по истечении времени
 
Добрый вечер.
Недавно начал изучение макросов, так что не силён ещё, есть задача- автоматически закрывать документ, если им не пользуются N времени.
(некоторые засранцы открывают посмотреть файл в сети и не закрывают/выключая комп сваливают с работы, или на обед, причиняя уйму проблем)

Макрос запускается при открытии файла и отслеживает следующие параметры :
- выбор ячеек
- изменение ячеек
- смена листа
не работает только пролистывание страницы (нужно хотя бы вверх/вниз), наверняка ошибка синтаксиса....

Если будут ещё предложения по расширению списка параметров- буду безмерно благодарен
(люди ж в нём работают, печально будет, если он закроется в процессе :D )

Таймер пока стоит на 20 секунд, будьте внимательны!
Код
Option Explicit
Public N As Integer   'Состояние проверки 1=в работе/0=простой


Sub Закрытие()
    Dim dtTime As Date 'абсолютное время проверки
    Dim dtStep As Date 'относительное время до следующей проверки

    dtStep = #12:00:20 AM#
    dtTime = Time + dtStep

    If N = 1 Then
        Application.OnTime dtTime, "ЭтаКнига.Закрытие"
        N = 0
    Else
        ThisWorkbook.Save
        ThisWorkbook.Close
    End If

End Sub

Private Sub Workbook_Open()
    'MsgBox "Workbook_Open"
    N = 1
    Call Закрытие
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 '   MsgBox "Workbook_SheetSelectionChange " & Chr(13) & Sh.Name & Chr(13) & Target.Address
    N = 1
End Sub

Private Sub Scroll_vertical_Change()
       N = 1
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    N = 1
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
    N = 1
End Sub
Изменено: Trafka - 29.04.2016 12:55:19
 
На прокрутку макрос не реагирует, и это сложно без библиотек. В таком случае я делал так, что при открытии файла он копируется в папку темп и человек получается работает уже с отдельной книгой, каждый человек. А вот на сохранение делал макрос который анализирует изменения, который сделал этот конкретный человек и переносит только их в оригинал книги. После сохранения книги обновлённые данные из оригинала переносятся к нему в файл, если он его не закрыл, те обновления, которые сделали другие пользователи при сохранении. Таким образом файл может быть открыт пока свет не выключат.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Спасибо, но мне пожалуй нужно более абстрактное решение, которое можно массово и быстро в различных книгах использовать.
К несчастью в месяц создаётся с десяток таких сетевых файлов, которые в основном через пару месяцев теряют актуальность, или коренным образом перестраиваются. (используются они для сбора статистики под конкретные проекты)

Раз на прокрутку сделать нереально, может тогда со списком действий, отслеживаемых макросом подскажете.
Я подумал что наверное нужно добавить:
- изменение размеров окна
- сохранение  
- печать
Чтобы ещё в таком роде подошло?
dtStep я планирую 10 минут в дальнейшем выставить

И ещё 1 вопрос, на сколько я выяснил изменений в VBA с 2003 серьёзных не было, так что в нём этот макрос должен работать?
А то у нас периодически третий офис встречается.
Изменено: Trafka - 29.04.2016 12:54:17
 
В вашем случае тогда можно перелопатить вот этот код, который показывает координаты курсора. Если координаты остаются неизменными в течении нескольких минут, то книгу закрывать.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Замечательный вариант, отдельное спасибо за это.

Правда на сколько я понял курсор отслеживается независимо от того, активна ли эта книга, либо пользователь перешёл в другую книгу, либо программу.
Возникает следующая проблема- файл бездействует, а человек работает в другом файле, либо по интернету шарится (утрировано) и макрос не закрывает.

Можно ли это отслеживание изменения координат X Y (в Вашем примере) производить только при активности данной книги?
(соответственно при переходе на другой файл/программу- останавливать, а при возвращении запускать заново)
 
Подскажите, есть более простой макрос на закрытие книги после определенного времени, но есть нюанс в том, что если активная ячейка в этой книге (курсор мигает) то макрос не закрывает книгу. Как устранить эту проблему?
 
Сергей2501, допустим надо закрыть книгу сегодня в 20:00
Код
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long

Private Sub Workbook_Open()    
    WinApiOnTime Now + #12:01:00 AM#
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal lMsg As Long, ByVal nIDEvent As Long, ByVal ticks As Long)
    KillTimer 0, nIDEvent    
    ThisWorkbook.Save
    ThisWorkbook.Close    
End Sub

Public Sub WinApiOnTime(dtTime As Date)         
    SetTimer 0, 0, DateDiff("s", Now, dtTime) * 1000, AddressOf TimerProc
End Sub
Изменено: testuser - 14.02.2024 17:47:40
 
Private Sub Workbook_Open()
   Application.OnTime Now + #12:01:00 AM#, "TimeOut"
End Sub

Private Sub TimeOut()
       ThisWorkbook.Save
       ThisWorkbook.Close
End Sub

У меня такой макрос работает, но вот когда в ячейке не закончили ввод данных (мигает курсор в ячейке) он не срабатывает. Как починить?
 
Сергей2501, см. выше
 
Для полного чайника подскажите куда что вписывать? что вписать в модуль, что в "этукнигу", а что в лист?
 
Сергей2501, Всё в модуль ЭтаКнига, ничего не надо разделять по другим модулям! Иначе бы testuser, указал бы вам.
 
Выдает ошибку при запуске файла.

Compile error in hidden modul: ЭтаКнига.
This error commonly occurs when code is incompatible with the version, platform, or architecture of this application.
Изменено: Сергей2501 - 15.02.2024 10:37:32
 
Сергей2501, у вас какая версия МС Офиса?
 
Версия: 14.0.7268.5000 (32-разрядная)
 
А непростое это дело однако, корректное закрытие при активности пользователя, но что только не сделаешь из-за тяги кперфекционизму!
Цитата
Сергей2501 написал:
Версия: 14.0.7268.5000 (32-разрядная)
В модуле книги удалите или закомментируйте макрос Workbook_Open. В стандартном модуле поместите такой код.
Скрытый текст
Изменено: testuser - 15.02.2024 16:57:05
Страницы: 1
Наверх