VBA в MS Office 2007

Подробности об элементах управления

Показывать лекцию целиком

4.1. Панель инструментов

Выше мы говорили лишь о кнопке и надписи. Но VBA позволяет работать с огромнейшим количеством элементов управления.

На панели инструментов Toolbox в редакторе VBA отображается лишь их малая часть. Для того чтобы просмотреть установленные в системе элементы и вывести кнопки для их вызова на панель инструментов, щелкните правой кнопкой мыши по панели и в появившемся меню выберите пункт Additional Control (Дополнительные элементы управления).

Даже если вы специально не устанавливали пакеты элементов – вы увидите большой список (рис. 4.1.). Мы нашли в этом окне Календарь 12.0. Выделим его (для этого надо включить флажок напротив названия) и нажмем OK — на панели инструментов VBA появится новый элемент управления.

(рис 4.1) Просмотр дополнительных элементов управления

Теперь рассмотрим наиболее часто используемые элементы управления и особенности их применения.

4.2. Form

04-01-Формы.docm — пример к п. 4.2.

Вы уже знакомы с формами. Они содержат в себе другие элементы управления.

Среди событий форм можно отметить следующие.

Initialize (Инициализация) — возникает перед появлением формы. На этом этапе форма готовится к открытию и в обработчик этого события обычно включают операции для настройки элементов управления, открытия внешних файлов.

Error (Ошибка) — возникает при появлении ошибки в форме.

Terminate (Завершение) — возникает при обычном завершении работы формы. В обработчик этого события можно добавить команды записи протоколов работы приложений, удаления временных файлов, в которых нуждалось приложение.

Если вы сомневаетесь в том, когда именно происходит то или иное событие — проведите небольшой эксперимент. Создайте обработчик этого события и добавьте в него функцию MsgBox с какой-нибудь характерной фразой. Когда произойдет событие, вызывающее данный обработчик, появится окно сообщения и вы точно будете знать, на что именно реагирует обработчик.

Если в вашем проекте имеется несколько форм, вам понадобится работать с ними, показывая и скрывая их при необходимости. Чтобы отобразить форму, воспользуйтесь методом Show (Показать). Для скрытия формы используйте метод Hide (Скрыть).

Выполним небольшое упражнение. Создадим несколько форм и настроим навигацию между ними. Одна из форм будет служить главной — из нее вызываются остальные формы.

Создайте новый документ Microsoft Word, откройте редактор кода и добавьте в проект три формы. Настройте их свойства следующим образом (табл. 4.1.).

Свойства форм
Свойство Форма №1 Форма №2 Форма №3
Name frm_Main frm_First frm_Second
Caption Главная форма Первая форма Вторая форма

Добавьте на форму frm_Main две кнопки. Одну из них назовите cmd_Call_F1 и подпишите ее "Вызвать первую форму", вторую – cmd_Call_F2 с подписью "Вызвать вторую форму". Эти кнопки должны скрывать форму frm_Main, и, соответственно, вызывать frm_First и frm_Second.

На форму frm_First добавьте кнопку cmd_First с надписью "На главную". Нажатие на эту кнопку должно скрывать frm_First и отображать frm_Main. Аналогичную кнопку (только с именем cmd_Second ) добавьте на frm_Second.

Вот как (рис. 4.2.) выглядит окно проекта.

(рис 4.2) Формы в окне проекта

Создадим обработчик события Initialize для формы frm_Main. Добавим в него команду вывода окна сообщения с надписью "Добро пожаловать в программу.

На рис. 4.3. вы можете видеть окно кода формы frm_Main после создания необходимых обработчиков событий.

(рис 4.3) Обработчики событий в форме frm_Main

Обработчик события Click для кнопки cmd_First формы frm_First выглядит так (листинг 4.1, комментарии опущены).

frm_First.Hide
frm_Main.Show

Обработчик события Click кнопки cmd_Second формы frm_Second выглядит аналогично — главное отличие — он скрывает frm_Second

Поэкспериментируйте с этой программой, попробуйте назначить формам другие обработчики событий, выводящие сообщения и посмотрите, что из этого выйдет. Подобная схема работы с формами используется в реальных проектах — тогда, когда нужно организовать взаимодействие пользователя с несколькими формами.

4.3. Label

Элемент управления label (Метка) используется лишь для вывода подписей к другим элементам управления. Обычно ему не назначают никаких обработчиков событий

4.4. CommandButton

Элемент управления CommandButton (Кнопка) обычно используют для выполнения каких-либо команд. Основное событие кнопки — Click (Щелчок). Оно генерируется при щелчке по кнопке.

Кнопка может воспринимать и другие события — всего их больше десятка. Обычно об их предназначении можно узнать из их же названий. Например, очевидно, что название события MouseMove переводится как "Перемещение указателя мыши". Это событие будет генерироваться всякий раз, когда над кнопкой будет перемещаться указатель мыши. Ниже мы напишем программу, работа которой будет основана на этом событии.

4.5. TextBox

04-02-Текстовое поле.docm — пример к п. 4.5.

TextBox — текстовое поле. Обычно используется для ввода данных пользователем. Текст, который введен в текстовое поле, можно получить или изменить, воспользовавшись его свойством Text. Текстовым полям нечасто назначают события, однако, например, для проверки введенных данных сразу после ввода, можно использовать событие Change (Изменение). Оно генерируется всякий раз, когда содержимое поля меняется.

Рассмотрим пример. Создадим форму и добавим на нее два элемента управления — текстовое поле txt_First и надпись lbl_First. Установим у lbl_First свойство BorderStyle в fmBorderStyleSingle — благодаря этому вокруг надписи будет отображаться граница. Можете так же добавить пару пояснительных надписей к txt_First и lbl_First.

Сделаем двойной щелчок по текстовому полю. Откроется окно редактора кода с открытым обработчиком события Change. Добавим в обработчик такой код:

lbl_First.Caption = txt_First.TextLength

Вам знакомы почти все элементы этого кода кроме свойства текстового поля TextLength. Это свойство позволяет узнать, сколько символов содержится в поле. Запустите программу. Попытайтесь ввести что-нибудь в поле с клавиатуры — по мере ввода символов в текстовое поле, их количество будет отображаться на lbl_First (рис. 4.4.).

(рис 4.4) Работа с текстовым полем

4.6. ComboBox

04-03-Поле со списком.docm — пример к п. 4.6.

ComboBox — поле со списком. Используется для хранения списков значений. Поле следует заполнить перед использованием. Для добавления новых значений используется метод AddItem (Добавить элемент). Обычно вызовы этого метода помещают в обработчик события Initialize формы, на которой расположено поле.

Для очистки поля можно использовать метод Clear (Очистить).

После того, как пользователь выбрал один из параметров поля, считать выбранное значение можно, воспользовавшись свойством Value.

После того, как пользователь сделал выбор из поля со списком, выбранное значение обрабатывается по нажатию какой-либо кнопки. Можно также воспользоваться событием Change (Изменение).

Рассмотрим пример использования элемента управления ComboBox. Заполним его списком фамилий, а при выборе фамилии из списка, будем выводить ее в окне сообщения.

Создадим форму frm_Main, расположим на ней поле со списком, назовем его cbo_First. Теперь создадим обработчик события Initialize для frm_Main и добавим туда такой код (листинг 4.2):

cbo_First.AddItem ("Иванов")
cbo_First.AddItem ("Петров")
cbo_First.AddItem ("Сидоров")
cbo_First.AddItem ("Васильев")

Создадим обработчик события Change для cbo_First и добавим в него команду вывода сообщения:

MsgBox (cbo_First.Value)

Теперь запустим форму (рис. 4.5.). При нажатии на кнопку с треугольником, поле раскрывается, при выборе одной из строк поля, ее значение отображается в окне сообщения.

(рис 4.5) Работа с ComboBox

4.7. ListBox

04-04-Cписок.docm — пример к п. 4.7.

ListBox — список. Обычно используется для представления списков данных.

Работа с ListBox аналогична работе с ComboBox. На рис. 4.6. вы можете видеть форму с расположенным на ней списком, реализующую ту же функциональность, что и в примере к полю со списком.

(рис 4.6) Работа с ListBox

4.8. CheckBox

04-05-Флажок.docm — пример к п. 4.8.

CheckBox — флажок. Используется для включения и отключения каких-либо опций. Элемент управления представляет собой поле, где можно устанавливать и снимать флажок и надпись, где обычно выводится название и назначение флажка.

Если флажок установлен — его свойство Value (Значение) устанавливается в True (Истина), если не установлен — в False (Ложь). Для того чтобы программно установить или снять флажок, можно воспользоваться его свойством Value, приравняв ему True или False, соответственно.

Еще одно важное свойство флажка — TripleState. Если оно включено — флажок помимо True или False может иметь значение Null, которое можно интерпретировать как "Пустой флажок". Null-флажок нельзя модифицировать — он закрашен серым цветом.

Сами по себе, без использования специальных конструкций языка, флажки приносят мало пользы. Эффективно работать с ними можно, используя операторы принятия решений.

С флажком можно сопоставить событие Change (Изменить). Оно выполняется всякий раз при установке или снятии флажка.

Давайте рассмотрим пример работы с флажками. Создадим форму frm_First и разместим на ней три флажка – chk_1, chk_2 и chk_3. Добавим на форму пару кнопок – cmd_SetAll с надписью "Установить все флажки" и cmd_ClearAll с надписью "Снять все флажки". Думаю, вы видели что-то подобное во многих программах — часто пользователю предоставляется возможность не кликать по множеству флажков вручную, устанавливая или снимая их, а сделать эту работу одним нажатием специальной кнопки. Точно так же, можно создать кнопку, которая устанавливает определенный набор флажков из всех, реализуя тем самым какую-нибудь особенную настройку программы.

Добавим обработчик события Click для cmd_SetAll (листинг 4.3). Если попытаться выразить обычным языком то, что должно произойти по нажатию этой кнопки, то получится следующее: "Установить все три флажка, то есть, сделать их параметр Value равным True".

chk_1.Value = True
chk_2.Value = True
chk_3.Value = True

Рассуждая аналогично, пишем код для события Click кнопки cmd_ClearAll (листинг 4.4). Очевидно, что единственное его отличие от предыдущего кода заключается в смене True на False.

chk_1.Value = False
chk_2.Value = False
chk_3.Value = False

На рис. 4.7. вы можете видеть запущенную форму.

(рис 4.7) Интерфейс с использованием CheckBox

4.9. OptionButton

04-06-Рамки и радиокнопки.docm — пример к пп. 4.9. – 4.10.

OptionButton — радиокнопка. Не удивляйтесь такому названию. Оно отражает особенности этого элемента управления. Радиокнопки обычно используются группами, а в группе может быть выбрана лишь одна кнопка. Это напоминает выбор одной радиостанции с помощью одной из кнопок на радиоприемнике.

Основное свойство радиокнопки — это Value (Значение) — если оно равно False (Ложь) — радиокнопка не выбрана, если True (Истина) — выбрана. Свойство TripleState позволяет присваивать элементу управления параметр Null, который, как в случае с флажками, блокирует элемент.

Все радиокнопки, расположенные на одной форме, автоматически объединяются в одну группу. Поэтому из всех этих кнопок выбрана может быть лишь одна. Как же быть, если на форме надо расположить несколько групп таких кнопок? Ответ на этот вопрос кроется в использовании так называемых фреймов или рамок (элемент управления Frame ). Радиокнопки, размещенные в пределах рамки, обрабатываются отдельно от кнопок на других рамках или на формах.

4.10. Frame

Frame — рамка. Рамки обычно используют для группировки объектов. Например, на форме может быть расположено несколько групп элементов управления, выполняющих различные функции. Логично будет сгруппировать их с помощью рамок. Для этого нужно создать на форме рамку и перетащить на нее остальные элементы управления. Как правило, рамкам не назначают обработчики событий, используя их как контейнеры для других объектов.

Если вы хотите обратиться к элементу управления, который расположен на рамке, используйте такой же синтаксис, как и для доступа к объекту, расположенному на форме.

Давайте рассмотрим пример совместного использования рамок и радиокнопок. Предположим, нам нужно спроектировать интерфейс для настройки сохранения файлов из программы. В интерфейс должны входить три группы параметров – для выбора формата сохраняемого файла, для управления именованием файла (вручную или автоматически), и местом сохранения (так же вручную или автоматически).

Создадим форму frm_First и добавим на нее две рамки — fra_First и fra_Second. Добавим две радиокнопки на форму (назовем их opt_1 и opt_2 ). Так же добавим по две радиокнопки в каждую из рамок. В рамку fra_First добавим кнопки opt_3 и opt_4, а в fra_Secondopt_5 и opt_6. Установим параметр TripleState равным True для всех радиокнопок. Подпишем радиокнопки и рамки так, как указано в табл. 4.2.

Подписи рамок и радиокнопок
Имя элемента управления Свойство Caption Value
Fra_First Имена файлов
Fra_Second Место сохранения файлов
opt_1 Сохранить в TXT-файл True
opt_2 Сохранить в DOCX-файл False
opt_3 Автоматически True
opt_4 Задать вручную False
opt_5 Автоматически True
opt_6 Задать вручную False

Добавим на форму кнопку, назовем ее cmd_SetAuto и подпишем: "Автоматически", добавим еще одну кнопку – cmd_SetManual и подпишем ее "Вручную". Теперь создадим обработчики событий Click для кнопок.

Кнопка cmd_SetAuto устанавливает радиокнопки с надписью "Автоматически" (листинг 4.5)

opt_3.Value = True
opt_5.Value = True

Кнопка cmd_SetManual устанавливает радиокнопки с надписью "Вручную" (листинг 4.6)

opt_4.Value = True
opt_6.Value = True

На рис. 4.8. вы можете видеть форму этого примера. Поэкспериментируйте с ней — убедитесь, что группы радиокнопок, расположенных в различных рамках, действуют независимо друг от друга.

(рис 4.8) Работа с рамками и радиокнопками

4.11. ToggleButton

ToggleButton — выключатель. Это кнопка, которая может существовать в двух состояниях — включенном и выключенном. По действию она напоминает флажок, и обычно используется точно так же.

Если кнопка находится во включенном состоянии — это может означать включение какой-либо опции, если в выключенном — выключение. Основное свойство такой кнопки — Value (Значение). Оно установлено в False (Ложь), когда кнопка находится в обычном состоянии, и в True (Истина), когда кнопка нажата.

При изменении состояния кнопки генерируется событие Change (Изменение) — его можно использовать для проверки установленного значения и проведения каких-либо действий.

На рис. 4.9. вы можете видеть форму с размещенными на ней выключателями. Один из них включен, другой – выключен.

(рис 4.9) Выключатели на форме

4.12. ScrollBar

04-07-Полоса прокрутки.docm — пример к п. 4.12.

ScrollBar — полоса прокрутки. Используется для плавного изменения каких-либо значений. Например, это может быть выбор параметра из диапазона значений. При настройке этого элемента управления следует учесть, что для его нормальной работы надо установить следующие свойства:

  • Max (Максимум) — максимальное значение полосы.
  • Min (Минимум) — минимальное значение полосы
  • Small Change (Маленькое изменение) — шаг, с которым изменяется значение полосы при прокрутке с помощью кнопок.
  • Large Change (Большое изменение) — шаг, с которым меняется значение при перетаскивании бегунка полосы с помощью мыши.
  • Узнать текущее значение полосы можно, воспользовавшись ее свойством Value (Значение).
  • При изменении значения полосы прокрутки генерируется событие Change (Изменение). Оно происходит после каждого изменения значения полосы. Если вы перетаскиваете бегунок с помощью мыши, новое значение полосы прокрутки будет сгенерировано лишь тогда, когда вы отпустите кнопку мыши. Для того чтобы непрерывно изменять значение полосы вслед за перетаскиванием бегунка вручную, воспользуйтесь обработчиком события Scroll (Прокрутка).

    Расположение кнопок (горизонтальное или вертикальное) выбирается автоматически в зависимости от ширины и высоты полосы прокрутки.

    Давайте рассмотрим пример, иллюстрирующий возможности элемента управления ScrollBar и разницу между событиями Change и Scroll. Создадим форму, добавим на нее полосу прокрутки с именем scr_First, оставим ее параметры равными по умолчанию, и две надписи – lbl_Change и lbl_Scroll. Они будут содержать информацию о значении полосы прокрутки, но lbl_Change будет обновляться по событию полосы прокрутки Change (листинг 4.7), а lbl_Scroll — по событию Scroll (листинг 4.8).

    lbl_Change.Caption = scr_First.Value
    lbl_Scroll.Caption = scr_First.Value

    На рис. 4.10. вы можете видеть форму нашего примера в момент перетаскивания бегунка вручную.

    (рис 4.10) Работа с полосой прокрутки

    До тех пор, пока мы не отпустили левую кнопку мыши, при каждом перемещении бегунка вручную будет генерироваться событие Scroll — значение в надписи lbl_Scroll будет меняться при перемещении бегунка. А вот значение в поле lbl_Change, которое обновляется по событию Change, изменится лишь тогда, когда мы отпустим кнопку мыши. В то же время, изменяя значение полосы прокрутки с помощью кнопок прокрутки, мы можем наблюдать лишь изменения поля lbl_Change так как нажатия на эти кнопки генерируют событие Change. А вот поле lbl_Scroll при использовании кнопок обновляться не будет – событие Scroll не генерируется.

    4.13. SpinButton

    SpinButton — счетчик. Этот элемент управления напоминает полосу прокрутки без центрального бегунка. Он служит для выбора значений из небольшого диапазона. Работа с ним аналогична работе с полосой прокрутки. Главное отличие — отсутствие у счетчика события Scroll (Прокрутка) и свойства Large Change (Большое изменение).

    На рис. 4.11. вы можете видеть форму с парой счетчиков – горизонтальным и вертикальным. Как и в случае с полосой прокрутки, расположение кнопок на элементе управления выбирается автоматически в зависимости от ширины и высоты.

    (рис 4.11) Счетчики на форме

    4.14. Image

    04-08-Изображения.docm — пример к п. 4.14., файлы 1.jpg и 2.jpg содержат графический материал к этому примеру.

    Image — изображение. Этот элемент управления используют для вывода на форму изображений.

    За картинку, которая будет отображаться в Image, отвечает параметр Picture (Изображение). Настраивая этот параметр в панели Properties, вы должны будете выбрать нужный графический файл с помощью стандартного окна поиска файлов.

    Для того, чтобы изменить картинку в ходе выполнения программы, вы должны воспользоваться специальной функцией LoadPicture таким образом:

    Имя_рисунка.picture = LoadPicture (полный_путь_к_файлу)

    Среди других важных свойств рисунка можно отметить такие, как AutoSize (Автоматический размер). Если свойство установлено в True (Истина) – элемент управления автоматически изменяет свой размер в соответствии с размером загруженного в него изображения.

    Рисунку может быть назначено какое-нибудь событие. Например, при щелчке (событие Click ), который представляет собой фотографию сотрудника, может выводиться краткая информация о нем и т.д.

    Рассмотрим пример, в котором изображение в элементе управления Image меняется при нажатии на кнопки. Для этого примера нам понадобится пара графических файлов. Мы заранее создали их – каждый из них имеет размер 100х100 пикселей и формат jpg.

    Создадим новый документ Microsoft Word и сохраним его в какой-нибудь папке. После этого нужно скопировать в ту же папку файлы изображений. Вы можете использовать в своих проектах файлы, расположенные произвольно, но мы поступим именно так. Теперь создадим форму и добавим на нее картинку с именем img_First. С помощью свойства Picture (Изображение) выберем изображение, которое будет отображено на элементе управления. Настроим размер элемента управления таким образом, чтобы изображение поместилось в нем полностью.

    Теперь добавим на форму две кнопки — cmd_First и cmd_Second. При нажатии на кнопке cmd_First в img_First должна отображаться картинка 1.jpg, (листинг 4.9) при нажатии кнопки cmd_Second2.jpg (листинг 4.10). Так как картинки расположены в той же папке, что и наш файл, мы можем использовать для их загрузки относительный путь, то есть использовать лишь имя файла. Если же ваши картинки расположены где-нибудь еще — надежнее всего будет указать абсолютный путь к ним (например, похожий на этот: "C:\Images\1.jpg" ). Для изменения свойства Picture элемента управления img_First в коде программы нужно воспользоваться уже упомянутой функцией LoadPicture.

    img_First.Picture = LoadPicture("1.jpg")
    img_First.Picture = LoadPicture("2.jpg")

    На рис. 4.12. вы можете видеть форму нашего примера.

    (рис 4.12) Работа с элементом управления Image

    4.15. MultiPage

    04-09-Набор страниц.docm — пример к п. 4.15.

    MultiPage — набор страниц. С помощью этого элемента можно создать многостраничное окно. Доступ к отдельным частям такого окна осуществляется посредством выбора вкладок.

    Управлять вкладками можно с помощью контекстного меню, которое появляется при щелчке по элементу управления. Вкладки организованы в коллекцию Pages (Страницы). Чтобы обратиться к элементу управления, расположенному на одной из вкладок элемента управления MultiPagе, нужно использовать такую конструкцию:

    Имя_элемента_MultiPage.Имя_вкладки.Имя_элемента_на_вкладке

    Важнейшие свойства объекта MultiPage следующие:

  • Value (Значение) — возвращает номер активной вкладки (нумерация начинается с нуля).
  • SelectedItem — возвращает выбранную страницу.
  • При выборе вкладки генерируется событие Change.

    Выполним пример. Создадим форму, поместим на нее элемент управления MultiPage, назовем его mlt_First. Добавим одну вкладку к набору вкладок, добавляемому на элемент по умолчанию. Вкладки имеют имена Page1, Page2 и т.д. Чтобы настраивать свойства каждой вкладки по отдельности, будем выделять эти вкладки в окне редактора. В табл. 4.3. приведены параметры вкладок и список элементов управления на каждой из них.

    Параметры вкладок
    Имя вкладки Надпись Элементы управления на вкладке
    p_1 Вкладка №1 txt_First — текстовое поле; cmd_First — кнопка с надписью "Перенести текст на вкладку №3"
    p_2 Вкладка №2
    p_3 Вкладка №3 Lbl_First — надпись

    Настроим событие Change для mlt_First таким образом, чтобы при выборе каждой вкладки выводилось бы окно сообщения с именем этой вкладки (листинг 4.11)

    MsgBox (mlt_First.SelectedItem.Name)

    Теперь поработаем с событием Click кнопки cmd_First, которая расположена на вкладке p_1. По нажатию на эту кнопку текст, который введен в текстовое поле txt_First, должен быть перенесен на надпись lbl_First, которая расположена на вкладке p_3. Этот обработчик проиллюстрирует работу с элементами управления, расположенными на различных вкладках (листинг 4.12).

    mlt_First.Pages.Item(2).lbl_First.Caption = _
    mlt_First.Pages.Item(0).txt_First.Text

    В данном случае Item(0) представляет первую страницу в коллекции Pages (вместо индекса 0 можно использовать имя вкладки), Item(2) — третью. Обратите внимание на то, что при вводе части строки после Item(2) и Item(0) перестает работать помощник по синтаксису. Однако после ввода данных они проверяются на правильность.

    На рис. 4.13. вы можете видеть форму после выбора одной из страниц.

    (рис 4.13) Работа с набором страниц

    4.16. TabStrip

    04-10-Набор вкладок.xlsm— пример к п. 4.16.

    TabStrip — набор вкладок. Используется для организации нескольких рабочих областей на форме. В объект входит семейство Tabs (Вкладки), которое содержит все активные вкладки.

    Основное событие объекта — Change (Изменение). Оно происходит при смене вкладки.

    Наборы вкладок используются достаточно редко. Например, их можно применить, чтобы по-разному заполнять одни и те же поля, по-разному устанавливать флажки и т.д.

    Дело в том, что TabStrip не содержит элементы управления внутри себя. Он служит как бы "фоном" для размещения элементов.

    Cамый яркий пример использования TabStrip — это создание приложений с многоязыковым интерфейсом. Рассмотрим пример.

    Добавим в проект форму frm_First, разместим на ней элемент управления TabStrip с именем tab_First. По умолчанию у TabStrip две вкладки. Первая по порядку вкладка имеет номер 0, вторая — 1 и т.д. Для того, чтобы узнать номер активной вкладки, можно воспользоваться свойством Value элемента управления TabStrip.

    Для того, чтобы изменить надписи на вкладках, добавить новые и т.д. служит контекстное меню, которое появляется на элементе управления TabStrip при щелчке по нему правой кнопкой мыши. Подпишем первую вкладку Русский, вторую — English.

    Добавим на форму, поверх tab_First, метку с именем lbl_First и текстом Добро пожаловать, а так же кнопку cmd_First с надписью Вперед (рис. 4.14.).

    (рис 4.14) Набор вкладок на форме

    Теперь добавим обработчик события Change для tab_First. (листинг 4.13).

    If tab_First.Value = 0 Then
    lbl_First.Caption = "Добро пожаловать!"
    cmd_First.Caption = "Вперед"
    End If
    If tab_First.Value = 1 Then
    lbl_First.Caption = "Welcome!"
    cmd_First.Caption = "Next"
    End If

    В этом листинге вы можете видеть конструкцию сравнения и принятия решений If-End If. Подробнее о ней мы будем говорить в главе 5. Если "перевести" один из блоков листинга 4.13. на обычный язык, то получится следующее:

    Если tab_First.Value=0 Тогда
    lbl_First.Caption = "Добро пожаловать!"
    cmd_First.Caption = "Вперед"
    Конец сравнения

    То есть в блоке If мы сравниваем свойство Value и, если оно равно 0, выполняем код, который находится между If и End If. Иначе мы ничего не выполняем и переходим к следующему сравнению. Одно из них выполнится в любом случае, так как на элементе tab_First есть лишь две вкладки.

    В результате, если выбрана первая вкладка (индекс 0), свойствам Caption элементов управления lbl_First и cmd_First присваиваются русскоязычные слова. Если же выбрана вкладка с индексом 1, элементам управления присваиваются англоязычные названия.

    4.17. Calendar

    04-11-Календарь.docm — пример к п. 4.17.

    Calendar — календарь. Этот объект удобно использовать для ввода и отображения даты. Для того чтобы считать дату, можно использовать его свойство Value (Значение). С помощью этого же свойства можно установить дату на календаре.

    При изменении дня недели генерируется событие Click (Щелчок), при смене месяца или года – события NewMonth (Новый месяц) и NewYear (Новый год).

    Давайте рассмотрим пример. Добавим на форму элемент управления Calendar, назовем его cld_First, добавим второй календарь с именем cld_Second. Добавим на форму кнопку — cmd_First, с подписью "Вывести дату". По нажатию на кнопку cmd_First в окне сообщения должна выводиться дата, установленная в cld_First (листинг 4.14).

    При изменении даты в календаре cld_First, в календаре cld_Second должен устанавливаться тот же месяц, который установлен в cld_First, число месяца должно устанавливаться на 1 день месяца (листинг 4.15).

    MsgBox (cld_First.Value)
    cld_Second.Month = cld_First.Month
    cld_Second.Day = 1

    На рис. 4.15. вы можете видеть форму с парой календарей.

    (рис 4.15) Работа с календарем

    4.18. Последовательность обхода элементов управления

    Перемещаться между элементами управления, добавленными на форму, можно, нажимая клавишу Tab на клавиатуре. Это — стандартная возможность Windows-программ. По умолчанию объекты обходятся в том порядке, в котором они добавляются на форму. Однако, иногда удобно установить свой порядок обхода элементов, назначить какой-то элемент управления активным по умолчанию и т.д.

    Элементы управления имеют свойство TabIndex (Индекс табуляции). Этот индекс начинается с 0, что соответствует первому элементу управления. Настроить порядок табуляции можно, модифицировав этот параметр. Однако удобнее воспользоваться специальным окном. Вызвать его можно командой View • Tab Order (Вид • Порядок перехода) (рис. 4.16.). Имена элементов управления расположены в этом окне в порядке обхода. Чтобы изменить этот порядок, воспользуйтесь кнопками Move Up (Переместить вверх) и Move Down (Переместить вниз).

    (рис 4.16) Настройка порядка обхода элементов

    Для того чтобы перевести фокус ввода на элемент управления программно, воспользуйтесь методом SetFocus (Установить фокус ввода). Вызов этого метода используется без параметров.

    Если вы не хотите, чтобы пользователь мог переводить фокус ввода на элемент управления с помощью кнопки Tab, установите свойство элемента управления TabStop в False (Ложь).

    4.19. Последние штрихи: расположение элементов на форме

    Работая с элементами управления, вы можете столкнуться с проблемой настройки их размеров и взаимного расположения. Эти параметры можно настраивать вручную — перетаскивая элементы по форме с помощью мыши или модифицируя их свойства. Но есть еще один способ решения этой проблемы — воспользоваться командами меню Format (Форматирование). Давайте рассмотрим основные пункты этого меню и особенности их использования.

    Align (Выравнивание) — выравнивание элементов относительно различных опорных точек. Например — команда Left (По левому краю) выравнивает все элементы по левому краю самого левого элемента.

    Make Same Size (Сделать одинакового размера) — команды этого подменю позволяют привести выделенные элементы управления к одному размеру. Размеры изменяются в большую сторону.

    Size to Fit (Точный размер) — позволяет изменить размер элемента управления так, чтобы он соответствовал содержимому элемента. Например, кнопка с надписью будет изменена таким образом, чтобы размера этой кнопки в точности хватило бы для размещения на ней надписи.

    Size to Grid (Размер по сетке) — выравнивает размер элемента управления так, чтобы он точно согласовывался с координатными точками, нанесенными на форму.

    Horizontal Spacing (Горизонтальное расстояние) — позволяет настраивать горизонтальное расстояние между элементами формы.

    Vertical Spacing (Вертикальное расстояние) — настраивает вертикальное расстояние между элементами.

    Center in Form (Центрировать в форме) — позволяет центрировать элементы в форме по горизонтали ( Horizontal ) и по вертикали ( Vertical ).

    Arrange Buttons (Выровнять кнопки) — выравнивает кнопки по правому ( Right ) или по левому ( Left ) краю формы.

    Group (Группировать) — позволяет объединить несколько выделенных элементов управления. Группу элементов можно, например, перетаскивать, выделив одним щелчком мыши. Группировка элементов не отменяет возможности работать с ними по отдельности. Для этого достаточно сначала выделить группу, а потом — нужный элемент управления в группе.

    Ungroup (Разгруппировать) — разгруппировывает ранее созданную группу элементов.

    Order (Порядок) — команды этого подменю отвечают за порядок расположения элементов на форме. Эти команды имеют смысл тогда, когда элементы перекрываются. По умолчанию более поздние по времени создания элементы накладываются на более ранние при совпадении их мест расположения. Так, команда Bring to Front (Переместить на передний план) перемещает элемент на передний план, Bring to Back (Переместить на задний план) перемещает элемент на задний план. Bring Forward (Переместить вперед) – перемещает элемент на один уровень вперед, Bring Backward (Переместить назад) — на один уровень назад.

    4.20. Элементы управления и документы

    04-12-Кнопка в документе.docm — пример к п. 4.20.

    Элементы управления можно размещать не только на формах, но и в документах. Чтобы создать элемент управления в документе, нужно переключиться в режим конструктора. В Microsoft Word и Microsoft Excel это можно сделать с помощью кнопки Режим конструктора, которая расположена в группе Элементы управления вкладки Разработчик.

    Включите режим конструктора, найдите среди элементов управления кнопку (рис. 4.17.) и разместите ее в документе.

    (рис 4.17) Добавление элементов управления в документы

    Чтобы снабдить кнопку полезной нагрузкой в виде обработчика события или настроить ее свойства сделайте по кнопке двойной щелчок. Появится уже знакомый вам редактор кода (рис. 4.18)

    (рис 4.18) Настройка свойств кнопки

    Обратите внимание на то, что код, который соответствует кнопке, расположен в модуле редактируемого документа ( ThisDocument ).

    На рис. 4.18. в модуле видны два обработчика события. Дело в том, что мы переименовали кнопку — назвали ее cmd_First, поэтому нам пришлось создавать новый обработчик так как старый, созданный тогда, когда кнопка называлась CommandButton1, уже неактуален — его можно удалить. Также мы отредактировали свойство кнопки Caption, введя туда текст "Показать форму". Этот текст тут же отобразится на кнопке. Если текст не поместился на кнопке — можно изменить ее размеры.

    Добавим в документ форму frm_First. Чтобы вызвать эту форму с помощью добавленной в документ кнопки, разместим в обработчике ее события Click такой код:

    frm_First.Show

    Кнопка в документе заработает, когда вы выключите режим конструктора.

    На рис. 4.19. вы можете видеть кнопку и запущенную с ее помощью форму.

    (рис 4.19) Форма, вызываемая кнопкой

    4.21. Убегающая кнопка

    04-13-Убегающая кнопка.xlsm — пример к п. 4.21.

    После того, как мы разобрались со свойствами и событиями элементов управления, предлагаю провести с ними интересный эксперимент. Для этого мы напишем простую, но довольно забавную программу.

    4.21.1. Задание

  • Создать в Microsoft Excel форму шириной 350 пикселей и высотой 200 пикселей.
  • Разместить на форме кнопки "Да", "Нет" и надпись: "Хотите ли вы получить прибавку к зарплате?".
  • Настроить свойства кнопки с надписью "Да" таким образом, чтобы на нее нельзя было перевести фокус ввода.
  • Написать программу, которая при наведении указателя мыши на кнопку с надписью "Да" перемещала бы эту кнопку в пределах формы.
  • 4.21.2. Решение

    Создадим новую форму, установим следующим образом ее свойства:

    Name (Имя) — frm_MovingButton

    Width (Ширина) — 350

    Height (Высота) — 200

    Caption (Заголовок формы) — Тест

    Добавим на форму следующие элементы управления (табл. 4.4.)

    Элементы управления и их свойства
    Название Name (Имя) Caption (Надпись) Tabstop (Фокус ввода по нажатию клавиши Tab) Height (Высота) Width (Ширина)
    Кнопка №1 cmd_Yes Да False 30 80
    Кнопка №2 cmd_No Нет 30 80
    Надпись lbl_text Хотите ли вы получить прибавку к зарплате?

    На рис. 4.20. вы можете видеть форму frm_MovingButton.

    (рис 4.20) Форма задачи об убегающей кнопке в окне редактора VBA

    Дважды щелкнем по cmd_Yes. В редакторе кода выберем в поле событий MouseMove.

    В тело обработчика события MouseMove для кнопки cmd_Yes введите такой текст (листинг 4.16).

    cmd_Yes.Left = Rnd * 250
    cmd_Yes.Top = Rnd * 150

    В листинге 4.16. мы обращаемся к следующим свойствам кнопки cmd_Yes:

  • Left — расстояние между кнопкой и левым краем формы.
  • Top — расстояние между кнопкой и верхним краем формы.
  • Функция Rnd возвращает случайное число от 0 до 1. Для вычисления нового расстояния от кнопки до левого края формы умножаем случайное число на 250, до верхнего края формы – на 150. Эти значения взяты не случайно. Ниже приведен их расчет.

    250 =  (ширина формы) – (ширина кнопки) – (запас по ширине)= 350-80-20
    150 = (высота формы) – (высота кнопки) – (запас по высоте) = 200 – 30 – 20

    Каждый раз, когда пользователь наводит указатель мыши на кнопку cmd_Yes, кнопка случайным образом меняет положение на форме. Значит, с помощью мыши он не сможет нажать на кнопку.

    Кнопки на формах можно нажимать не только с помощью мыши. Если на кнопке установлен фокус ввода (как вы знаете, он перемещается по элементам управления по нажатию клавиши Tab на клавиатуре), "нажать" на кнопку можно, нажав клавишу Пробел или Enter. Свойство Tabstop кнопки cmd_Yes мы установили равным False — то есть кнопка не сможет получить фокус ввода и ее нельзя будет нажать даже с использованием клавиатуры.

    Для того чтобы программа приобрела законченный вид, добавим обработчики события Click для кнопок cmd_No и cmd_Yes. Нажатие на кнопку cmd_No должно вывести надпись: "Спасибо за участие в опросе" и завершить программу. А если пользователю все же удастся нажать на неуловимую cmd_Yes (это возможно, если кнопка "прыгнет" так, что окажется под указателем мыши), должна вывестись какая-нибудь подходящая надпись.

    Для удобства работы с программой добавьте на лист MS Excel кнопку cmd_Show_Form, которая вызывала бы форму программы. Используйте метод Show формы frm_MovingButton, чтобы отобразить ее по нажатию на кнопку (листинг 4.17).

    Frm_MovingButton.Show

    На рис. 4.21. вы можете видеть запущенную форму программы в процессе работы с ней на фоне листа Microsoft Excel с кнопкой для вызова этой формы.

    (рис 4.21) Программа с убегающей кнопкой в действии

    4.22. Выводы

    В этой лекции мы познакомились с особенностями конструирования пользовательских интерфейсов при помощи элементов управления. Однако создать интерфейс – это лишь часть работы программиста. Другая часть заключается в написании кода. Основами кодирования на VBA мы займемся в следующей лекции.

    Вернуться к учебному плану