Читаем без скачивания VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
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.
2. В окне программного кода формы выберите объект, для которого вы хотите создать процедуру обработки события.
Объект выбирается из раскрывающегося списка объектов вверху слева в окне программного кода формы (рис. 10.25).
3. Выберите событие, для которого нужно создать программный код.
На этот раз используйте раскрывающийся список процедур, размещенный в окне программного кода вверху справа.
Рис. 10.25. Выбор элемента управления в окне программного кода формы перед началом создания процедуры обработки события
Как только из раскрывающегося списка процедур будет выбрано событие, VBA немедленно перенесет вас прямо к процедуре его обработки. Если для события еще не создано никакого программного кода, VBA создаст для вас заготовку процедуры, разместив курсор ввода в пустой строке между оператором объявления процедуры и ее завершающим оператором (см. рис. 10.25). Если процедура обработки события уже содержит программный код, VBA просто поместит курсор ввода в его первую строку.
Вам не стоит беспокоиться об объявлении процедур, так как 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) является квинтэссенцией всех событий. Вам приходится щелкать на пиктограммах, чтобы выбрать их, щелкать в документах - чтобы позиционировать точку ввода, в меню - чтобы открыть их, и на кнопках - чтобы активизировать связанные с ними функции. А раз щелчки столь часто используются в пользовательском интерфейсе 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: