Добрый вечер. Недавно начал изучение макросов, так что не силён ещё, есть задача- автоматически закрывать документ, если им не пользуются N времени. (некоторые засранцы открывают посмотреть файл в сети и не закрывают/выключая комп сваливают с работы, или на обед, причиняя уйму проблем)
Макрос запускается при открытии файла и отслеживает следующие параметры : - выбор ячеек - изменение ячеек - смена листа не работает только пролистывание страницы (нужно хотя бы вверх/вниз), наверняка ошибка синтаксиса....
Если будут ещё предложения по расширению списка параметров- буду безмерно благодарен (люди ж в нём работают, печально будет, если он закроется в процессе )
Таймер пока стоит на 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
На прокрутку макрос не реагирует, и это сложно без библиотек. В таком случае я делал так, что при открытии файла он копируется в папку темп и человек получается работает уже с отдельной книгой, каждый человек. А вот на сохранение делал макрос который анализирует изменения, который сделал этот конкретный человек и переносит только их в оригинал книги. После сохранения книги обновлённые данные из оригинала переносятся к нему в файл, если он его не закрыл, те обновления, которые сделали другие пользователи при сохранении. Таким образом файл может быть открыт пока свет не выключат.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Спасибо, но мне пожалуй нужно более абстрактное решение, которое можно массово и быстро в различных книгах использовать. К несчастью в месяц создаётся с десяток таких сетевых файлов, которые в основном через пару месяцев теряют актуальность, или коренным образом перестраиваются. (используются они для сбора статистики под конкретные проекты)
Раз на прокрутку сделать нереально, может тогда со списком действий, отслеживаемых макросом подскажете. Я подумал что наверное нужно добавить: - изменение размеров окна - сохранение - печать Чтобы ещё в таком роде подошло? dtStep я планирую 10 минут в дальнейшем выставить
И ещё 1 вопрос, на сколько я выяснил изменений в VBA с 2003 серьёзных не было, так что в нём этот макрос должен работать? А то у нас периодически третий офис встречается.
В вашем случае тогда можно перелопатить вот этот код, который показывает координаты курсора. Если координаты остаются неизменными в течении нескольких минут, то книгу закрывать.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Правда на сколько я понял курсор отслеживается независимо от того, активна ли эта книга, либо пользователь перешёл в другую книгу, либо программу. Возникает следующая проблема- файл бездействует, а человек работает в другом файле, либо по интернету шарится (утрировано) и макрос не закрывает.
Можно ли это отслеживание изменения координат 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
Compile error in hidden modul: ЭтаКнига. This error commonly occurs when code is incompatible with the version, platform, or architecture of this application.
В модуле книги удалите или закомментируйте макрос Workbook_Open. В стандартном модуле поместите такой код.
Скрытый текст
Код
''''''''Testuser (c) 15.02.2024 Модуль автозакрытия книги
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, 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 Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#Else
#If Not Win64 Then
Private Enum LongPtr
[_]
End Enum
' #Else
' Private Type LongPtr
' lp As LongLong
' End Type
#End If
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If
Private Const KEYEVENTF_KEYUP = &H2
Private Sub Auto_Open()
WinApiOnTime Now + #12:01:00 AM# '#12:00:07 AM#
End Sub
Public Sub TimerProc(ByVal hwnd As LongPtr, ByVal lMsg As Long, ByVal nIDEvent As Long, ByVal ticks As Long)
KillTimer 0, nIDEvent
keybd_event vbKeyMenu, 0, 0, 0
keybd_event vbKeyControl, 0, 0, 0
ThisWorkbook.Save
' Application.Quit 'грубое закрытие
Application.OnTime Now, "WBClose" 'корректное закрытие книги
End Sub
Sub WBClose()
keybd_event vbKeyControl, 0, KEYEVENTF_KEYUP, 0
keybd_event vbKeyMenu, 0, KEYEVENTF_KEYUP, 0
' MsgBox "Корректное закрытие!"
ThisWorkbook.Close 0
End Sub
Public Sub WinApiOnTime(dtTime As Date)
SetTimer 0, 0, DateDiff("s", Now, dtTime) * 1000, AddressOf TimerProc
End Sub