Дэйв задается вопросом, может ли он принудительно закрыть книгу по прошествии определенного времени, если она в данный момент не используется. В его офисе люди открывают рабочие книги, которые находятся на сервере, а потом забывают, что они открыты. Когда это происходит, никто другой не может их редактировать, поэтому он хотел бы принудительно закрыть книги, если оставить их без присмотра на 60 минут.
Это можно сделать с помощью макросов, но на самом деле вы можете этого не захотеть. сделать это с точки зрения бизнеса или ориентации на пользователя. Например, предположим, что у пользователя есть три открытых книги в его системе, чтобы можно было сравнивать их. Можно на некоторое время «привязаться» к двум книгам, причем третья будет той, которая вызывает завершение работы. VBA в Excel не особо различается – когда книга закрывается, обычно фокус находится в фокусе в текущий момент.
Кроме того, что вы делаете с несохраненными изменениями при закрытии? Если вы сохраните их, вы столкнетесь с проблемой, что, возможно, пользователь не намеревался их сохранять. Если вы их не сохраните, возникает обратная проблема – возможно, необходимо было сохранить много данных. Вы не можете сделать так, чтобы процедура закрытия спрашивала, следует ли сохранять информацию; это позволит удерживать книгу в связке так же надежно, как если бы она оставалась открытой (и неиспользуемой).
Возможное решение – просто предоставить общий доступ к книге. Если вы включите общий доступ (как описано в других ExcelTips ), то несколько человек могут открыть одну и ту же книгу одновременно. Если кто-то из этих людей оставит его открытым, это никому не причинит неудобств, потому что они все еще могут открыть его и, при желании, внести изменения в книгу.
Если вы решите пойти по маршруту на основе макросов, тогда решение довольно простое. Вам нужна какая-то структура таймера (легко реализуемая с помощью метода OnTime) и какой-то способ проверить, делает ли кто-то что-то в книге.
Для начала добавьте следующий код в стандартный макромодуль. Обратите внимание, что необходимо добавить три подпрограммы:
Dim DownTime As DateSub SetTimer () DownTime = Now + TimeValue («01:00:00») Application.OnTime EarliestTime: = DownTime, _ Procedure : = «ShutDown», Schedule: = TrueEnd Sub Sub StopTimer () При ошибке Возобновить следующее приложение.OnTime EarliestTime: = DownTime, _ Procedure: = «ShutDown», Schedule: = False End Sub Sub ShutDown () Application.DisplayAlerts = False With ThisWorkbook .Saved = True .Close End WithEnd Sub
Эти три процедуры довольно просты. Первые два соответственно включают таймер и выключают его. Обратите внимание, что эти подпрограммы используют переменную DownTime, которая объявлена вне любой из подпрограмм. Таким образом, его содержимое можно использовать в нескольких подпрограммах.
Третья подпрограмма, ShutDown, фактически закрывает книгу. Он вызывается только в том случае, если срок действия метода OnTime истекает в конце часа.. Он закрывает книгу без сохранения каких-либо изменений, которые могли быть внесены.
Следующие процедуры (их четыре) необходимо добавить к объекту ThisWorkbook. Откройте редактор VBA и дважды щелкните объект ThisWorkbook в проводнике проекта. В открывшемся окне кода Excel разместите следующие подпрограммы:
Private Sub Workbook_Open () Call SetTimerEnd Sub Private Sub Workbook_BeforeClose (Cancel As Boolean) Call StopTimerEnd Sub Приватная подпрограмма Workbook_SheetCalculate (ByVal Sh как объект) Вызов StopTimer Вызов SetTimerEnd Sub Частная подпрограмма Workbook_SheetSelectionChange (ByVal Sh как объект, _ ByVal Target как Excel.Range) Вызов StopTimer Вызов SetTimerEnd Sub
Первые две подпрограммы запускаются при открытии книги и при ее закрытии; они запускают таймер и выключают его. Две другие процедуры выполняются автоматически всякий раз, когда рабочий лист пересчитывается или когда кто-то делает выбор в книге. Оба являются хорошими индикаторами того, что кто-то использует книгу (она не открыта неактивно). Они останавливают таймер, а затем перезапускают его, так что часовой обратный отсчет начинается заново.
Использование набора макросов, подобных этим, имеет обратную сторону: вы фактически исключаете возможность отмены действия в Excel. При выполнении макроса стек отмены автоматически стирается Excel. Поскольку макросы выполняются с каждым изменением, внесенным в книгу, изменения человека нельзя отменить. (Этот недостаток невозможно обойти.)
Источник: