Дэйв задается вопросом, может ли он принудительно закрыть книгу по прошествии определенного времени, если она в настоящее время не используется. В его офисе люди открывают рабочие книги, которые находятся на сервере, а потом забывают, что они открыты. Когда это происходит, никто другой не может их редактировать, поэтому он хотел бы принудительно закрыть книги, если оставить их без присмотра на 60 минут.

Это можно сделать с помощью макросов, но, возможно, вам не захочется делать это с точки зрения бизнеса или пользователя. Например, предположим, что у пользователя есть три открытых книги в его системе, чтобы можно было сравнивать их. «Связать» можно

с двумя книгами в течение некоторого времени, причем третья — та, которая запускает завершение работы. VBA в Excel не особо различается — когда книга закрывается, обычно фокус находится в фокусе в текущий момент.

Далее, что делать с несохраненными изменениями при закрытии? Если вы сохраните их, вы столкнетесь с проблемой, что, возможно, пользователь не собирался их сохранять. Если вы не сохраните их, возникает обратная проблема — возможно, необходимо было сохранить много данных. Вы не можете заставить процедуру закрытия спрашивать, следует ли сохранять информацию; это будет связывать книгу так же надежно, как и держать ее открытой (и неиспользованной).

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

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

Для начала добавьте следующий код в стандартный макромодуль. Обратите внимание, что необходимо добавить три подпрограммы:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

Эти три процедуры довольно просты. Первые два соответственно включают таймер и выключают его. Обратите внимание, что в этих подпрограммах используется переменная DownTime, которая объявлена ​​вне любой из подпрограмм. Таким образом, его содержимое можно использовать в нескольких подпрограммах.

Третья процедура, ShutDown, фактически закрывает книгу. Он вызывается только в том случае, если срок действия метода OnTime истекает в конце часа. Книга закрывается без сохранения изменений, которые могли быть внесены.

Следующие процедуры (их четыре) нужно добавить в объект ThisWorkbook. Откройте редактор VBA и дважды щелкните объект ThisWorkbook в проводнике проекта. В открывшемся окне кода Excel поместите эти подпрограммы:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

Первые две процедуры запускаются при открытии книги и при ее закрытии; они запускают таймер и выключают его. Две другие подпрограммы выполняются автоматически всякий раз, когда рабочий лист пересчитывается или когда кто-то делает выбор в книге. Оба являются хорошими индикаторами того, что кто-то использует книгу (она не открыта неактивно). Они останавливают таймер, а затем перезапускают его, так что часовой обратный отсчет начинается заново.

У использования такого набора макросов есть обратная сторона: вы фактически исключаете возможность отмены действия в Excel. При выполнении макроса стек отмены автоматически стирается Excel. Поскольку макросы выполняются с каждым изменением, внесенным в книгу, изменения человека нельзя отменить. (Этот недостаток невозможно обойти.)

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2281) применим к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и новее) здесь:

link: / excelribbon-Forcing_a_Workbook_to_Close_after_Inactivity [Принудительное закрытие книги после бездействия].