Обход события BeforeClose (Microsoft Excel)
Если Рой удерживает нажатой клавишу 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.