2 семестр / Программирование на VBA
.pdfРис. 24 ü запишите в модуле рассматриваемой формы следующую процедуру (или
выберете в Procedure событие Activate):
1Private Sub UserForm_Activate()
2MsgBox ("Событие: Activate")
3End Sub
üснова запустите форму на выполнение командой Run/Run Sub/UserForm. После появления формы на экране вы увидите сообщение о том, что произошло событие Activate (рис. 25);
Рис. 25
üвыберите в Procedure событие Terminate;
üзапишите после заголовка процедуры UserForm_Terminate следующий
оператор
2MsgBox("Событие: Terminate")
üзапустите форму на выполнение командой Run/Run Sub/UserForm. После появления формы на экране щелкните на ней мышью, на экране появится сообщение (рис. 26).
Рис. 26
Если даже вам не часто будет нужно использовать подобное событие для формы, не забывайте о такой возможности. А еще лучше поступайте следующим образом. Всегда используйте это событие на случай, когда пользователь ваших форм при попытке щелкнуть на каком-либо элементе управления не совсем точно позиционирует курсор мыши. Если при этом будет выполняться процедура обработки события Click для формы с выводом шутливого сообщения о недостаточной уверенности в действиях пользователя, с вашим приложением станет приятно работать. Вы также никогда не забудете о возможности
111
использовать это событие, когда для этого появятся серьезные причины.
Событие Initialize инициализируется при загрузке формы при помощи оператора Load или метода Show. При выполнении команды Run/Run Sub/UserForm это событие не инициализируется. Это событие следует использовать при первой загрузке формы для установки каких-либо свойств формы и ее элементов управления. В следующем примере (листинг 21) для этого события устанавливается свойство формы BackColor.
Задание 3. Создайте форму, изменяющую фон цвета на событие Click. Для этого:
üвыберите команду Insert/UserForm (Вставка/UserForm);
üдважды щелкните на форме в режиме разработки и введите следующие процедуры событий UserForm2 (листинг 21):
Листинг 21 – Процедуры событий UserForm2
1 Dim sRED, sGREEN, sBLUE 'переменные для задания цвета формы
2
3'Процедура обработки события Initialize
4'инициализируется один раз: при загрузке
5Private Sub UserForm_Initialize()
6' задаем начальный цвет формы
7sRED = 100
8sGREEN = 100
9sBLUE = 200
10UserForm2.BackColor = RGB(sRED, sGREEN, sBLUE)
11End Sub
12
13'Процедура обработки события Click
14'При каждой инициализации меняет цвет формы. При недопустимых
15'значениях sRED, sGREEN, sBLUE выдает ошибку времени исполнения
16Private Sub UserForm_Click()
17Dim i
18
19'Меняем цвет формы:
20sRED = sRED + 20
21sGREEN = sGREEN + 10
22sBLUE = sBLUE - 20
23i = RGB(SRED, SGREEN, SBLUE)
24UserForm2.BackColor = i
25UserForm2.Caption = "Цвет: " & Str(i) 'Изменить заголовок формы:
26End Sub
После вывода формы с именем UserForm2 на экран событие Click будет приводить к изменению цвета и заголовка формы.
В листинге 21 для установки свойства формы BackColor используется функция RGB, которая возвращает RGB-значение типа Long, используемое далее
112
для присвоения свойству UserForm2.BackColor. Синтаксис функции RGB: RGB(red, green, blue)
именованные аргументы: Red, Green, Blue – обязательные; тип: Variant (Integer); числа в диапазоне 0–255; представляют красный, зеленый и синий компоненты цвета).
Упражнение 2
Создайте форму, выводящую сообщения на события DblClick, Deactivate, Resize.
Элементы управления
Объект UserForm может содержать те же элементы управления, что и находящиеся в диалоговых окне Excel или других приложений Windows. Элементы управления (controls) – это элементы диалогового окна, которые дают возможность пользователю взаимодействовать с программой. Они включают в себя кнопки-переключатели, текстовые поля, линейки прокрутки, командные кнопки и так далее. В этом разделе вы познакомитесь со стандартными элементами управления, включенными в VBA, которые сможете добавлять в свои формы.
Каждый элемент управления – это объект с определенными свойствами, методами и событиями. Как и для формы, их содержащей, вы можете
устанавливать свойства элементов управления программным путем или посредством Properties Window Редактора VB. В программе вы можете присваивать или восстанавливать значения свойств элементов управления так же, как для любых других объектов.
В табл. 23 перечислены стандартные элементы управления, включенные в VBA, и описано назначение каждого элемента. Как видно из этой таблицы, к стандартным относятся практически все элементы управления, которые вам встречались в приложениях Windows. В зависимости от host-приложения VBA, в котором вы работаете, на панели Toolbox могут появляться дополнительные элементы управления, не перечисленные в табл. 23. Эти дополнительные элементы доступны через библиотеки элементов управления, поставляемые с каждым из host-приложений.
Таблица 23 – Стандартные элементы управления, включенные в VBA
Элемент |
Кнопка его |
Назначение |
управления |
создающая |
|
Label |
|
Позволяет создавать заголовки элементов управления, |
(надпись, |
|
которые не имеют собственных встроенных заголовков. |
метка) |
|
Используйте этот элемент для того, чтобы поместить на |
|
|
форму статический текст, например, инструкции, советы |
|
|
по заполнению других диалоговых элементов управления |
TextBox |
|
Окно редактируемого текста свободной формы для ввода |
(текстовое |
|
данных. Может быть одно- или многострочным |
поле) |
|
|
113
Элемент |
Кнопка его |
Назначение |
|
|
|
|
|
|
|
управления |
создающая |
|
|
|
|
|
|
|
|
ComboBox |
|
Этот |
элемент |
управления |
объединяет |
окно |
|||
(поле со |
|
редактирования и окно списка. Используйте, когда хотите |
|||||||
списком) |
|
предложить пользователю выбрать значение, но при этом |
|||||||
|
|
дать ему возможность ввести данные, отсутствующие в |
|||||||
|
|
списке. Вы можете также ограничить выбор только теми |
|||||||
|
|
значениями, которые появляются в ComboBox для |
|||||||
|
|
эмуляции ниспадающего списка |
|
|
|
||||
ListBox |
|
Отображает список значений, из которых пользователь |
|||||||
(список) |
|
может сделать выбор. Окна списка можно использовать, |
|||||||
|
|
чтобы дать возможность пользователю выбрать только |
|||||||
|
|
одно значение или же несколько |
|
|
|
||||
CheckBox |
|
Стандартный флажок (квадратное окно, содержащее, |
|||||||
(флажок) |
|
если элемент выбран, «галочку»). Используйте флажки |
|||||||
|
|
для выбора вариантов, которые не являются |
|||||||
|
|
взаимоисключающими |
|
|
|
|
|||
OptionButton |
|
Стандартная кнопка-переключатель (круглое окно, при |
|||||||
(переключа- |
|
выборе в центре него находится черная точка). |
|||||||
тель) |
|
Используйте |
OptionButton, |
когда |
пользователю |
||||
|
|
необходимо |
|
сделать |
выбор |
между |
|||
|
|
«включено/выключено», |
«истина/ложь». |
Кнопки- |
|||||
|
|
переключатели, как правило, объединяются вместе при |
|||||||
|
|
помощи рамки для создания группы переключателей |
|||||||
ToggleButton |
|
Выключатели служат для той же цели, что и флажки, но |
|||||||
(выключа- |
|
выводят |
установки |
в |
виде кнопки |
находящейся в |
|||
тель) |
|
«нажатом» или «отжатом» состоянии |
|
|
|||||
Frame |
|
Визуально и логически объединяет некоторые элементы |
|||||||
(рамка) |
|
управления (особенно флажки, переключатели и |
|||||||
|
|
выключатели). Используйте Frame, чтобы показать |
|||||||
|
|
пользователю, какие элементы управления в диалоговом |
|||||||
|
|
окне связаны между собой, или чтобы выделить группу |
|||||||
|
|
элементов управления, отделяя ее от остальных |
|||||||
|
|
элементов управления, находящихся в диалоговом окне |
|||||||
CommandBut |
|
Используйте кнопки для выполнения таких действий, как |
|||||||
ton |
|
Отмена (Cancel), Сохранить (Save), ОК и так далее. |
|||||||
(кнопка) |
|
Когда пользователь щелкает по кнопке, выполняется |
|||||||
|
|
VBA-процедура, закрепленная за данным элементом |
|||||||
|
|
управления |
|
|
|
|
|
|
|
TabStrip |
|
Этот элемент управления состоит из области, в которую |
|||||||
(набор |
|
следует помещать другие элементы управления (такие |
|||||||
вкладок) |
|
как текстовые поля, флажки и так далее) и полосы кнопок |
|||||||
|
|
табуляции. Используйте элемент управления TabStrip для |
|||||||
|
|
создания диалоговых вкладок, отображающих одни и те |
|||||||
|
|
же данные в различных категориях |
|
|
|||||
MultiPage |
|
Этот элемент управления состоит из нескольких страниц. |
114
Элемент |
Кнопка его |
Назначение |
|
управления |
создающая |
|
|
(набор |
|
Вы можете выбрать любую из них, щелкнув по |
|
страниц) |
|
соответствующей вкладке. Используйте |
элемент |
|
|
управления MultiPage для создания диалоговых окон с |
|
|
|
вкладками, такими, например, как диалоговое окно, |
|
|
|
появляющееся при выборе команды Tools/Options |
|
|
|
(Панели инструментов/Настройка) |
|
ScrollBar |
|
Элемент управления ScrollBar позволяет выбирать |
|
(полоса |
|
линейное значение, аналогично тому, как это можно |
|
прокрутки) |
|
сделать при помощи счетчика |
|
SpinButton |
|
Элемент управления SpinButton является специальной |
|
(счетчик) |
|
разновидностью текстового поля. Обычно счетчики |
|
|
|
используются для того, чтобы ввести число, дату или |
|
|
|
какие-либо иные последовательные величины, которые |
|
|
|
заведомо находятся в определенном интервале значений. |
|
|
|
Щелчок по указывающей вверх стрелке счетчика |
|
|
|
увеличивает значение в окошке, а щелчок по стрелке, |
|
|
|
направленной вниз, соответственно, уменьшает его. |
|
Image |
|
Элемент управления Image позволяет вывести на форме |
|
(рисунок) |
|
графическое изображение. Используйте Image для вывода |
|
|
|
графических изображений в любом из следующих |
|
|
|
форматов: *.bmp, *.cur, *.gif, *.ico, *.jpg, *.wmf. Вы |
|
|
|
можете обрезать и масштабировать графическое |
|
|
|
изображение, чтобы подобрать размер элемента Image, но |
|
|
|
только не редактировать графическое изображение. |
|
|
|
Можно даже написать специальную VBA-процедуру, |
|
|
|
выполняющуюся, если пользователь щелкнет по |
|
|
|
элементу управления Image. |
|
Обращение к элементам управления происходит, в основном, через их свойства и с помощью процедур обработки событий, написанных для каждого элемента. В табл. 24 перечислены наиболее часто используемые свойства элементов управления, которые могут понадобиться для работы с вашими VBA- программами – свойства, которые позволяют изменять заголовок, определять состояние элемента управления (то есть обнаруживать установки, выполненные пользователем) и так далее.
Таблица 24 – Наиболее часто используемые свойства стандартных
элементов управления
Свойство |
Где |
Описание |
|
|
|
|
применяется |
|
|
|
|
Accelerator |
CheckBox, Tab, |
Содержит символ, используемый, в качестве |
|||
|
CommandButto |
быстрой клавиши вызова, элемента управления. При |
|||
|
n, Label, Page, |
нажатии |
ALT+<клавиша |
быстрого |
вызова> |
|
OptionButton, |
происходит выбор элемента управления |
|
||
|
ToggleButton |
|
|
|
|
115
Свойство |
Где |
Описание |
|
|
|
|
|
применяется |
|
|
|
|
|
BackColor |
Все элементы |
Число, представляющее определенный цвет фона |
||||
|
|
элемента управления |
|
|
|
|
Caption |
CheckBox, |
Для надписи – текст, отображаемый элементом |
||||
|
CommandButto |
управления. Для других элементов управления – |
||||
|
n, Frame, Label, |
надпись, которая появляется на кнопке или вкладке |
||||
|
OptionButton, |
или рядом с рамкой, флажком или переключателем |
||||
|
ToggleButton, |
|
|
|
|
|
|
Page, Tab, |
|
|
|
|
|
|
UserForm |
|
|
|
|
|
Cancel |
CommandButto |
Задает кнопку отмены диалогового окна. При |
||||
|
n |
нажатии на эту кнопку или клавишу Esc диалоговое |
||||
|
|
окно исчезает. Только одна кнопка формы может |
||||
|
|
иметь данное свойство |
|
|
|
|
ControlTipTe |
Все элементы |
Устанавливает текст, который отображается в виде |
||||
xt |
управления |
всплывающей подсказки (ControlTip, называемой |
||||
|
|
также ToolTip), когда указатель мыши помещается |
||||
|
|
на элемент управления |
|
|
|
|
Default |
CommandButto |
Определяет заданную по умолчанию кнопку. Когда |
||||
|
n |
пользователь нажимает в процессе диалога клавишу |
||||
|
|
Enter, эта кнопка ведет себя так, как если бы по ней |
||||
|
|
щелкнули мышью |
|
|
|
|
Enabled |
Все элементы |
Хранит значение типа Boolean, определяющее |
||||
|
управления |
доступен или нет элемент управления. Если Enabled |
||||
|
|
имеет значение False, то элемент управления |
||||
|
|
продолжает отображаться в диалоговом окне, но не |
||||
|
|
может быть выбран |
|
|
|
|
ForeColor |
Все элементы |
То же самое, что и BackColor, но устанавливает цвет |
||||
|
управления |
для переднего плана элемента управления, как |
||||
|
|
правило, символов текста |
|
|
|
|
List |
ComboBox |
Массив типа Variant (одно- или многомерный), |
||||
|
|
представляет список, содержащийся в элементе |
||||
|
|
управления. Используйте индекс Value как нижний |
||||
|
|
индекс в коллекции List, чтобы получить текст для |
||||
|
|
выбранного пункта списка. Используйте методы |
||||
|
|
элемента управления Addltem и Removeltem для |
||||
|
|
добавления или удаления пунктов списка |
|
|||
Max |
ScrollBar, |
Переменная типа Long, определяющая максимальное |
||||
|
SpinButton |
значение счетчика или значение, при котором |
||||
|
|
полоса прокрутки находится в самом верху |
(для |
|||
|
|
вертикальной |
полосы) |
или |
справа |
(для |
|
|
горизонтальной) |
|
|
|
|
Min |
ScrollBar, |
Переменная типа Long, определяющая минимальное |
||||
|
SpinButton |
значение счетчика или значение, при котором |
||||
|
|
полоса прокрутки находится в |
самом низу |
(для |
116
Свойство |
Где |
Описание |
|
|
|
|
|
|
|
применяется |
|
|
|
|
|
|
|
|
|
вертикальной |
полосы) |
или |
слева |
(для |
||
|
|
горизонтальной) |
|
|
|
|
|
|
Name |
Все элементы |
Содержит имя элемента управления. Вы можете |
||||||
|
управления |
установить данное свойство только с помощью |
||||||
|
|
Properties Window |
|
|
|
|
|
|
RowSource |
ComboBox |
Задает источник, из которого ListBox берет список |
||||||
|
|
объекта. В Excel VBA RowSource обычно использует |
||||||
|
|
диапазон рабочего листа |
|
|
|
|
||
Selected |
ListBox |
Возвращает массив значений типа Boolean для |
||||||
|
|
списка, который допускает множественный выбор. |
||||||
|
|
Каждый элемент массива содержит по одному |
||||||
|
|
элементу, соответствующему каждому пункту |
||||||
|
|
списка. Если значение элемента в массиве Selected |
||||||
|
|
равно True, то соответствующий пункт списка |
||||||
|
|
выбран |
|
|
|
|
|
|
TabIndex |
Все элементы |
Число, |
указывающее |
положение |
элемента |
|||
|
управления |
управления в порядке табуляции (может иметь |
||||||
|
|
значение от 0 до значения, равного количеству |
||||||
|
|
элементов управления на форме) |
|
|
|
|||
TabStop |
Все элементы |
Значение типа Boolean, указывающее, может ли |
||||||
|
управления |
элемент управления быть выбран клавишей Tab. |
||||||
|
|
Если значение TabStop равно False вы, тем не менее, |
||||||
|
|
можете щелкнуть на элементе и таким образом его |
||||||
|
|
выбрать |
|
|
|
|
|
|
Value |
Все элементы |
Значение текущих установок элемента управления: |
||||||
|
управления |
текст в текстовом поле, какие выбраны флажки и |
||||||
|
|
переключатели, индекс выбранного раздела списка |
||||||
|
|
или число, указывающее, текущее положение |
||||||
|
|
полосы прокрутки или счетчика |
|
|
|
|||
Visible |
Все элементы |
Значение типа Boolean, указывающее, является ли |
||||||
|
управления |
элемент управления видимым. |
|
|
|
Использование Toolbox (панели элементов)
Прежде чем мы рассмотрим примеры обработки событий, связанных с элементами управления, вам следует научиться помещать элементы управления на форму и задавать им необходимые свойства.
Редактор VB в режиме разработки вместе с формой выводит на экран Toolbox (панель элементов) (если вывод этой панели не отключен при помощи меню View/Toolbox) (рис. 27). Кнопки на панели Toolbox активизируют различные инструменты, которые позволяют помещать на форму элементы управления.
117
Рис. 27
Toolbox (подобно всем другим панелям инструментов) можно настраивать. Вы можете изменить размер самой формы. Щелкните по строке заголовка
формы для ее выделения и затем, перемещая один из маркеров изменения размеров, увеличьте или уменьшите размер формы до желаемого. Маркеры изменения размеров (sizing handles) – это маленькие квадратики, которые появляются в углах и на серединах сторон графического объекта (наряду с толстой серой границей) при выделении объекта.
Когда вы создаете новую форму, Редактор VB предоставляет чистую (без элементов управления) форму. Вы можете добавить к форме элементы управления с использованием различных инструментов панели Toolbox.
Добавив к форме кнопку, вы можете заметить, что верхний левый угол кнопки (также как и сама граница кнопки) автоматически выравнивается по шаблону сетки на форме. Это действие, называемое привязка к сетке (snap to grid), поможет вам выровнять размещенные на форме элементы управления и текст. Вы можете включать и отключать привязку к сетке, настраивать шаг сетки или скрывать ее, изменяя установки в диалоговом окне Option (Параметры) Редактора VB. Выберите Tools/Options (Сервис/Параметры) и щелкните по вкладке General (общие), чтобы вывести Form Grid Settings (Параметры сетки в форме). Выберите или сбросьте необходимые опции.
Все элементы управления формы должны иметь уникальные имена. Эти
имена следует использовать при ссылках на элемент управления в своей программе. Всякий раз, когда вы добавляете к форме новый элемент управления, VBA присваивает ему имя по умолчанию, состоящее из имени типа элемента и номера. VBA обеспечивает уникальность имени включением в имя элемента управления числа. Число в имени больше, чем число любого другого подобного элемента управления. Если кнопка, которую вы добавили в начале этого раздела, является первой кнопкой, она получит имя CommandButton1. Следующая добавленная вами кнопка будет CommandButton2 и так далее. Если после этого вы добавите поле, оно получит имя TextBox1.
Задание 4. Создайте форму, выводящую сообщение текущей даты и время. Для этого:
üвыберите команду Insert/UserForm (Вставка/UserForm);
üубедитесь, что форма активна, щелкнув по ней;
üщелкните на пиктограмме с буквой в панели элементов управления;
118
ü поместите указатель мыши в форму ближе к левому верхнему краю и, нажав левую кнопку мыши, перетащите указатель вправо вниз, чтобы появившийся при этом прямоугольник мог вместить нужное сообщение (рис.28);
Рис. 28
üдля надписи в нашей программе-примере измените лишь два свойства – Name (Имя) на lblNow и Caption (Заголовок) – просто удалите значение свойства. Для управления свойствами предназначено окно свойств. Чтобы сделать это, найдите свойство Name в самом верху списка свойств (оно представлено как (Name)), – это единственное из свойств, заключенное в скобки. Двойным щелчком
вправом столбце строки этого свойства выберите его, а затем впечатайте новое имя. Затем опуститесь по списку ниже и найдите свойство Caption. Здесь просто удалите значение свойства;
üщелкните в окне формы, чтобы сделать его активным снова. При этом панель элементов управления, которая исчезла, когда вы перешли в окно свойств, возникнет снова;
üизмените значение свойства Caption на Моя первая форма;
üщелкните на той пиктограмме в панели элементов управления, на которой изображена кнопка (рис. 27);
üначав немного левее середины формы и нажав левую кнопку мыши, перетащите указатель по диагонали вниз, чтобы создать кнопку;
üизмените значение свойства (Name) на OKButton. Напомню снова, что
поскольку при создании программного кода вам придется ссылаться на кнопку по ее имени, такое имя кнопки напомнит вам о ее назначении (она получает ОК и закрывает окно);
üизмените значение свойства Caption на ОК. Этот текст увидит пользователь на кнопке во время выполнения вашей программы;
üвызовите окно программного кода формы (двойной щелчок по форме, либо View/Code, либо нажать F7, либо при помощи контекстного меню);
üдважды щелкните по кнопки ОК;
üв появившемся при этом окне программного кода должна уже присутствовать заготовка процедуры:
1Private Sub OKButton_Click()
3End Sub
üзапишите после заголовка процедуры следующий программный код
2Unload Me
оператор Unload убирает указанный объект из памяти. Здесь это объект с именем Me, имеющим в VBA специальный смысл. В данном случае оно означает форму и
119
весь ее программный код; ü напечатайте еще три строки кода:
1Private Sub UserForm_Activate()
2Dim Quote As String
3Quote = "Не повторяется такое никогда:"
4lblNow.Caption = Quote & Format(Now, "dddddd, hh ч. mm мин.")
5End Sub
Задание 5. Создайте форму, выводящую значения функции y = sin(x) .
1+ ex
Для этого:
üвыберите команду Insert/UserForm (Вставка/UserForm);
üрасположите на форме следующие элементы управления (рис. 29):
TextBox1
TextBox2
Рис. 29 ü форма создана, функция каждого элемента управления известна. Для
написания кода программы, связанного с пользовательской формой, достаточно дважды щелкнуть, например, кнопку CommandButton1. Откроется редактор кода на листе модуля UserForm3. Более того, он откроется на том месте, где программируются действия, связанные с элементом управления, который был дважды нажат. Если код еще не набран, то при открытии редактора кода появятся инструкции заголовка и окончания процедуры, которая будет связана с элементом управления. Напечатайте код формы (листинг 22):
Листинг 22 – Код формы UserForm3
1Private Sub CommandButton1_Click()
2Dim x As Double, y As Double
4If Not IsNumeric(TextBox1.Text) Then 'Проверка является ли введенное
5 |
'значение числом |
6 |
MsgBox "Аргумент должен быть числом", _ |
7 |
vbExclamation 'Вывод окна сообщения |
8TextBox1.SetFocus 'Фокус (курсор) устанавливается на поле TextBox1
9Exit Sub 'Досрочный выход из процедуры
10End If
11x = CDbl(TextBox1.Text) 'При считывании числа из поля ввода при
12 |
'помощи функции CDbl строковый тип, возвращаемый |
13 |
'свойством Text, преобразуется в числовой |
14 |
y = Sin(x)/(1+Exp(x)) |
120