Представьте, что вы Excel.
У вас открыт Workbook
, а Worksheet
активен.Теперь пользователь щелкает куда-то, и Selection
меняется.Чтобы это произошло, нужно запустить много низкоуровневого кода, не относящегося к VBA, но в тот или иной момент это происходит (псевдокод) где-то в кишках Worksheet
объекта:
RaiseEvent SelectionChange(ActiveCell)
Это вызывает событие Worksheet.SelectionChange
:
Когда это событие возникает, если для этого события есть обработчик , именно тогда оно будет вызвано.Этот обработчик должен быть подключен - вы можете сделать это самостоятельно, используя объектную переменную WithEvents
, но модули документов в Excel упрощают подключение обработчика - просто перейдите к модулю Worksheet
, который выдля обработки событий рабочего листа выберите Worksheet
в раскрывающемся меню панели слева ...
... и VBE создаст для вас процедуру-обработчик -обратите внимание на содержимое двух выпадающих списков:
Процедура обработчика названа очень специфическим образом:
LeftSideDropdownValue_RightSideDropdownValue
"Значение раскрывающегося списка слева""это интерфейс , для которого вы хотите реализовать член;«раскрывающееся значение справа» - это конкретный элемент, который вы внедряете.
Если вы поместите курсор внутри своей процедуры, в раскрывающемся списке слева будет указано (General)
- это означает, что это просто еще одна процедура,и если ничто не вызывает его, то это просто еще одна неиспользованная процедура, которая также может не существовать.
Итак, вы приложение Excel и открываете книгу.То же самое происходит: много низкоуровневого кода, не относящегося к VBA, должны запускаться, поскольку куча объектов десериализуется из файла книги с поддержкой макросов .xlsm, загруженного с диска, и когда все идет хорошо, это происходит (псевдокод) где-то в открытых Workbook
кишках объекта:
RaiseEvent Open
Это вызывает событие Workbook.Open
:
Еще раз мымог бы объявить переменную объекта WithEvents
и подключить обработчик самостоятельно, но проект VBA, размещенный в Excel, всегда будет иметь модуль документа Workbook
, который уже делает это для нас - поэтому для обработки события Workbook.Open
,мы можем перейти к модулю ThisWorkbook
, выбрать Workbook
из раскрывающегося списка слева и заставить VBE автоматически сгенерировать правильно сформированный для нас обработчик:
Private Sub Workbook_Open()
End Sub
Опять же, причина, по которой VBA знаетэта процедура обрабатывает событие Workbook.Open
, потому что имя говорит так:
[Interface]_[Member]
Если мы пойдем и изменим имя на что-то еще, мы сломаем эту ссылку, и мы знаем, что ссылка сломана, потому чтоКроме того, в раскрывающемся меню слева будет 1067 *, а не Workbook
.
. Эта специальная схема именования также является причиной, по которой вам следует избегать подчеркивания в именах собственных процедур: они создают процедуры выглядят как обработчики событий, но это не так.В некоторых конкретных дополнительных сценариях использование подчеркивания в именах элементов может даже привести к ошибкам компиляции.Лучше воспользуйтесь хорошей привычкой на раннем этапе, придерживаясь простых PascalCase
для имен процедур.
Если мы пойдем и изменим список параметров любым способом, который делает его несовместимым с объявлением события, мы получим компиляциюошибка:
Вы можете безопасно изменять имена параметров (хотя я не могу придумать какой-либо веской причины для этого), но типы данных параметров и их порядок не могутбыть измененным.
См. все, что вы когда-либо хотели знать о событиях для получения дополнительной информации (я написал эту статью).