VBA для чайников
Шрифт:
Но, как говорится, содрать с капусты листья можно многими способами. В нашем случае есть варианты- события Initialize (Инициализация) и Activate (Активизация) формы.
Программный код, помещенный в процедуры обработки этих событий, выполняется автоматически, когда случаются соответствующие события. Выбрать между этими событиями помогут следующие правила.
* Используйте событие Initialize для программного кода, который должен выполняться только при первой загрузке формы.
* Используйте событие Activate для программного кода, который должен выполняться при каждом отображении формы на экране (включая и первое отображение).
Создание программного кода для процедур обработки событий обсуждается ниже, в разделе "Главные события".
Используйте метод Hide (Скрыть), чтобы закрыть форму и таким образом получить возможность вернуться в документ VBA-приложения или активизировать другую
FormErly.Hide
Правда, метод Hide можно использовать не в любом месте программы. Если форма модальная, метод Hide нужно поместить в процедуру обработки события, принадлежащую самой форме.
Как упоминалось раньше в настоящей главе, если открыта модальная форма, выполняться могут только процедуры, связанные с этой формой.
И кстати, при вызове метода Hide в процедуре обработки события, принадлежащей этой форме, имя формы указывать не требуется - VBA достаточно сообразителен, чтобы понять, что в данном случае метод Hide принадлежит именно этой форме. Поэтому в процедуре обработки события, принадлежащей форме, можно просто напечатать Hide и эта форма исчезнет.
Чаше всего оператор Hide размещают в конце процедуры обработки события Click (Щелчок) для КНОПОК ОК, Отмена или Закрыть. Примеры вы найдете ниже, в разделах
"Добавление кнопок Закрыть и Отмена" и "Программирование кнопки ОК".
Скрытая форма не удаляется из памяти, вы сможете отобразить ее снова без лишних задержек с помощью метода Show в любое время.
Если известно, что форма больше в программе не понадобится, уничтожьте ее совсем, удалив из памяти. В небольших VBA-программах в этом нет необходимости, но когда ваши программы станут большими и память будет как награда, уничтожение ненужных форм приобретет очевидный смысл.
Как и для загрузки формы, для выгрузки формы из памяти используется не метод, я оператор Unload Formation.
Выгрузка формы удаляет ее и с экрана, если до этого форма была видима.
Если известно, что форма больше в программе не понадобится, замените метод Hide в процедурах обработки событий формы на оператор Unload. В этом случае оператор Unload Me эквивалентен оператору Unload имя_формы, поскольку ключевое слово Me представляет текущую форму.
Однако, в отличие от метода Hide, оператор Unload применим и к модальным формам, которые не присутствуют на экране. С помощью оператора Unl oad, размещенного в главной части программы (т.е. в процедуре, не связанной с формами), можно выгружать любые формы, в том числе и скрытые модальные формы.
Главные события
Когда выполняется процедура типа Sub, не отображающая форм, ваш программный код полностью контролирует, что и когда делает программа. Но если на экране отображается форма, программа переходит в каком-то смысле в пассивное состояние, ожидая инструкций от пользователя.
После каждого нажатия клавиши, перемещения мыши или щелчка на кнопке генерируется программное событие. Ваша программа регистрирует каждое такое событие и проверяет, не содержит ли программный код формы процедуру, связанную с этим событием. Если подходящей процедуры нет, событие пройдет для программы бесследно. Но если форма имеет процедуру, соответствующую событию, то программа сразу же оживет и честно выполнит эту процедуру.
Процедура обработки события может делать все, что и любая другая процедура: вычислять значения переменных, манипулировать свойствами и методами объектов, загружать и отображать другие формы. После завершения выполнения процедуры обработки события контроль возвращается к форме. Программа перейдет в состояние ожидания следующего события.
Формы VBA и элементы управления в них могут распознавать самые различные события. (На жаргоне VBA, когда говорится, что объект "имеет" события, подразумевается, что объект может регистрировать и распознавать эти события.) У форм и элементов управления есть одинаковые события, но набор событий каждого объекта индивидуален. Часто встречающиеся события приведены в табл. 10.1.
Таблица 10.1. Избранные события форм и элементов управления
Событие | Объекты, которые распознают событие | Когда происходит событие |
Activate | Формы | Каждый раз, когда форма активизируется (получает фокус ввода) |
AddControl | Формы, фреймы и формы с множеством страниц | При |
AfterUpdate | Все "действующие" элементы управления, кроме кнопок | После установки нового значения для элемента управления, в момент перехода от данного элемента управления к другому |
Change | Все "действующие" элементы управления, кроме кнопок | При изменении значения свойства Value элемента управления |
Click | Формы и все типы элементов управления | После щелчка кнопкой мыши на объекте |
DblClick | Формы и все типы элементов управления | После двойного щелчка кнопкой мыши на объекте |
DropButtonClick | Текстовые поля и поля со списком | При появлении раскрывающегося списка (после щелчка на кнопке раскрытия или нажатия клавиши <F4>) |
Enter | Все типы элементов управления | Непосредственно перед тем, как элемент управления получит фокус ввода от другого элемента управления в той же форме |
Error | Формы и все типы элементов управления | Когда возникает ошибка, но информация о ней не может возвратиться программе |
Exit | Все типы элементов управления | Непосредственно перед тем, как фокус ввода перейдет от данного элемента управления к другому в той же форме |
KeyUp, KeyDown, Keypress | Формы и все типы элементов управления | При нажатии или отпускании кнопки |
Layout | Формы, фреймы и формы с множеством страниц | При изменении размеров объекта |
RemoveControl | Формы, фреймы и формы с множеством страниц | При удалении элемента управления из объекта во время выполнения формы |
Scroll | Формы, фреймы и формы с множеством страниц, а также текстовые поля, списки и поля со СПИСКОМ | При изменении положения бегунка полосы прокрутки |
Zoom | Формы, фреймы и формы с множеством страниц | При изменении масштаба объекта (значения свойства Zoom) |
Программирование обработки событий
Как видно из табл. 10.1, формы и элементы управления могут отвечать на многие события. Но когда форма действительно отвечает на какое-нибудь конкретное событие? Только тогда, когда она имеет соответствующую процедуру для этого события. Процедуры обработки событий должны быть кем-то созданы - в данном случае вами.
Создание процедуры обработки события не отличается от создания любой другой процедуры в VBA. Нужно только знать, куда поместить соответствующие операторы. Программный код для процедуры обработки события, как и весь остальной связанный с формой программный кол, в редакторе Visual Basic размешается в окне программного кода этой формы.
Следовательно, процедуры обработки событий для всех элементов управления в форме, как и для самой формы, создаются в окне программного кода формы. Поэтому, перед тем как программировать соответствующие событиям процедуры, выполните следующие шаги.
1. Откройте окно программного кода формы.
Двойной щелчок на форме или любом ее элементе управления - самый короткий путь для этого. Иначе можно выделить форму и выбрать View=Code из контекстного (вызываемого щелчком правой кнопки мыши) меню для формы или элемента управления, с которыми вы собираетесь работать, или же нажать <F7>, когда форма выделена в ее окне UserForm.