Если Рой удерживает нажатой клавишу Shift при открытии книги, Excel не запускает любые «автоматические» макросы, которые обычно выполняются, включая событие Workbook_Open. Он задается вопросом, есть ли такой же простой способ при закрытии книги заставить Excel обойти событие Workbook_BeforeClose.

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

Что вы можете сделать, так это настроить способ программирования события BeforeClose так, чтобы при выполнении определенного условия код в обработчике событий был пропущен. Простой подход — просто обойти код, если выбрана конкретная ячейка рабочего листа, следующим образом:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

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

Если вы настроены на проверку того, удерживается ли клавиша Shift, вы можете сделать это с помощью Windows API. Это включает добавление кода в область объявлений модуля. Это может быть обычный модуль; он не обязательно должен быть в окне кода ThisWorkbook. Вам просто нужно убедиться, что он находится в области объявлений, прежде чем будут объявлены какие-либо процедуры.

#If VBA7 Then     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If

Обратите внимание, что используется условная директива #If VBA7, поэтому при использовании Excel 2010 или более поздней версии будет использоваться правильный синтаксис объявления, чтобы не было ошибок ни в 32-битной, ни в 64-битной версиях программы.

Теперь в обработчике события BeforeClose вы можете сделать следующее:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Const VSHIFT = &H10     Const SHIFTED = &H80

If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub     '     ' Your normal code here...

' End Sub

Если при срабатывании события BeforeClose удерживать клавишу Shift, код BeforeClose пропускается. Вы должны отметить, что может быть немного сложно понять, когда удерживать клавишу Shift или удерживать ли вы ее достаточно долго. По этой причине я предпочитаю подход «проверить ActiveCell», поскольку вы можете просто выбрать ячейку, закрыть книгу и забыть об этом.

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

Этот совет (2628) применим к Microsoft Excel 2007, 2010, 2013 и 2016.