Содержание
- Использование событий с объектами Excel
- Пример
- См. также
- Поддержка и обратная связь
- Создание обработчиков событий на уровне приложения в Excel
- Аннотация
- Дополнительные сведения
- Создание и инициация обработчика событий
- Отключение обработчика событий
- VBA-Урок 11.2. События рабочего листа (Worksheet Events)
- Worksheet_SelectionChange (Открытие книги)
- Worksheet_Activate (Событие активации листа)
- Worksheet_Deactivate (Событие деактивации листа)
- Worksheet_BeforeDoubleClick (Событие двойного щелчка по ячейке)
- Worksheet_BeforeRightClick (Событие перед правым кликом)
- Worksheet_Calculate (Событие перерасчета листа)
- Worksheet_Change (Событие изменения содержимого ячейки)
- Worksheet_FollowHyperlink (Событие нажатия на ссылку)
- Temporarily deactivate all events (Временное отключение всех событий)
- VBA События
- Синтаксис
- замечания
- Источники и обработчики
- Что такое события?
- Обработчики
- источники
- Передача данных обратно в источник события
- Использование параметров, переданных по ссылке
- Использование изменяемых объектов
- Создание макроса обработчика событий
Использование событий с объектами Excel
Вы можете написать процедуры событий в Microsoft Excel на уровне листа, диаграммы, таблицы запросов, книги или приложения. Например, событие Activate происходит на уровне листа, а событие SheetActivate доступно как на уровне книги, так и на уровне приложения. Событие SheetActivate для книги возникает при активации любого листа в книге. На уровне приложения событие SheetActivate возникает при активации любого листа в любой открытой книге.
Процедуры листа, диаграммы и событий доступны для любого открытого листа или книги. Чтобы написать процедуры событий для внедренной диаграммы, объекта QueryTable или объекта Application , необходимо создать новый объект с помощью ключевого слова WithEvents в модуле класса.
Используйте свойство EnableEvents для включения или отключения событий. Например, использование метода Save для сохранения книги приводит к возникновению события BeforeSave. Это можно предотвратить, задав для свойства EnableEvents значение False перед вызовом метода Save .
Пример
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Создание обработчиков событий на уровне приложения в Excel
Аннотация
Если требуется, чтобы конкретный обработчик событий запускал каждый раз, когда запускается определенное событие, можно написать обработчик событий для объекта Application. Обработчики событий для объекта Приложения являются глобальными. Это означает, что при открытии Microsoft Excel обработчик событий будет выполняться при возникновении соответствующего события, независимо от того, какая книга активна при возникновении события.
В этой статье описывается создание обработчика событий на уровне приложения и приводится пример.
Дополнительные сведения
Чтобы создать обработчик событий на уровне приложения, необходимо выполнить следующие основные действия.
- Объявите переменную для объекта Application с помощью ключевого слова WithEvents. Ключевое слово WithEvents можно использовать для создания объектной переменной, которая реагирует на события, активированные объектом ActiveX (например, объект application). ПРИМЕЧАНИЕ. Параметр WithEvents действителен только в модуле класса.
- Создайте процедуру для конкретного события приложения. Например, можно создать процедуру для события WindowResize, WorkbookOpen или SheetActivate объекта, объявленного с помощью WithEvents.
- Создайте и запустите процедуру, которая запускает обработчик событий.
В следующем примере эти действия используются для настройки глобального обработчика событий, который отображает окно сообщения при каждом изменении размера любого окна книги (событие, запускающее обработчик событий).
Создание и инициация обработчика событий
Откройте новую книгу.
В меню «Сервис » наведите указатель мыши на макрос и выберите редактор Visual Basic.
В Microsoft Office Excel 2007 щелкните Visual Basic в группе кода на вкладке «Разработчик «.
Щелкните «Модуль класса» в меню «Вставка». При этом в проект будет вставлен модуль с именем book — Class1 (Code).
Введите следующую строку кода в модуле Class1 (Code):
Ключевое слово WithEvents делает переменную appevent доступной в раскрывающемся списке «Объект» в окне модуля Class1 (Code).
В окне модуля Class1 (Code) щелкните раскрывающийся список «Объект» и выберите appevent в списке.
В окне модуля Class1 (Code) щелкните раскрывающийся список «Процедура» и выберите пункт WindowResize в списке. В результате на лист модуля Class1 (Code) будет добавлено следующее:
Добавьте код на лист модуля Class1 (Code), чтобы он отображался следующим образом:
Далее необходимо создать экземпляр класса, а затем задать объект appevent экземпляра класса 1 в Application. Это происходит потому, что при объявлении переменной WithEvents во время разработки с ней не связан объект. Переменная WithEvents так же, как любая другая объектная переменная. Необходимо создать объект и назначить ссылку на объект переменной WithEvents.
В меню «Вставка» щелкните «Модуль», чтобы вставить в проект лист модуля общего типа.
В этом листе модуля введите следующий код:
Запустите тестовый макрос.
Вы только что настроите обработчик событий для запуска при каждом окне изменения размера книги в Microsoft Excel.
В меню «Файл» нажмите кнопку «Закрыть» и «Вернуться в Microsoft Excel».
Изменение размера окна книги. Отобразится окно с сообщением «Вы измените размер окна».
Отключение обработчика событий
Если закрыть книгу, содержащую указанный выше проект, обработчик событий на уровне приложения будет отключен. Чтобы программно отключить обработчик событий, сделайте следующее:
Запустите редактор Visual Basic.
В коде макроса, введенном на шаге 9, измените макрос на следующий:
Запустите тестовый макрос еще раз.
В меню «Файл» нажмите кнопку «Закрыть» и «Вернуться в Microsoft Excel».
Источник
VBA-Урок 11.2. События рабочего листа (Worksheet Events)
На предыдущем уроке мы рассматривали события, относящиеся к целой книги. Сейчас мы сфокусируемся на событиях связанных с отдельным листом.
Worksheet_SelectionChange (Открытие книги)
Чтобы выполнить инструкции, основанные на событиях для отдельного листа, выберите лист в редакторе, а затем Worksheet :
Событие SelectionChange будет добавлено по умолчанию. Это событие выполняется когда бы не изменялось содержание диапазона:
Например, следующий код добавляет цвета заливки одного или более выбранных ячеек и автоматически удаляет цвет заливки от предыдущего выбранного диапазона, когда данный диапазон меняется:
Worksheet_Activate (Событие активации листа)
Это событие возникает при активации рабочего листа
Worksheet_Deactivate (Событие деактивации листа)
Это событие возникает при активации другого рабочего листа
Worksheet_BeforeDoubleClick (Событие двойного щелчка по ячейке)
Это событие возникает при двойном щелчке на ячейке рабочего листа:
Worksheet_BeforeRightClick (Событие перед правым кликом)
Это событие возникает перед самым кликом правой кнопки мыши по рабочему листу
Worksheet_Calculate (Событие перерасчета листа)
Это событие возникает каждый раз, когда рассчитываются или пересчитываются данные на рабочем листе
Worksheet_Change (Событие изменения содержимого ячейки)
Это событие возникает каждый раз, когда изменяется содержимое ячеек на заданном листе:
Worksheet_FollowHyperlink (Событие нажатия на ссылку)
Это событие возникает при нажатии на ссылку (гипертекст)
Temporarily deactivate all events (Временное отключение всех событий)
Чтобы выполнять код без каких-либо событий, вставьте его между двумя строчками такого кода:
Источник
VBA
События
Синтаксис
Исходный модуль : [Public] Event [identifier]([argument_list])
Модуль обработчика : Dim|Private|Public WithEvents [identifier] As [type]
замечания
Событие может быть только Public . Модификатор является необязательным, поскольку члены модуля модуля (включая события) по умолчанию неявно Public .
Переменная WithEvents может быть Private или Public , но не Friend . Модификатор является обязательным, потому что WithEvents не является ключевым словом, которое объявляет переменную, но является частью ключевого слова модификатора синтаксиса объявления переменной. Следовательно, ключевое слово Dim должно использоваться, если модификатор доступа отсутствует.
Источники и обработчики
Что такое события?
VBA управляется событиями : код VBA запускается в ответ на события, вызванные хост-приложением или хост-документом — понимание событий является основополагающим для понимания VBA.
API часто выставляют объекты, которые вызывают ряд событий в ответ на различные состояния. Например, объект Excel.Application вызывает событие, когда новая рабочая книга создается, открывается, активируется или закрывается. Или когда рассчитывается рабочий лист. Или непосредственно перед сохранением файла. Или сразу после. Кнопка в форме вызывает событие Click когда пользователь нажимает на нее, сама пользовательская форма вызывает событие сразу после его активации, а другая перед закрытием.
С точки зрения API, события являются точками расширения : клиентский код может выбрать реализацию кода, который обрабатывает эти события, и выполнять собственный код при каждом запуске этих событий: таким образом вы можете автоматически выполнять свой пользовательский код каждый раз, когда выбор изменяется на любом листе — путем обработки события, которое запускается, когда выбор изменяется на любом рабочем листе.
Объект, который предоставляет события, является источником события . Метод, обрабатывающий событие, является обработчиком .
Обработчики
Модули документов VBA (например, ThisDocument , ThisWorkbook , Sheet1 и т. Д.) И модули UserForm являются модулями классов, которые реализуют специальные интерфейсы, которые выставляют несколько событий . Вы можете просматривать эти интерфейсы в выпадающем списке слева вверху панели кода:
В правом выпадающем списке перечислены элементы интерфейса, выбранные в раскрывающемся списке слева:
VBE автоматически генерирует заглушку обработчика событий, когда элемент выбран в правом списке, или перемещается туда, если обработчик существует.
Вы можете определить переменную WithEvents с модулем в любом модуле:
Каждое объявление WithEvents становится доступным для выбора из раскрывающегося списка слева. Когда в правом выпадающем списке выбрано событие, VBE генерирует заглушку обработчика событий, названную после объекта WithEvents и имя события, соединенного с подчеркиванием:
Только типы, которые выставляют хотя бы одно событие, могут использоваться с WithEvents , а объявлениям WithEvents нельзя назначить ссылку на месте с ключевым словом New . Этот код является незаконным:
Ссылка на объект должна быть Set явно; в модуле класса, хорошее место для этого часто Class_Initialize обработчике Class_Initialize , потому что тогда класс обрабатывает события этого объекта до тех пор, пока его экземпляр существует.
источники
Любой модуль класса (или модуль документа или пользовательская форма) может быть источником события. Используйте ключевое слово Event для определения сигнатуры для события, в разделе объявлений модуля:
Подпись события определяет, как будет создаваться событие, и как будут выглядеть обработчики событий.
События могут быть подняты только внутри класса, в котором они определены: клиентский код может обрабатывать их только. События поднимаются с RaiseEvent словом RaiseEvent ; аргументы события приведены в этот момент:
Без кода, обрабатывающего событие SomethingHappened , выполнение процедуры DoSomething все равно вызовет событие, но ничего не произойдет. Предполагая, что источником события является приведенный выше код в классе с именем Something , этот код в ThisWorkbook будет показывать окно сообщения «привет» всякий раз, когда test.DoSomething :
Передача данных обратно в источник события
Использование параметров, переданных по ссылке
Событие может определять параметр ByRef должен быть возвращен вызывающему абоненту:
Если в событии BeforeSomething есть обработчик, который устанавливает свой параметр cancel в значение True , тогда, когда выполнение возвращается из обработчика, cancel будет True а AfterSomething никогда не будет поднята.
Предполагая, что ссылка на объект foo присваивается где-то, когда запускается foo.DoSomething , окно сообщения запрашивает, следует ли отменить, а второе поле сообщения говорит «не отменять» только тогда, когда выбрано « Нет» .
Использование изменяемых объектов
Вы также можете передать копию ByVal объекта ByVal и позволить обработчикам изменять свойства этого объекта; вызывающий может затем прочитать измененные значения свойств и действовать соответственно.
В сочетании с типом Variant это можно использовать для создания довольно неочевидных способов вернуть значение вызывающему:
Источник
Создание макроса обработчика событий
Задача: в предыдущей заметке мы рассмотрели создание обычного макроса, который располагается в модуле VBA. Вместе с тем существуют специальные макросы, называемые обработчиками событий, которые запускаются автоматически в ответ на событие, происходящее в Excel.
Рис. 1. Для доступа к коду объекта ThisWorkbook кликните на ней правой кнопкой мыши и выберите View Code
Скачать заметку в формате Word или pdf, примеры в формате Excel (с кодом VBA)
Справочная информация: вот некоторые из часто используемых обработчиков событий:
- Workbook_open – этот макрос запускается при открытии книги.
- Workbook_BeforeClose – этот макрос запускается после того, как кто-то пытается закрыть книгу, но прежде чем появляется окно с вопросом, нужно ли сохранить изменения.
- Workbook_BeforePrint – этот макрос запускается, когда кто-то выдает команду печати, но перед отправкой задания на принтер. Макрос позволяет добавить настройки в печатную форму, например, путь к файлу или имя пользователя в колонтитуле листа.
- Worksheet_change – этот удивительный макрос запускается каждый раз, когда пользователь вводит значение в любую ячейку листа.
- Worksheet_Activate – этот макрос подобен Workbook_open, но запускается при переходе на лист. Может быть, вы хотите, чтобы появлялись определенные пункты меню, когда кто-то переходит на конкретный лист.
- Worksheet_SelectionChange – этот макрос запускается каждый раз при переходе в новую ячейку на листе.
Обработчики события являются мощными инструментами, но они работают корректно, только если должным образом введены в редакторе VBA. Код VBA следует ввести не в традиционный модуль, а в область кода листа или книги Excel.
Решение: допустим, вы нашли какой-то код, который хотите выполнить для события BeforePrint. Это событие соответствует уровню книги, так что код нужно поместить в соответствующую область. Выполните следующие действия.
Откройте книгу Excel. Переключитесь в редактор VBA, нажав сочетание клавиш Alt+F11. Если окно проектов (VBAProject) отсутствует, выведете его на экран, нажав Ctrl+R. Найти книгу в списке проектов. Щелкните на знак + слева от имени книги, а затем на знак + слева от Microsoft Excel Objects и Modules. Это развернет представление книг и рабочих листов вплоть до имен листов и названия модулей. Вы также увидите строки ThisWorkbook (ЭтаКнига). Именно в этих объектах следует хранить код для событий уровня книги. Дважды щелкните на строку ThisWorkbook. Также можно кликнуть на ней правой кнопкой мыши и выбрать опцию View Code (рис. 1).
Если вы копируете макрос из Интернета, самое время вставить его в окно кода. Если вы набираете макрос, самостоятельно выполните следующие два шага (рис. 2):
- В верхней части окна кода из левого раскрывающегося списка выберите Workbook. По умолчанию Excel в окне кода выводит начало процедуры Workbook_Open. Вы можете удалить этот фрагмент кода позже.
- В правом раскрывающемся списке представлены все события уровня книги (в алфавитном порядке). Выберите BeforePrint. Теперь в окне кода заготовка процедуры начинается с Workbook_BeforePrint.
Рис. 2. Заготовка кода для объекта книга (Workbook) и события BeforePrint
Процесс аналогичен, если вы хотите создать код обработчика событий на уровне листа Excel. В этом случае в окне проектов, вы должны выбрать не ThisWorkbook, а какой-либо лист, например, Sheet3 (Cash Flow), дважды кликнуть на нем, и выбрать в качестве объекта Worksheet, а в качестве события, например, SelectionChange. Excel автоматически создает заготовку процедуры, начинающуюся с Worksheet_ SelectionChange.
Резюме: создание макроса обработчика событий начните с выбора объекта (книги или листа), а затем введите код не в модуль, а в соответствующий объект – ThisWorkbook или лист Excel.
Источник
Это глава из книги Билла Джелена Гуру Excel расширяют горизонты: делайте невозможное с Microsoft Excel.
Задача: в предыдущей заметке мы рассмотрели создание обычного макроса, который располагается в модуле VBA. Вместе с тем существуют специальные макросы, называемые обработчиками событий, которые запускаются автоматически в ответ на событие, происходящее в Excel.
Рис. 1. Для доступа к коду объекта ThisWorkbook кликните на ней правой кнопкой мыши и выберите View Code
Скачать заметку в формате Word или pdf, примеры в формате Excel (с кодом VBA)
Справочная информация: вот некоторые из часто используемых обработчиков событий:
- Workbook_open – этот макрос запускается при открытии книги.
- Workbook_BeforeClose – этот макрос запускается после того, как кто-то пытается закрыть книгу, но прежде чем появляется окно с вопросом, нужно ли сохранить изменения.
- Workbook_BeforePrint – этот макрос запускается, когда кто-то выдает команду печати, но перед отправкой задания на принтер. Макрос позволяет добавить настройки в печатную форму, например, путь к файлу или имя пользователя в колонтитуле листа.
- Worksheet_change – этот удивительный макрос запускается каждый раз, когда пользователь вводит значение в любую ячейку листа.
- Worksheet_Activate – этот макрос подобен Workbook_open, но запускается при переходе на лист. Может быть, вы хотите, чтобы появлялись определенные пункты меню, когда кто-то переходит на конкретный лист.
- Worksheet_SelectionChange – этот макрос запускается каждый раз при переходе в новую ячейку на листе.
Обработчики события являются мощными инструментами, но они работают корректно, только если должным образом введены в редакторе VBA. Код VBA следует ввести не в традиционный модуль, а в область кода листа или книги Excel.
Решение: допустим, вы нашли какой-то код, который хотите выполнить для события BeforePrint. Это событие соответствует уровню книги, так что код нужно поместить в соответствующую область. Выполните следующие действия.
Откройте книгу Excel. Переключитесь в редактор VBA, нажав сочетание клавиш Alt+F11. Если окно проектов (VBAProject) отсутствует, выведете его на экран, нажав Ctrl+R. Найти книгу в списке проектов. Щелкните на знак + слева от имени книги, а затем на знак + слева от Microsoft Excel Objects и Modules. Это развернет представление книг и рабочих листов вплоть до имен листов и названия модулей. Вы также увидите строки ThisWorkbook (ЭтаКнига). Именно в этих объектах следует хранить код для событий уровня книги. Дважды щелкните на строку ThisWorkbook. Также можно кликнуть на ней правой кнопкой мыши и выбрать опцию View Code (рис. 1).
Если вы копируете макрос из Интернета, самое время вставить его в окно кода. Если вы набираете макрос, самостоятельно выполните следующие два шага (рис. 2):
- В верхней части окна кода из левого раскрывающегося списка выберите Workbook. По умолчанию Excel в окне кода выводит начало процедуры Workbook_Open. Вы можете удалить этот фрагмент кода позже.
- В правом раскрывающемся списке представлены все события уровня книги (в алфавитном порядке). Выберите BeforePrint. Теперь в окне кода заготовка процедуры начинается с Workbook_BeforePrint.
Рис. 2. Заготовка кода для объекта книга (Workbook) и события BeforePrint
Процесс аналогичен, если вы хотите создать код обработчика событий на уровне листа Excel. В этом случае в окне проектов, вы должны выбрать не ThisWorkbook, а какой-либо лист, например, Sheet3 (Cash Flow), дважды кликнуть на нем, и выбрать в качестве объекта Worksheet, а в качестве события, например, SelectionChange. Excel автоматически создает заготовку процедуры, начинающуюся с Worksheet_ SelectionChange.
Резюме: создание макроса обработчика событий начните с выбора объекта (книги или листа), а затем введите код не в модуль, а в соответствующий объект – ThisWorkbook или лист Excel.
title | description | author | manager | localization_priority | search.appverid | audience | ms.topic | ms.author | ms.custom | appliesto | ms.date | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Create application-level event handlers in Excel |
Discusses how to create application-level event handlers in Excel. |
helenclu |
dcscontentpm |
Normal |
MET150 |
ITPro |
troubleshooting |
luche |
CSSTroubleshoot |
|
3/31/2022 |
Create application-level event handlers in Excel
Summary
If you want a particular event handler to run whenever a certain event is triggered, you can write an event handler for the Application object. Event handlers for the Application object are global, which means that as long as Microsoft Excel is open, the event handler will run when the appropriate event occurs, regardless of which workbook is active when the event occurs.
This article describes how to create an Application-level event handler and provides an example.
More information
To create an Application-level event handler, you must use the following basic steps:
- Declare a variable for the Application object using the WithEvents keyword. The WithEvents keyword can be used to create an object variable that responds to events triggered by an ActiveX object (such as the Application object).NOTE: WithEvents is valid only in a class module.
- Create the procedure for the specific Application event. For example, you can create a procedure for the WindowResize, WorkbookOpen, or SheetActivate event of the object you declared using WithEvents.
- Create and run a procedure that starts the event handler.
The following example uses these steps to set up a global event handler that displays a message box whenever you resize any workbook window (the event firing the event handler).
Creating and Initiating the Event Handler
-
Open a new workbook.
-
On the Tools menu, point to Macro, and then click Visual Basic Editor.
[!NOTE]
In Microsoft Office Excel 2007, click Visual Basic in the Code group on the Developer tab. -
Click Class Module on the Insert menu. This will insert a module titled «<book name> — Class1 (Code)» into your project.
-
Enter the following line of code in the Class1 (Code) module:
Public WithEvents appevent As Application
The WithEvents keyword makes the appevent variable available in the Object drop-down in the Class1 (Code) module window.
-
In the Class1 (Code) module window, click the Object drop-down and then click appevent in the list.
-
In the Class1 (Code) module window, click the Procedure drop-down and then click WindowResize in the list. This will add the following to the Class1 (Code) module sheet:
Private Sub appevent_WindowResize(ByVal Wb As Excel.Workbook, _ ByVal Wn As Excel.Window) End Sub
-
Add code to the Class1 (Code) module sheet so that it appears as follows:
Public WithEvents appevent As Application Private Sub appevent_WindowResize(ByVal Wb As Excel.Workbook, _ ByVal Wn As Excel.Window) MsgBox "you resized a window" End Sub
Next, you have to create an instance of the class and then set the appevent object of the instance of the Class1 to Application. This happens because when you declare a variable, WithEvents, at design time, there is no object associated with it. A WithEvents variable is just like any other object variable — you have to create an object and assign a reference to the object to the WithEvents variable.
-
On the Insert menu click Module to insert a general type module sheet into your project.
-
In this module sheet, enter the following code:
Dim myobject As New Class1 Sub Test() Set myobject.appevent = Application End Sub
-
Run the test macro.
You have just set the event handler to run each time you resize a workbook window in Microsoft Excel.
-
On the File menu, click Close and Return to Microsoft Excel.
-
Resize a workbook window. A message box with «you resized a window» will be displayed.
How to Turn Off the Event Handler
If you close the workbook that contains the above project, the application-level event handler will be turned off. To programmatically turn off the event handler, do the following:
-
Start the Visual Basic Editor.
-
In the macro code you entered in Step 9, change the macro to:
Sub test() Set myobject.appevent = Nothing End Sub
-
Run the test macro again.
-
On the File menu, click Close and Return to Microsoft Excel.
-
Resize a workbook window.
The message box will not display.
Events And Event Procedures In VBA
This page describes Events and Event Procedures in VB and/or VBA.
Event programming is a very powerful tool that you can use within your VBA code to monitor user actions, take appropriate action
when a user does something, or monitor the state of the application as it changes. If you are programming with your own custom classes, you
can extend the functionality of these classes by defining and raising your own custom events, broadcasting the event message to any
object that is listening for events from your class.
Events and Event Procedures were introduced in Excel97. Earlier versions of Excel do not support events. Events and event
procedures are the same for versions 97 through 2007. No significant changes have been made to the event model since its
introduction in Excel97. A few new events have been added, but the overall structure of the event system is unchanged.
An Event is an action initiated either by user action or by other VBA code. An Event Procedure
is a Sub procedure that you write, according to the specification of the event, that is called
automatically by Excel when an event occurs. For example, a Worksheet object has an event named
Change. If you have properly programmed the event procedure for the Change
event, Excel will automatically call that procedure, always named Worksheet_Change and always in the code module of the worksheet,
whenever the value of any cell on the worksheet is changed by user input or by other VBA code (but not if the change in value is
a result of a formula calculation). You can write code in the Worksheet_Change event procedure to take
some action depending on which cell was changed or based upon the newly changed value. (The
Worksheet_Change event might more properly be called Worksheet_AfterChange
since it is called after the cell(s) has been changed. There is no way to access the previous value of the cell before it was changed.)
For the Change event, the system will pass you a Range reference named Target that refers to the
cell(s) being changed. You can examine that variable to determine if your code needs to carry out some action or whether it can ignore
the change and get out with an Exit Sub statement. See the Sample Event Procedure section below.
The events and their procedure declarations are fixed. You must not alter the name or parameter list of an event procedure. The VBA
Editor will automatically insert the correct procedure declaration. Do not alter this. You cannot create new events for an Excel
object. The events are «hard coded» into the object, such as a Worksheet, and may not be changed. (You can, however, create custom
events for your own classes. See the Creating Your Own Events In Your Class Modules section later in this article.
There are many events that are defined in a Worksheet object, the Workbook object, and the Excel Application object itself.
On this page, we will cover Application events in only in general terms, but not in much detail since they require a different
coding model. (See Application Events for a discussion of Application events.) An event is said to be
raised when the action that initiates the event occurs and the application automatically sends a signal to all
components connected to event-generating object (e.g, a Worksheet) indicating that the event has occured. An Event Procedure
is a VBA Sub procedure that is executed automatically by Excel when the event is raised. It is important to remember that
in addition to user input, events may run as the results of actions taken by other VBA code. There is no direct way to determine whether
the cause of the event was user input or VBA code. You should write your events procedures such that this distinction does not matter.
Since VBA can cause an event procedure to run, it is possible that your code may end up in a loop. See Preventing Event Loops
later in this article for information about event loops and how to avoid them with proper coding.
For the Change event in particular, it should be noted that this is triggered when a cell
is changed by user action or by other VBA code, but is not raised if the value of a cell is changed as a result of formula calculation.
EVENTS — On this page, we will be discussing only Excel’s events related to Sheets, Workbooks, and the Application,
which are completely independent of the events for user forms and controls on user forms. The EnableEvents
setting, discussed later, has no effect on events of user forms or controls on user forms. For information about supressing events
for controls on a form, see Suppressing Events In UserForms. Events on Charts are a special
case of events and need special code handling.
OBJECT MODULES — Everything related to event handling — the definition of event procedures, creating a
WithEvents variable to receive events, and creating your own events — takes place
within Object Modules. Besides setting the EnableEvents property, there is
nothing related to events in a standard code module; every thing is in an object module. An Object Module is
any one of the following:
A Class module.
A Sheet module (either a worksheet or a chart sheet).
The ThisWorkbook module
The code module behind a User Form
You can use the Object Browser in the VBA Editor to determine what events are avaiable for the three objects that generate events — the Worksheet,
the Workbook, and the Application. (See the notes on ChartObjects and Charts in the blue box in the Event Hierarchy section below.)
Open the Object Browser in the VBA Editor (press F2 or choose Object Browser from the View menu.
In the Classes list, scroll down and select Worksheet. Right-click anywhere in the primary window and choose Group Members on the pop up menu.
Then scroll down in the Members Of «Worksheet» list until you see items with yellow lightening bolts next to them.
These are the events for the Worksheet objects. Do the same for the Workbook and
Application objects. For help on a particular object or event, select it in the Object Browser and
press F1 for Help on that topic (note that not all events are documented — you may have to access event information by going through
the object to which the event belongs.
Another method to determine what events are available is to create an empty class module, and enter the following code:
Dim WithEvents App As Application
Dim WithEvents WB As Workbook
Dim WithEvents WS As Worksheet
Dim WithEvents CHT as Chart
Then, select each of App, WB, WS, and CHT
elements in the left side dropdown at the top of the code window. All the events for the selected item in the left dropdown will be listed in the
right dropdown. If you see an item of interest, let go of the mouse button and the VBA editor will insert that event’s
procedure declaration in the code module. The declaration will tell you what the parameters for the event are, but you will still need
to use Help to obtain a description of the meaning and usage of the parameters. Event procedures must be declared exactly as they are defined.
This is why it is good practice to let the VBA Editor insert your procedure shell. Do not change any of the VBA generated code.
The easiest way to start with events and event procedures is to allow the VBA editor to build the shell code for you. In Excel,
right click one of the sheet tabs at the bottom of the main window and choose View Code from the pop-up menu. This will
open the VBA Editor to the code module associated with that worksheet. In that code window you will see two dropdown boxes at
the top of the code window, as shown below:
Change the (General) setting to Worksheet and then change SeletionChange to Change. This will add
the event procedure declaration for the Change event to the code module, as shown below:
Within the Worksheet_Change procedure, you can add any code that you want to take place when a cell value
is changed. This event is raised automatically by Excel when a cell’s value is changed either by user input or by other VBA code. It
is not raised if the value of the cell is changed by a formula calculation in that cell. The Target parameter
is a Range type object referring to the cell(s) that were changed. To use other events of the worksheet, select the event in the right hand
dropdown at the top of the code pane. When you change this setting, VBA will insert the procedure shell in the code module for you,
ensuring that the procedure is properly declared. Under no circumstances should you change anything in the Sub
statement created by VBA. Doing so may cause the event not to work.
For sheet (both worksheet and chart sheet) level events, the event procedure code must be placed in the Sheet module associated with that sheet.
Workbook level events must be placed in the ThisWorkbook code module. If an event procedure is not in the proper module, VBA will
not be able to find it and the event code will not be executed. It is generally accepted good programming practice that only event
procedures be included in the sheet modules and the ThisWorkbook modules. If you have no compelling reason to put other code in the
sheet or ThisWorkbook modules (and there are a few quite legitimate reasons to do so, but they are beyond the scope of this article)
you should put it in a standard code module.
There is no built in object to catch Application events. You can do either of two things, as described
below, in the Application Events section of this page: use the ThisWorkbook code module or use a dedicated class module.
Placing the code in the ThisWorkbook module requires slightly less code, but I prefer to use a dedicated class module for
organizational purposes — one module for each logical function group. Neither method is particularly better than the other.
Use the method that is easiest for you.
As noted above, events are generated by:
- The Application
- The Workbook
- The Worksheets
- Charts
If a Chart is a Chart Sheet, then it follows the rules of a Worksheet, except that its events are no replicated by the Workbook
or Application objects. If a Chart is part of a ChartObject embedded on a worksheet, it follows its own rules. See
the Charts And ChartObjects subsection, in blue, later in the article.
An object contains events for itself as well as replications of events for its subordinate objects. Since the Worksheet
is at the bottom of the hierarchy and has no subordinate objects (at least no objects that have events, that have events), so the Worksheet contains
only events for itself. For example, each worksheet has an event named Worksheet_Change that is triggered when
a cell on that worksheet is changed either by user input or by VBA (but not if the change is the result of a calculation). Each worksheet’s
Worksheet_Change event is exclusive to that sheet.
SUBORDINATE AND SUPERIOR OBJECTS — In the article, we will use the term Subordinate object to refer to an object below some other
object in the hierarchy of event-generating objects. The term Superior object refers to an object that is higher up in the
hierarchy of event-generating objects. For example, Worksheet is a subordinate object, to both the
Workbook and Application object. The Workbook
is both a subordinate and superior object; it is a superior object to the Worksheet object and is
a subordinate object to the Application object. Though Charts (either Chart Sheets or Chart objects
in ChartObject objects on a worksheet) do raise events, they don’t fit into the hierarchy. As far as the event generation object
model is concerned, Charts are orphans. See the CHARTS AND CHARTOBJECTS notes later in this section.
The Workbook object is higher up in the hierarchy. Worksheets are subordinate to the workbook. Therefore, the
Workbook object has events for itself, such as BeforeSave as well has versions of all
the events of the Worksheet class. For example, every worksheet has a Worksheet_Change event
that is called in response to changes on that worksheet. The Workbook object also has a
Workbook_SheetChange event that is called when any cell on any worksheet is changed. When a cell value is changed,
both the worksheet’s Worksheet_Change and the workbook’s Workbook_SheetChange events
are triggered, and a reference to the changed cell(s) is passed to event procedure.
Since the Application object sits at the top of the hierarchy, it contains events for itself, such as App_NewWorkbook
as well as events for all Workbook events and all Worksheet events. Since every event «rolls up» to the Application
object, it would be possible to write all the event code within the structure of Application Events. However, this would be very cumbersome
and would not take advantage of the modularization that separates event drivers (Application, Workbook, and Worksheet) provide. The code would
get very complicated very quickly.
CHARTS AND CHARTOBJECTS — Charts do have events (although ChartObjects on a worksheet do not), but they do not fit nicely into the regular hierarchy
of the event-generating objects. If you have a Chart Sheet (as oppsosed to a Chart in a ChartObject residing on a Worksheet),
the chart sheet acts much the same way as a worksheet with respect to events, albeit with a different set of events. Moreover,
these events do not have counterparts in the Workbook object or the Application object.
Charts are kind of orphans in the grand scheme of events. A Chart object that is part of a ChartObject on a worksheet also has events,
but like the Application object, there is no ready-made container for events of Charts that are part of a ChartObject
on a sheet. Instead, you must use either of the techniques described later for the Application object
— just substitute «As Chart» for «As Application» and set the event class variable to
Sheet1.ChartObjects(«MyChart»).Chart. ChartObjects do not have events — it is the Chart object within the
ChartObject object that has the events. Events for Charts, either Chart Sheets or Charts in embedded ChartObject do not have their events
replicated in either the Workbook or the Application objects. Charts are sort of the «oddball» object of Excel’s event system.
The following code may be placed in the ThisWorkbook object module to access events of a
Chart in an embedded ChartObject object.
Public WithEvents CHT As Chart Private Sub Workbook_Open() Set CHT = Worksheets(1).ChartObjects(1).Chart End Sub Private Sub CHT_Activate() MsgBox "CHT: TypeName: " & TypeName(CHT) & vbCrLf & _ "CHT Name: '" & CHT.Name & "'" & vbCrLf & _ "CHT Parent TypeName: " & TypeName(CHT.Parent) & vbCrLf & _ "CHT Parent Name: " & CHT.Parent.Name End Sub
If you have event code in the sheet, the workbook, and the application classes, the event will be raised in all three of these objects. Even if a change
is trapped by a sheet level Worksheet_Change event, the event procedure in the Workbook and the Application will also be
raised. The order of events is from the least significant object (the Sheet) upwards through the most significant object (the Application).
You can stop the event from being triggered «upstream» (e.g., preventing the Workbook_SheetChange and the
App_SheetChange event from being raised) by setting the Application.EnableEvents
property to False. For example, in a sheet’s code module:
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Application.EnableEvents = True End Sub
This code processes the cell change event at the Sheet level, but the line
Application.EnableEvents = False prevents the Worksheet and Applicaton
SheetChange events from being raised. Indeed, this line of code suppresses all events
from being raised until its value is reset to True. Note that Excel never automatically sets
Application.EnableEvents back to True
(as it does do with the ScreenUpdating property). It is up to your code, including well designed
error handling code, to ensure that Application.EnableEvents is properly reset to True.
See Error Handling In VBA for more information about error handling code.
This section will examine a very simple event, the Worksheet_Change event, and illustrate
a few useful techniques you can use to determine whether your code needs to act in response to the event. The basic event code, as
generated by VBA is as follows:
Private Sub Worksheet_Change(ByVal Target As Range) End Sub
As written, the event procedure does nothing — there is no code within the procedure. The Target
parameter is a Range object that refers to the cell(s) that were changed. Since Worksheet_Change runs for
every cell in the worksheet, you most likely will need to test whether Target is within some predefined
range of interest. If it is that range, you’ll do something. If Target is not in that range, you don’t
want to carry out the action of the procedure. The easiest way to do this is with the Intersect method.
Intersect returns a range of cells that are included in two ranges. For example, the Intersection of the range
A1:C3 and C3:F6 is the cell C3 since that cell
is common to both ranges. If there are no cells in common between two ranges, Intersect returns
Nothing. Thus, you can use intersect to see if Target is within the range
of interest:
If Not Application.Intersect(Target, Me.Range("A1:C10")) Is Nothing Then Else Exit Sub
You could also use named ranges rather than hard coded cell references. This is the preferred approach.
There may be times you want to act only if a single cell was changed, and ignore it if multiple cells are changed. In that case,
you can use
If Target.Cells.Count > 1 Then Exit Sub
Here, if Target contains more than one cell, get out of the procedure. In a similar fashion you can test whether
Target is within a specified column or row or range of columns and rows. Any of the following code should get you
started:
If Target.Cells.Count > 1 Then Exit Sub End If If Target.Columns >= 3 And Target.Columns <= 10 Then Else Exit Sub End If If Target.Row >= 5 And Target.Row <= 10 Then Else Exit Sub End If
Since Target is a Range object, you can perform any number of tests using the vast flexibility of a Range
object to determine whether your code should act on the change or simply ignore it by calling Exit Sub.
It is possible that you need to respond to the events of a specific worksheet differently than you would for other worksheets, and that
the name of the special worksheet is not known until run time (e.g., it might be a sheet added by your application). You could handle
this in the Workbook_SheetChange event, but it would require cumbersome logic to process events for
only one worksheet rather than all worksheets. A better and more elegant solution is to create a special class module and within that
module declare a variable of type Worksheet using the WithEvents keyword. For example,
suppose you want to handle events for a worksheet that is created at run time. In a standard code module, declare a
Collection object as:
Public WSColl As Collection
Next, create a class named CWorksheetObject and insert the following code:
Public WithEvents WS As Worksheet
Private Sub WS_Change(ByVal Target As Range) Debug.Print "Special Code For New Worksheet" End Sub
This code declares a variable named WS of type Worksheet using the
WithEvents keyword. WithEvents connects the event system to the
WS variable and lets you utilize the events of the object. Next, you would include the
event procedures for this worksheet:
Private Sub WS_Change(ByVal Target As Range)
Debug.Print "Special Code For New Worksheet"
End Sub
Finally, you create an instance of the CWorksheetObject class and set its WS
variable to the newly created worksheet. Once the WS variable is set to a specific worksheet, the
event procedures in that class will run for events on the assigned worksheet.
Sub TestProc() Dim WSObj As CWorksheetObject Dim WSheet As Worksheet If WSColl Is Nothing Then Set WSColl = New Collection End If Set WSObj = New CWorksheetObject Set WSheet = Worksheets.Add() WSheet.Name = "Some Name" Set WSObj.WS = WSheet WSColl.Add Item:=WSObj, key:=WSheet.Name End Sub
The TestProc procedure first declares a variable named WSObj of type
CWorksheetObject. At this point, the object exists, but its WS Worksheet
object has not yet been set to any specific workbook, so no events will fire in the class. The code then creates a new worksheet,
names that worksheet, and then sets the WSObj‘s WS object to the newly
created worksheet. Now that the WS object has been set to a specific worksheet, it will respond to
events generated by the newly created worksheet. Finally, it stores the WSObj variable in the
WSColl Collection variable so the object is not destroyed when it goes out of scope at the end
of the procedure.
Using the method above, and expanding on it to use other object types, you can simplify programming tasks that might otherwise
require much more complicated logic.
There are two common ways to declare application events (though because VBA is as versatile as it is, there are many other
ways to implement Application events). The first is to declare the App variable (of type Application in
the ThisWorkbook code module. The second method is to use a dedicated code module.
In the ThisWorkbook code module, insert the following code:
Public WithEvents App As Application Private Sub Workbook_Open() Set App = Application End Sub
Then, select App in the left side dropdown at the top of the ThisWorkbook code pane
and choose in the right side dropdown which of the available events you wish to use. VBA will automatically insert the
proper declarations for that event. Remember, never change the code that VBA inserts for you. If you do change it, it
is quite likely that the code will not work properly, if at all.
You can then use events for the App object such as:
Private Sub App_NewWorkbook(ByVal Wb As Workbook) MsgBox "New Workbook: " & Wb.Name End Sub
The second approach to creating Application Events is to use a dedicated class module. Insert a class module into your project and
name the class module CExcelEvents. In that class module, enter the following code:
Private WithEvents XLApp As Application Private Sub Class_Initialize() Set XLApp = Application End Sub
Then, change the left side dropdown at the top of the code pane to XLApp and choose an event from the right side dropdown. VBA
will automatically insert the proper procedure shell for that event. As before, do not change the code generated by VBA.
You can then define your application event procedures in the class module. For example,
Private Sub XLApp_NewWorkbook(ByVal Wb As Workbook) MsgBox "NewWorkbook" & Wb.Name End Sub
The next step is to create a variable of type CExcelEvents and initialize that variable to a new instance
of CExcelEvents. In the ThisWorkbok code module, declare a variable as shown below:
Private ExcelEvents As CExcelEvents Private Sub Workbook_Open() Set ExcelEvents = New CExcelEvents End Sub
Since the Class_Initialize procedure of the CExcelEvents class initializes the
XLApp variable when the class is created, we do not have to worry about initializing XLApp.
Any Application event procedures should be added to the CExcelEvents class.
Given that there are at least two method for creating an object to receive Application Events, you may be wondering which is better,
a separate class module or the ThisWorkbook module, Neither is better in any significant way. As a matter
of personal preference and coding style, I put my application events in a dedicated class module. In my opinion, this keeps to
project better organized. However, beyond that, there is no advantage to use a dedicated class module for Application events. You should
use the approach that seems most natural to your own coding style. Once you decide on a method, stick with that method across projects.
Don’t mix and match.
Without proper coding, your event procedures can end up in infinite
recursive loops. Depending on your version of VBA and Excel, this may result in
an non-trappable Out Of Stack Space error or VBA will simply terminate execution when some threshold (approximately 300) number
of calls is met. Consider, for example, the following code:
Private Sub Worksheet_Change(ByVal Target As Range) Target.Value = Target.Value + 1 End Sub
At first glance, this code may seem perfectly valid. When a cell is changed to some value by the user, the code adds one the that value,
so if a user enters 1, the code will change that to 2. However, this is not what will actually happen. When the user changes the cell to
1, the event procedure runs and changes the value to 2. This change, however, raises the Change event again
and the code will run to change the 2 to a 3. This again raises the Change event, which changes the value 3 to 4.
Yet again, the Change event runs, changing the 4 to a 5. This looping will continue until VBA aborts
the loop or you run out of stack space.
In order to prevent this runaway looping, you can use the EnableEvents property of the
Application object. When you set this property to False VBA will not raise any
events, and the example Change event will run once only for the input by the user. It will not run when
the value is changed by the VBA code. You should always be sure to set EnableEvents property back
to True to enable events to be called normally. Unlike some properties (such as ScreenUpdating),
Excel will not automatically change EnableEvents back to True. Your code must ensure that the value
is properly reset. For example, in the code that follows, the Target value is incremented once, but
since EnableEvents value is False, no subsequent Change
event is raised.
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target.Value = Target.Value + 1 Application.EnableEvents = True End Sub
In some circumstances, it may not be desirable to disable all event handling using Application.EnableEvents = False.
Your application may rely on various events running when they should. You can work around this by creating a public Boolean variable, testing
that variables in your event procedure, and exiting the procedure if that variable is True. This way, you can turn off one event handler while
leaving the other event handling in place. For example, in a standard code module, declare a variable such as:
Public AbortChangeEvent As Boolean
Then, in the Worksheet_Change event procedure, you test this variable. If it is true, you would
immediately exit the procedure, as shown in the example below.
Private Sub Worksheet_Change(ByVal Target As Range) If AbortChangeEvent = True Then Exit Sub End If End Sub
Finally, you would disable the Worksheet_Change event by setting the AbortChangeEvent
variable to True. For example,
AbortChangeEvent = True Range("A1").Value = 1234 AbortChangeEvent = False
The code above disables only the Worksheet_Change event and only for the one line code. In general,
using Application.EnableEvents = False is sufficient, but there may be circumstances in which more
complex event handling is necessary.
Because the event object model includes implementations of the events of subordinate objects (e.g.,
Application has events for the Workbook and the
Worksheet objects), you may find that some results are different than what you may expect.
EVENT ORDER: It is important to note that the event procedures of a subordinate object (e.g., the Worksheet
will run to completion before an event of a superior object (e.g., Workbook) is called. That is, the Worksheet
event procedure Worksheet_Change will run to conclusion, to the End Sub statement,
before the Workbook event procedure Workbook_SheetChange occurs. Thus, you cannot assume that the Workbook and/or
Application SheetChange have been executed within your code in the Worksheet_Change event
procedure. You should assume the opposite — the events of the superior object will not yet have run.
For example, create a class named CExcelEvents and insert the following code:
Public WithEvents App As Application Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) Counter=Counter + 1 Debug.Print "Counter: " & CStr(Counter) End Sub
Then, put the following code in the ThisWorkbook module:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Counter = Counter + 1 Debug.Print "Counter: " & CStr(Counter) End Sub
Next, put the following code in the code module for Sheet1:
Private Sub Worksheet_Change(ByVal Target As Range) Counter = Counter + 1 Debug.Print "Counter: ", CStr(Counter) End Sub
Finally, put the following code in a standard code module like Module1:
Public Counter As Long Public XLApp As CExcelEvents Sub AAA() Set XLApp = New CExcelEvents Counter = 0 End Sub Sub BBB() Debug.Print "*** COUNTER: ", CStr(Counter) End Sub
Now run the procedure AAA to get things set up. Next, type something into any cell on Sheet1. Finally
run the procedure BBB. Open the Immediate Window if it is not already open (CTRL G)
and look at the messages. You should see:
Counter: 1 Counter: 2 Counter: 3 *** COUNTER: 3
The counter is incremented first by the event procedure Worksheet_Change in the Worksheet
module, then incremented again in the Workbook_SheetChange procedure in the ThisWorkbook
code module, and then incremented yet again by the App_SheetChange event procedure. Thus, the counter
gets a value of 3, not 1 as you might expect. If you are using events in a superior object, you must take care that the events in
the superior object do not duplicate work done in the subordinate procedure. Not properly managing events in subordinate and superior objects
can cause unexpected results, such as the result of 3 in the example above.
If you are writing your own class modules (see Introduction To Classes for an introduction to
working with and creating classes), you may want a class to raise an event when a specified action or condition occurs. This is
a fairly simple process. Note that only object modules (class modules, userform code modules, the sheet modules, and
the ThisWorkbook code module) may declare events. You cannot define, raise, or receive events in standard code modules. Also,
only object modules may declare variable WithEvents and therefore only object modules may receive
event triggers.
In the class that will create the events, you must first declare the events themselves with the
Public Event statement, such as:
Public Event EventName(Parameters, ByRef Cancel As Boolean)
Here, EventName is the name of the event. This should be a meaningful name. Parameters
is a list of any parameters that you want to pass to the class that is receiving this event, such as
X As Long, Y As Double, Z As String
This is optional. Finally, Cancel is an optional but useful parameter. It allows the class that is receiving
the event to respond back to the class that contains the event that the action in question should be cancelled. For example,
the Workbook_BeforeSave event has a Cancel parameter that allows you to cancel
the Save operation. While a Cancel parameter is entirely optional, it is a
nice touch that can add flexibility and a professional touch to your application.
Once you have declared your events, (one Public Event declaration for each event), you need
raise the event at the appropriate location in your class. Where you raise the events depends entirely on the context of the executing
code and what action or condition the event signifies. When I design commercial software, I use events extensively, using both a
BeforeSomeAction and AfterSomeAction event pair to notify any listener that my code is
about to carry out some action and to notify the listener than the action has been completed. If possible, I like to include
a Cancel parameter to allow the event listener to cancel a pending operation. However, you can use events
in any way you want.
You raise an event using the RaiseEvent statement. Once the event is declared, you trigger it with the
RaiseEvent statement. Both declaration and raising of the event EventName are
shown in the code below. Note that you cannot use Named Arguments when passing parameters to the
RaiseEvent procedure.
Public Event EventName(IDNumber As Long, ByRef Cancel As Boolean) Sub AAA() Dim B As Boolean Dim IDNumber As Long IDNumber = 1234 Cancel = False RaiseEvent EventName(IDNumber, Cancel) If Cancel = False Then Else End If End Sub
Once you have created your class with events, you need to write the code that will receive the event triggers. Note that only object modules
(class modules, a user form code module, a Sheet module, or the ThisWorkbook module — standard code modules cannot receive events) can receive
event messages. In a suitable object module, declare the event class using WithEvents:
Dim WithEvents XLEvents As CExcelEvents
At some point in your code, you will need to set the XLEvents variable to an instance of the
CExcelEvents class, with the code:
Set XLEvents = New CExcelEvents
Exactly when and where you put the object initialization code depends on what sort of module contains the event
declaration. While it is technically possible to put the initialization of the variable in another procedure, this is generally
a bad programming practice: it makes the code more difficult to debug and maintain. As a general rule, the code that initializes
the events variable should be in the same class as the events variable. Of course, the actual event code must reside in the
same object module as the events variable declaration. In a class module, the initialization would normally be in the Class_Initialize event.
For a user form, the code would go in the UserForm_Initialize event.
Private Sub XLEvents_EventName(IDNumber Long, Cancel As Boolean) Cancel = True End Sub
This page last updated: 23-March-2010
Программирование событий excel
Реакция на вносимые пользователем изменения стала неотъемлемой частью функционирования электронных таблиц, поэтому написание кода для событий в Excel часто играет более значимую роль, нежели в остальных приложениях пакета Office. Изменение значения лишь одной ячейки, использующейся в расчетах формулы или диаграммы, может привести к существенным последствиям для всей рабочей книги. Возможность перехвата событий, управляющих данным процессом, для улучшения и расширения функциональности встроенной системы ответов Excel, целиком находится во власти VBA-программиста.
Выбор правильного объекта
Перед написанием кода обязательно нужно решить, какой объект должен отвечать на событие. В Excel способны распознавать события четыре объекта: диаграммы, отдельные рабочие листы, рабочие книги и приложение Excel в целом. Если требуется написание кода, отвечающего на событие, связанное с диаграммой, такой код подходит к процедуре события диаграммы. Однако для событий, являющихся ответом на изменения в рабочем листе, программист получает несколько вариантов выбора.
Хотя некоторые события Excel распознают лишь определенные объекты, большинство из них образует иерархию от объекта Worksheet до объектов Workbook и Application. Например, изменения, внесенные в рабочий лист, инициируют событие Change (Изменение) объекта Worksheet, который в свою очередь инициирует событие Sheet Change (Изменение листа) для объектов Workbook и Application.
Принимая во внимание сказанное выше, следует определить, подходит ли код для процедуры события рабочего листа, рабочей книги или приложения. Задача выбора не составит много труда.
* Если код должен выполняться только при ответе на изменения в единственном рабочем листе, он подходит процедуре события данного рабочего листа.
* Если процедура должна выполняться при внесении изменений в любом рабочем листе определенной книги, код следует вставить в процедуру события рабочей книги.
* Если же код должен активизироваться в любой из открытых рабочих книг, он безусловно подходит процедуре события приложения.
Техника написания процедуры события для любого объекта Excel в своей основе не имеет никаких принципиальных отличий по сравнению с техникой написания кода события для формы или элемента управления VBA. В главе 10 приведено детальное описание методики, но основные моменты можно представить следующим образом.
1. Откройте окно редактирования кода для объекта.
2. Выберите объект, выбрав его имя из раскрывающегося списка Объект в левом верхнем углу окна.
3. Выберите из раскрывающегося списка Процедура, в правом верхнем углу окна, событие, для которого должен быть написан код.
4. При этом в окне появляется каркас выбранной процедуры сообщения.
Кроме написания самого кода, единственным сложным моментом может быть вынос окна редактирования кода на первое место (п. 1 в приведенном выше списке). Для объектов Worksheet, Workbook и Chart, занимающих отдельный лист, никаких особенностей нет- необходимо просто выбрать объект в окне обозревателя и щелкнуть на кнопке View Code. Объекты представляются в алфавитном порядке, а их имена можно изменять в окне Options.
В случае диаграмм, внедренных в рабочий лист, а также объектов приложения Excel ситуация посложнее. Для того чтобы сделать такие объекты доступными из окна, требуется написание специальных модулей классов. Объем данной книги не позволяет детально рассмотреть данный вопрос, однако информацию, касающуюся данной темы, можно получить из справочной системы.
Если необходимо, чтобы код реагировал на действия, производимые пользователем с рабочим листом, потребуются такие инструменты, как свойства Change, Calculate и SelectionChange (для объектов Worksheet) и соответствующие события SheetCnange, Sheet Calculate и SheetselectionChange (для объектов Workbook и Application). Для запуска пользовательских процедур в то время, когда сами рабочие листы или диаграммы активизированы или не активизированы, используются события Activate и DeActivate.
События Change и Sheet Change инициируются каждый раз, когда значение любой ячейки или нескольких ячеек изменяется в результате действий пользователя или обновления ссылки. Однако изменения в вычисляемых значениях не приводят к инициированию события. Соответствующие процедуры событий позволяют наметить ячейку, значение которой было изменено. В следующем примере проверяются измененные значения внутри диапазона, называемого Target, на предмет их попадания в определенные пределы; такие значения выделяются с помощью шрифта с большим кеглем, полужирным начертанием и зеленым цветом.
Private Sub Worksheet_Change(ByVal Target As Range)
For Each oCell In Target
If oCell> 4 And oCell < 11 Then
With oCell.Font
.Bold = True
.Size = 16
.Color = RGB(0, 255, 0) ‘ Зеленый
End With
End If
Next oCell
End Sub
Обратите внимание, что Target может быть не одной ячейкой, а диапазоном, благодаря тому, что операции заливки, удаления и вставки могут применяться одновременно к нескольким ячейкам. Для этого процедура сообщения Change должна включать в себя структуру
For Each … Next; в таком варианте процедура применима как отдельной ячейке, так и к нескольким ячейкам, что и демонстрирует приведенный выше пример.
В действительности, события Change и Sheet Change могут активизироваться даже тогда, когда значение не изменялось. Данные события готовы произойти, когда пользователь начинает редактирование ячейки (после щелчка в панели формул или нажатия клавиши <F2>), даже если сразу после этого он прекратил редактирование, не внеся никаких изменений (нажав клавишу <Enter>, щелкнув на кнопке Ввод или на рабочем листе). Событие не активизируется, если пользователь прекращает редактирование нажатием клавиши <Esc> или щелчком на кнопке Отмена.
Событие Calculate распознаваемое как объектом Worksheet, так и Chart, происходит при каждом обновлении программой Excel рабочего листа или диаграммы.
Событие Sheet Calculate для объектов Workbook и Application происходит в ответ. Если средство автоматического вычисления включено, данное событие активизируется, как только изменяется значение любой ячейки, т.е. происходит в тандеме с событием Change. Когда средство пересчета включено в ручном режиме, событие Calculate происходит лишь тогда, когда пользователь инициализирует пересчет нажатием клавиши <F9>.
Процедуры событий для событий Calculate и SheetCalculate используются для изменения рабочего листа в соответствии с результатами вычислений. Например, если известно, что пересчет может изменить элементы упорядоченного списка, целесообразно использовать процедуру события Worksheet _Calculate для упорядочения списка после проведения вычислений. Поскольку данные процедуры не сообщают, какая из ячеек изменялась в результате вычислений, необходимо поместить в код адреса ячеек, которые требуется изменить.
При каждом перемещении активной ячейки, а также при расширении или сжатии выделения Excel вызывает событие SelectionChange для Worksheet. Параллельно происходит событие Sheet SelectionChange для объектов Workbook и Application. Процедуры событий для данных событий можно использовать для обратной связи с текущим выделением. В приведенном ниже примере событие Selection Change используется для отображения в левой верхней ячейке текущего листа адреса активной ячейки, а также для помещения имени рабочего листа и адреса выделения в строку состояния. Обратите внимание на то, как аргумент Sh позволяет идентифицировать и вести работу с текущим листом:
Private Sub Workbook Sheet SelectionChange (ByVal Sh As Object, _
ByVal Tarqet As Excel.Range)
Sh.Range(«Al») = ActiveCell.Address
Application.StatusBar = Sh.Name & » : » & Target.Address
End Sub
Несколько усложнив код. можно добиться того, чтобы вместо простого выделения вызывался какой-нибудь ответ: например, чтобы в случае попадания определенной ячейки пли диапазона в новое выделение отображалось пользовательское диалоговое окно:
Private Sub Worksheet_SelectionCharge (ByVal Target As Excel.Range)
If Target.Address = «$3$2» Then
MsgBox «Вы нашли нужную ячейку!»
End If
End Sub
Поскольку объекты диаграмм Excel способны распознавать большое число событий, многие из которых связаны с мышкой, их можно считать большим элементом управления ActiveX, помещенным в рабочей книге. Диаграммы распознают события Activate, DeActivate и Calculate. Вот еще некоторые события, для которых возможно написание кодов.
* DragOver и DragPlot. Происходят, когда ячейки перемешаются над внедренной диаграммой или опускаются на нее соответственно.
* MouseDown. MouseUp и MouseMove. Происходят в ответ на действия мыши.
* Select. Происходит при выделении какой-либо части диаграммы. Написанный код может определять тип и характеристики выделенного элемента и проводить соответствуюшие действия.
* Series Change. Происходит, когда пользователь изменяет значение в диаграмме через саму диаграмму (а не изменяя значения, содержащиеся в листе).
Читайте также
Регистрация событий
Регистрация событий
Службы часто выполняются, внешне ничем себя не проявляя, без диалогового взаимодействия с пользователем. Некоторые службы создают консоль, окно сообщений[34] или окно для взаимодействия с пользователем, но лучше всего записывать информацию о событиях
Обработка событий
Обработка событий
Теперь самое время рассмотреть один ключевой вопрос Web-программирования: события, их возникновение и
Обработка событий
Обработка событий
Теперь самое время рассмотреть один ключевой вопрос Web-программирования: события, их возникновение и обработка.
Понятие события и его обработки
Рассматривая примеры Web-сценариев, мы исходили из предположения, что они выполняются при загрузке
Журнал событий
Журнал событий
Служба обеспечивает запись сообщений в стандартные журналы Windows (Система, Приложения, Безопасность), просмотреть которые можно при помощи оснастки eventvwr.msc. Далее в этой книге оснастка Просмотр событий (eventvwr.msc) будет описана подробней. Служба Журнал событий
Просмотр событий
Просмотр событий
С помощью оснастки Просмотр событий реализуется возможность просмотра трех системных журналов Windows XP, каждый их которых содержит сведения о том или ином компоненте компьютера: о приложениях, установленных на нем, о работе системных компонентов и о
Журнал событий
Журнал событий
С помощью данной политики можно настроить параметры стандартных журналов системы, доступ к которым можно получить с помощью оснастки Просмотр событий. Например, с помощью данной политики можно определить максимальные размеры файлов стандартных журналов
1.1.9. Обработчики событий
1.1.9. Обработчики событий
Обработчики события методы объекта. Это означает, что они должны быть методами класса, а не обычной процедурой или функцией (первый параметр должен быть Self). Для наиболее употребимых обработчиков предназначен следующий тип:TNotifyEvent = procedure(sender: TObject)
1.1.10. Сигнализаторы событий
1.1.10. Сигнализаторы событий
Сигнализаторы событий требуются для указания обработчику события, что возникло указанное событие, что бы обработчик события смог бы выполнить свои действия. Сигнализаторы обычно виртуальные или динамические методы класса (подобно методу Click)
Программирование обработки событий
Программирование обработки событий
Как видно из табл. 10.1, формы и элементы управления могут отвечать на многие события. Но когда форма действительно отвечает на какое-нибудь конкретное событие? Только тогда, когда она имеет соответствующую процедуру для этого события.
Глава 16. VBA-программирование в Excel.
Глава 16. VBA-программирование в Excel.
В этой главе …~ Что такое объектная модель Excel~ Управление ячейками с использованием объектов диапазонов~ Создание собственных функций для использования в формулах рабочих листов~ Использование встроенных функций Excel в VBA-коле~ Работа с
8.2. Синтаксис планировщика событий
8.2. Синтаксис планировщика событий
MySQL 5.1.6 и позже обеспечивает несколько инструкций SQL для работы с планируемыми событиями:Новые события определены, используя инструкцию CREATE EVENT.Определение существующего события может быть изменено посредством инструкции ALTER EVENT.Когда
8.4. Состояние планировщика событий
8.4. Состояние планировщика событий
Информация относительно состояния планировщика события для отладки и целей поиска неисправностей может быть получена следующим образом:В MySQL 5.1.11 версиях -debug Вы можете использовать инструкцию SHOW SCHEDULER STATUS.Важно: эта инструкция была
8.6. Ограничения планировщика событий
8.6. Ограничения планировщика событий
Этот раздел вносит в список ограничения планирования событий в MySQL.В MySQL любая таблица, вызванная в инструкции действия события должна быть полностью квалифицирована именем схемы, в которой это происходит (то есть, как schema_name.table_name
4.3.2. Планирование событий
4.3.2. Планирование событий
Для планирования события, которое может состояться в определенный день, предварительно следует выполнить два действия: выбрать календарь, щелкнув по его имени мышью в боковой панели, и выбрать один из трех режимов просмотра: день, неделя, месяц,
Добрый день!
Вопрос от новичка в vba. Не могу разобраться куда писать обработчики пользовательских событий от форм пользователей.
Создаю форму UserForm1. В код формы пишу событие Public Event event1(). Здесь же создаю обработчик стандартного события Click и в него вписываю RaiseEvent event1.
UserForm1(Code):
Код |
---|
Public Event Event1() Private Sub UserForm_Click() RaiseEvent Event1 Debug.Print "Click" End Sub |
Код обработчика события Event1 планирую простейший:
Если запустить форму, без использования обработчика события Event1, все работает. Форма появляется, нажимаешь по ней мышкой, в окне Immediate пишется «Click». Работает как положено. Запускаю форму с того же Immediate командой UserForm1.Show
И вот тут начинается вся сложность у меня… Куда написать обработчик события Event1?
Писал обработчик сюда же в код формы (UserForm1(Code)):
и вариант с именем как в событии Click
Код |
---|
Private Sub UserForm_Event1() Debug.Print "Event1" End Sub |
и вариант c оригинальным именем формы UserForm1
Код |
---|
Private Sub UserForm1_Event1() Debug.Print "Event1" End Sub |
Не работает.
Пытался запустить форму через переменную. В модуле нельзя создавать переменные с WithEvents, говорить используй только в модулях классов.
Создал класс Class1. В его коде создал переменную. Там же появилось в выпадающем списке событие формы, на которую ссылается переменная. Выбрал. Автоматически создался обработчик события Event1. Добавил в него Debug.Print «Event1»
Код |
---|
Public WithEvents f As UserForm1 Private Sub f_Event1() Debug.Print "event1" End Sub |
Что делать дальше, что бы заработал обработчик? Не могу понять… Суть простая — запускаешь, допустим, через Immediate UserForm1.Show форму и работают оба события — сначала стандартное Click, затем пользовательское Event1. Что с шаблоном класса Class1 делать дальше, что бы при запуске UserForm1 работало и Event1?
Интересует в общем — как обрабатывать ПОЛЬЗОВАТЕЛЬСКИЕ события форм и классов. Где допускается создавать обработчики пользовательских событий?
Стандартные обработчики, как я понял, создаются непосредственно в объекте формы. Можно ли создать свое событие (не стандартное), что бы оно так же было в выпадающем списке событий формы (Click, DblClick,Activate,Deactivae,MyEvent1, и так далее) Можно ли обработчики стандартных событий (Click, DblClick) помещать не в с самой форме?
Может посоветуете литературу или ресурс, где можно данные вопросы выяснить? Сколько перечитал информации, везде только пишут о том, как создавать обработчики стандартных событий. Может в формах нельзя создавать собственные события? Но допускается же надпись Public Event Event1(), причем только Public. Тогда зачем?…
События объекта Excel.Application
Объект Excel.Application может обрабатывать 21 событие, возникающие при работе с теми или иными объектами приложения Excel. Почти половина из этих событий возникает в процессе работы с объектом Workbook, другая половина событий связана с такими объектами, как страница документа (объект Sheet ) и окно (объект Window ). Практически все события, за исключением одного события NewWorkBook, могут быть обработаны на двух уровнях — объектом Application и объектом Workbook. Но прежде чем поговорить, о том, какие события может обрабатывать объект Application, в каких случаях следует проводить обработку события на уровне объекта Application, а в каких — на уровне объекта Workbook, давайте разберемся, как заставить объект Excel.Application вообще реагировать на события.
Создание объекта Application, реагирующего на события
Для всех приложений Office 2000 соответствующие объекты Application хотя и могут реагировать на события, но появляются как объекты без событий. И нужно приложить некоторые усилия, чтобы создать новый объект Application With Events, который может реагировать на события. Причина возникающих сложностей кроется в логике построения программного проекта, изначально принятой в Office. Дело в том, что обработчики событий, возникающих при работе с теми или иными объектами, следует размещать в специальных модулях — обработчиках событий. Для большинства стандартных объектов Office эти модули создаются автоматически в момент создания основного объекта. Так, например, при создании документа в его проекте автоматически создается модуль, обрабатывающий события этого документа, — для Excel это модуль с именем «ЭтаКнига» (ThisWorkbook). Только в этом модуле и можно создать обработчики событий объекта Workbook и всех объектов, реагирующих на события, например, элементов управления, встраиваемых непосредственно в документ.
Объект Application, единый для всех рабочих книг, по понятным причинам не вписывается в эту общую схему и для него такой модуль автоматически не создается, потому, естественно, эту работу приходится выполнять программисту.
Для того чтобы заставить реагировать на события объект Excel.Application, необходимо выполнить четыре шага:
- Создать модуль, задающий собственный класс для объекта Excel.Application, в котором можно будет размещать обработчики возникающих событий. Устроен этот класс очень просто и состоит в момент создания из одной строчки, поскольку класс не имеет методов и имеет ровно одно свойство, задающее объект Application с событиями. Конечно, позже этот класс будет пополняться обработчиками событий. Вот как выглядит на этапе создания описание этого класса, которому я в своем примере дал имя AppWithEvents.
Option Explicit 'Класс, описывающий объект Application With Events. 'Класс не имеет методов, задается одним свойством. Public WithEvents ExApp As Application
- Следующее, что необходимо сделать — это определить объект вновь созданного класса AppWithEvents. И эта задача решается в одну строчку. Объявление объекта я поместил в раздел объявлений созданного ранее стандартного модуля. Заметьте, необходимо не только объявить объект, но и создать его, используя спецификатор New.
Public AppWithEv As New AppWithEvents
- Третьим шагом является связывание двух объектов Application, стандартного и созданного объекта, умеющего реагировать на события. По-видимому, лучшим местом, где следует осуществить связывание, является обработчик события Open того документа, в котором описан класс AppWithEvents. Тогда после открытия этого документа и вплоть до его закрытия Excel будет реагировать на события, связанные с объектом Excel.Application. Вот как осуществляется связывание:
Private Sub Workbook_Open() 'Связывание двух объектов Application - 'стандартного и реагирующего на события. Set AppWithEv.ExApp = Excel.Application End Sub
- На этом шаге созданный класс AppWithEvents можно расширить, добавив в него обработчики событий объекта Application. Я приведу пока текст только одного обработчика, который обрабатывает событие NewWorkBook, возникающее при создании новой книги.
Private Sub ExApp_NewWorkbook(ByVal Wb As Workbook) 'Обработка события - создание новой книги. Static Num As Integer Num = Num + 1 MsgBox ("Число вновь созданных книг - " & Num _ & vbCrLf & "Новая книга - " & Wb.Name _ & " открыта в " & Time) End Sub
Вот как выглядит сообщение, появляющееся при открытии новой книги:
Рис.
3.2.
Сообщение об открытии новой книги
События, связанные с рабочей книгой
В нижеследующей таблице 1 дана сводка всех событий, которые возникают при работе с рабочими книгами — объектами Workbook, и которые могут быть обработаны объектом Application.
Событие | Когда возникает | Параметры события |
---|---|---|
NewWorkbook(Wb As Workbook) | При создании новой книги. Единственное событие этой группы, которое может обработать только объект Application. | Обработчику события передается объект Wb, представляющий вновь созданную книгу. |
WorkbookActivate(Wb As Workbook) | Книга становится активной. | Вновь активированная книга передается обработчику события в качестве параметра. |
WorkbookAddinInstall(Wb As Workbook) | При установке рабочей книги в качестве AddIn. | Рабочая книга, представляющая AddIn. |
WorkbookAddinUninstall(Wb As Workbook) | Отменяется установка рабочей книги в качестве AddIn. Закрытие книги при этом не происходит. | Рабочая книга, представляющая AddIn. |
WorkbookBeforeClose(Wb As Workbook, Cancel As Boolean) | При попытке закрыть рабочую книгу, но до того, как она будет закрыта. | Параметр Wb задает закрываемую книгу. Параметр Cancel позволяет отменить закрытие, если в обработчике события его значение будет установлено как True. |
WorkbookBeforePrint(Wb As Workbook, Cancel As Boolean) | При попытке распечатать содержимое рабочей книги, но до того, как произойдет печать. | Параметр Wb задает печатаемую книгу. Параметр Cancel позволяет отменить печать, если в обработчике события его значение будет установлено как True. |
WorkbookBeforeSave(Wb As Workbook, SaveAsUI As Boolean, Cancel As Boolean) | При попытке сохранить содержимое рабочей книги, но до того, как произойдет сохранение. | Параметр Wb задает сохраняемую книгу. Параметр Cancel позволяет отменить сохранение, если в обработчике события его значение будет установлено как True. Параметр SaveAsUI показывает, как идет сохранение, его значение равно true, если при сохранении открывается диалоговое окно «Сохранить как «. |
WorkbookDeactivate(Wb As Workbook) | Книга перестает быть активной, поскольку активной становится другая книга. | Деактивированная книга передается обработчику события в качестве параметра. |
WorkbookNewSheet(Wb As Workbook, Sh As Object) | При добавлении новой страницы в рабочую книгу. | Объект Wb задает книгу, а Sh — страницу, добавленную в эту книгу. |
WorkbookOpen(Wb As Workbook) | При открытии уже существующей рабочей книги. | Обработчику события передается объект Wb, представляющий вновь открытую книгу. |
Практически все события, происходящие с объектом Workbook, могут быть обработаны на двух уровнях — объектом Application и самим объектом Workbook. Разница лишь состоит в том, что если у объекта Application есть, например, событие WorkbookOpen, то у объекта Workbook есть событие Open. При возникновении данного события операционная система посылает соответствующее сообщение двум объектам — Application и Workbook. Обработчику сообщения WorkbookOpen передается параметр Wb, задающий открываемую книгу. Понятно, что при посылке аналогичного сообщения объекту Workbook передавать этот параметр не имеет смысла, поскольку он и так знает сам себя, так что обработчик события Open объекта Workbook параметров не имеет.
Возникает естественный вопрос, в каких случаях следует вести обработку события, происходящего с объектом Workbook, на уровне объекта Application. Ответ понятен — в тех случаях, когда обработчик события выполняет действия, общие для всех рабочих книг. В тех же случаях, когда предполагается специфическая обработка события, характерная только для данной конкретной книги, обработчик события связывается с объектом Workbook. Что происходит, если обработка одного и того же события предусмотрена на двух уровнях? В этом случае вначале выполнится обработчик события, связанный с объектом Workbook, — он выполнит специфическую для данной книги обработку, а потом начнет работать обработчик этого же события, связанный с объектом Application, выполняющий ту часть работы, которая является общей для всех рабочих книг.
Приведу пример, в котором предусмотрена общая для всех рабочих книг обработка события BeforeSave:
Private Sub ExApp_WorkbookBeforeSave(ByVal Wb As Workbook, _ ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim YesNo As Variant YesNo = MsgBox("Вы действительно хотите сохранить этот документ?", vbYesNo) If YesNo = vbNo Then Cancel = True End Sub
Предупреждающее сообщение будет появляться для всех рабочих книг. Рассмотрим теперь пример, когда обработка события BeforePrint предусмотрена на двух уровнях:
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'Обработка события - печать содержимого книги. MsgBox ("Эту книгу - " & ThisWorkbook.Name _ & " печатать запрещено!") Cancel = True End Sub Private Sub ExApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean) 'Обработка события - печать содержимого книги. If Wb.ActiveSheet.Name = "Лист1" Then MsgBox ("Эту страницу книги - " & Wb.Name _ & " печатать запрещено!") Cancel = True End If End Sub
Специальный обработчик события объекта Workbook книги BookOne запрещает печать только этой книги, а общий для всех книг обработчик того же события, но находящийся в объекте Application, запрещает печать только первого листа, но для всех рабочих книг. Вот как выглядит сообщение, выданное для книги BookOne общим обработчиком при попытке распечатать содержимое первого листа книги:
События, связанные с объектом Sheet
Ряд событий, которые возникают в процессе работы со страницами той или иной рабочей книги, также могут быть обработаны на уровне объекта Application. Естественно, что эти события могут быть обработаны и на более низких уровнях — как на уровне объекта Workbook, так и на следующем уровне объектами, задающими саму страницу — Worksheet и Chart. Понятно, что на самом верхнем уровне задается обработка, общая для всех страниц всех книг, на следующем уровне обработка, общая для страниц конкретной книги, и на нижнем уровне — обработка, специфическая для данной страницы. В таблице 3.4 дана сводка событий, связанных с объектом Sheet, обрабатываемых на уровне объекта Application.
Событие | Когда возникает | Параметры события |
---|---|---|
SheetActivate(Sh As Object) | Страница становится активной. | Вновь активированная страница передается обработчику события в качестве параметра. |
SheetBeforeDoubleClick(Sh As Object, Target As Range, Cancel As Boolean) | При двойном щелчке левой клавиши мыши на рабочей странице, но до того, как выполнится макрос, задающий реакцию на щелчок. Событие не возникает на Chart-страницах. | Первый параметр передает обработчику события объект Sh, задающий рабочую страницу, на которой был произведен двойной щелчок. Второй параметр Target возвращает ячейку (объект Range ), ближайшую к указателю мыши в тот момент, когда был произведен щелчок. Если в обработчике события изменить значение параметра Cancel на True, то отменится выполнение макроса, задающего реакцию на двойной щелчок. |
SheetBeforeRightClick(Sh As Object, Target As Range, Cancel As Boolean) | Аналогично двойному щелчку, но при нажатии правой клавиши мыши. | Параметры сохраняют смысл, описанный для обработчика событий двойного щелчка. |
SheetCalculate(Sh As Object) | При перевычислениях рабочей страницы или при любых изменениях данных, отображаемых на диаграмме страницы диаграмм. | В зависимости от того, на странице какого типа произошло событие, параметр Sh представляет либо объект Workbook либо объект Chart. |
SheetChange(Sh As Object, Target As Range) | При изменениях в ячейках рабочей книги, инициированные пользователем или внешней ссылкой. Не возникает для Chart-страниц. | Параметр Sh задает объект WorkSheet — страницу, в ячейках которой произошли изменения. Параметр Target задает область изменения — объект Range. |
SheetDeactivate(Sh As Object) | Страница перестает быть активной, поскольку активной становится другая страница. | Деактивированная страница передается обработчику события в качестве параметра. |
SheetFollowHyperlink(Sh As Object, Target As Hyperlink) | При щелчке по гиперссылке на рабочей странице. Не возникает для Chart-страниц. | В качестве параметров обработчику события передаются два объекта, представляющие рабочую страницу и гиперссылку, задающую переход. |
SheetSelectionChange(Sh As Object, Target As Range) | При изменении области выделения рабочей страницы. Не возникает для Chart-страниц. | Параметр Sh задает объект WorkSheet -страницу, содержащую новую область выделения. Параметр Target задает новую область выделения — объект Range. |