VBA для чайников
Шрифт:
2. В окне программного кода формы выберите объект, для которого вы хотите создать процедуру обработки события.
Объект выбирается из раскрывающегося списка объектов вверху слева в окне программного кода формы (рис. 10.25).
3. Выберите событие, для которого нужно создать программный код.
На этот раз используйте раскрывающийся список процедур, размещенный в окне программного кода вверху справа.
Рис. 10.25. Выбор элемента управления в окне программного кода формы перед началом создания процедуры обработки события
Как только из раскрывающегося списка процедур
Вам не стоит беспокоиться об объявлении процедур, так как VBA делает это автоматически, когда вы выбираете событие в окне программного кода
Рис. 10.26 Только что созданная заготовка процедуры обработки события в окне редактора Visual Basic
Как влдно из рис. 10.26, синтаксис процедур обработки событий не отличается от синтаксиса обычных процедур типа Sub. Единственное, что отличает процедуру обработки события, так это ее имя. Чтобы процедура обработки события вообще функционировала, ее имя должно состоять из имени объекта (формы или элемента управления), за которым следуют символ подчеркивания и официальное имя события VBA. Посмотрите на следующие примеры:
Private Sub cmdCalcuiateSquareRoot_Click
End Sub
Private Sub UserForm_Activate
End Sub
Private Sub sclVolumeControl_Change
End Sub
Единственный случай, когда возникают проблемы с именем процедуры обработки события, - когда имя объекта, которому соответствует процедура, изменяется после создания процедуры. VBA не меняет при этом имя процедуры автоматически, поэтому вы должны открыть окно программного кода и привести имя процедуры обработки события в соответствие с новым именем элемента управления.
Например, предположим, что вы создали процедуру обработки события Click (Щелчок) для кнопки, которой было автоматически присвоено имя CommandButtonl. Тогда именем процедуры будет CommandButtonl_Click. Спохватившись, вы изменили имя кнопки на более информативное, например cmdВернутьИзКорзины. Но после этого, до тех пор пока вы не измените оригинальное имя процедуры на cmdВернутьИзКорзины_Сliск, соответствующая кнопка во время выполнения будет просто торчать в форме тихо и безответно, независимо от того, сколько раз вы на ней щелкнете.
Поскольку при изменении имени кнопки VBA не удаляет соответствующие этой кнопке процедуры, вам не нужно создавать процедуру вновь, а нужно только изменить ее имя. Можно сделать и по-другому: начать новую процедуру обработки события для кнопки, а затем с помощью команд Cut (Вырезать) и Paste (Вставить) перенести программный код из оригинальной процедуры в новую.
Щелкните здесь...
В Windows щелчок ( Click) является квинтэссенцией всех событий. Вам приходится щелкать на пиктограммах, чтобы выбрать их, щелкать в документах - чтобы позиционировать
Очевидно, что каждая кнопка должна иметь процедуру обработки события Click, если вы хотите, чтобы кнопка делала что-нибудь полезное после щелчка на ней. Следующая процедура обработки события просто считает и отображает на экране число щелчков на кнопке:
Private Sub cmdCountClicks_Click
' Объявление переменней intCount статической сохранит
' ее значение в промежутках между вызовами процедуры
Static intCount As Integer
intCount - intCount + 1
cmdCount Clicks.Caption = "Вы щелкали на этой кнопке " _
& intCount & " р а з ( а )."
End Sub
Представленный здесь программный код достаточно ясен. При каждом выполнении процедуры, которое происходит только после щелчка пользователя на кнопке, знамение переменной intCount увеличивается на 3. Это значение используется в строке, которая отображается на кнопке с помощью свойства Caption кнопки. Кстати, объявление переменной intCount как статической заставляет VBA сохранять значение этой переменной между вызовами этой процедуры обработки события. Если объявить переменную с помощью ключевого слова Dim, переменная будет инициализироваться при каждом вызове процедуры. Вот процедура обработки события для кнопки с именем cmdMoveThisForm:
Private Sub cmdMcveThisForm_Click
Move(Left -24), (Top -24)
End Sub
Если вам это интересно, после щелчка пользователя на кнопке эта процедура смещает форму на 24 единицы вверх и на 24 единицы влево. В процедуре всего одна строка выполняемого программного кода, где метод Move используется без прямой ссылки на объект, - VBA предполагает, что ссылка указывает на главный объект формы, т.е. на саму форму. Если нужно вместо формы переместить содержащуюся в ней кнопку, используйте cmdMoveThisForm. Move, чтобы указать этот объект как целевой. Точно так же, если нет явной ссылки на объект, то подразумевается, что свойства Left и Тор относятся к форме.
Эти два примера довольно тривиальны, но в то же время они хорошо иллюстрируют, что процедуры обработки событий выглядят и работают точно так же, как и любые другие процедуры.
Процедуры обработки событий особые потому, что VBA выполняет их автоматически при наступлении определенного события. Но поскольку в остальном процедура обработки события ничем не отличается от обычной процедуры, вы можете вызывать ее из программного кода как обычную. Просто выделив имя процедуры в отдельный оператор, например: