Лабораторная работа №6 _бакалавры

advertisement
Курс подготовила
Петрова Светлана Юрьевна
Лабораторная работа №7. Использование пользовательских форм
Пользовательские диалоговые окна создаются на основе технологии
пользовательских форм UserForm, к которым можно получить доступ из
редактора Visual Basic.
Ниже приведена стандартная последовательность действий, которой
следует придерживаться при создании пользовательского диалогового окна.
1. Вставьте новую форму UserForm в проект VBAProject рабочей
книги. Для того чтобы добавить в проект форму UserForm, запустите VBА
(нажмите <Alt+Fll>, укажите рабочую книгу в окне проекта и выберите
команду InsertUserForm). Формы UserForm получат такие имена, как
UserForm1, UserForm2 и т.д.
2. Создайте процедуру, которая будет отображать форму UserForm.
Эта процедура располагается в модуле кода VBA (а не в модуле кода формы
UserForm). Для того чтобы отобразить пользовательское диалоговое окно с
помощью VBA, необходимо создать процедуру, которая вызывает метод
show объекта UserForm. Если объект UserForm называется UserForml, то
следующая процедура отобразит это пользовательское диалоговое окно.
Sub ShowDialog()
UserForm1.Show
End Sub
Данная процедура должна располагаться в стандартном модуле VBA, а
не в модуле формы UserForm. Для отображения немодальной формы
используется следующий синтаксис.
UserForm1.Show 0
Ниже приведен пример оператора, который скрывает диалоговое окно.
UserForm1.Hide
3. Добавьте элементы управления в форму UserForm.
4. Настройте свойства добавленных элементов управления.
5.
Создайте процедуры "обработчики событий" для элементов
управления. Эти процедуры добавляются в модуль кода UserForm и
выполняются при возникновении различных событий (например, при щелчке
на кнопке). Процедуры обработки событий вводятся в модуле кода объекта
UserForm. Наряду с этим процедура обработки события может вызывать
другие процедуры, которые находятся в стандартном модуле VBA.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Использование элементов управления CommandButton
На рис.1 показан пример объекта UserForm, в котором использован
элемент управления CommandButton в качестве простого меню. Создание
такого меню не вызывает особых трудностей, а код, обеспечивающий работу
пользовательского диалогового окна, предельно прост. Каждый элемент
управления CommandButton имеет собственную процедуру обработки
событий.
Рис.1. Представленное диалоговое окно содержит элементы управления CommandButton,
предназначенные для создания подобия меню
Например, представленная ниже процедура выполняется при щелчке на
кнопке CommandButton1.
Эта процедура приводит к вызову макроса Macro1 и закрывает
диалоговое окно UserForm. Другие кнопки используют похожие процедуры
обработки событий.
Макрос1 пишется как отдельная процедура.
Использование элемента управления ListBox
На рис. 2 показан еще один пример создания меню, но на этот раз был
применен
элемент
управления
ListBox.
Перед
отображением
пользовательского диалогового окна вызывается процедура обработки
события Initialize. Процедура, приведенная ниже, использует метод Addltem
для добавления шести опций в элемент управления ListBox.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Рис.2. В этом диалоговом окне в качестве меню используется элемент управления
ListBox
Кроме того, процедура обработки события добавлена и к кнопке
Выполнить для обработки щелчков на ней.
Данная процедура проверяет значение свойства ListIndex элемента
управления ListBox, чтобы определить, какой элемент выбран в списке (если
свойство Listlndex равно -1, то не выбран ни один из элементов). После этого
запускается соответствующий макрос. Макросы должны быть написаны
отдельно.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Пример создания пользовательского диалогового окна
Создание пользовательского диалогового окна
1. Нажмите комбинацию клавиш <Alt+F11> для запуска VBE.
2. В окне Project укажите проект рабочей книги, а затем выберите
InsertUserForm, чтобы добавить пустое диалоговое окно.
3. Свойство Caption объекта UserForm будет иметь значение по
умолчанию – UserForm1. Воспользуйтесь окном Properties, чтобы
изменить значение свойства Caption на Введите своё имя и пол
(если окно Properties не отображается на экране, нажмите клавишу <F4>).
4. Добавьте на форму элемент управления Label и измените его
свойства, как показано ниже.
Свойство
Значение
Accelerator
Caption
TabIndex
N
Имя:
0
5. Добавьте элемент управления TextBox и измените его свойства
следующим образом.
Свойство
Значение
Name TabIndex
TextName 1
6. Добавьте элемент управления Frame и измените его свойства.
10/26
Курс подготовила
Свойство
Значение
Caption
TabIndex
Пол
2
Петрова Светлана Юрьевна
7. Добавьте элемент управления OptionButton внутри элемента
управления Frame и измените его свойства, как показано ниже.
Свойство
Значение
Accelerator
Caption
Name
TabIndex
M
Мужчина
OptionMale
0
8. Добавьте в элемент управления Frame еще один элемент
управления OptionButton и измените его свойства так, как представлено
далее.
Свойство
Значение
Accelerator
Caption
Name
TabIndex
F
Женщина
OptionFemale
1
9. Добавьте в элемент управления Frame еще один элемент
управления OptionButton и измените его свойства следующим образом.
Свойство
Значение
Accelerator
Caption
U
Другое
Name
TabIndex
Value
OptionUnknown
2
True
10. Добавьте элемент управления CommandButton за пределами
элемента управления Frame и измените его свойства.
Свойство
Значение
Caption
OK
Default
True
10/26
Курс подготовила
Name
TabIndex
Петрова Светлана Юрьевна
OKButton
3
11. Добавьте элемент управления CommandButton за пределами
элемента управления Frame и измените его свойства, как показано ниже.
Свойство
Значение
Caption
Default
Name
TabIndex
Отмена
True
CancelButton
4
Создание кода для отображения диалогового окна
После создания элементов управления на лист необходимо добавить
объект CommandButton. Эта кнопка будет запускать процедуру, которая
предназначена для отображения формы UserForm. Для этого выполните
следующие действия.
1.
Перейдите в окно Excel (воспользуйтесь комбинацией клавиш
<Alt+Fll>).
2. Перейдите на ленту Разработчик и выберите Вставить  Элементы
управления формы .
3. Добавьте на лист объект Кнопка. Щелкните на значке Кнопка,
после этого нарисуйте еѐ на листе.
4. Измените при необходимости подпись объекта Кнопка.
5. В диалоговом окне записи макроса нажмите кнопку Изменить.
6. Это приведет к активизации VBE. В нем отображается модуль кода
для листа с открытой пустой процедурой обработки событий объекта
CommandButton (Кнопка), который расположен на рабочем листе.
7.
Введите в процедуру CommandButtonl_click единственный
оператор. Эта короткая процедура вызывает метод show объекта UserForm1
для отображения на экране пользовательского диалогового окна UserForm.
Проверка
Следующим этапом является проверка процедуры, отображающей
диалоговое окно.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Как только Excel выйдет из режима конструктора, щелчок на кнопке
приведет к отображению пользовательского диалогового окна.
Когда диалоговое окно будет отображено, введите произвольный текст
в текстовом поле и щелкните на кнопке ОК. В результате — ничего не
происходит: что совершенно справедливо, так как для объекта UserForm не
создано ни одной процедуры обработки событий.
Добавление процедур обработки событий
В этом разделе рассматривается задача создания процедур, которые
обрабатывают события, возникающие после открытия пользовательского
диалогового окна. Выполните следующие действия.
1.
Нажмите комбинацию клавиш <Alt+Fll>. Это приведет к
активизации VBE.
2. Удостоверьтесь, что пользовательское диалоговое окно отображено
на экране и, если это так, дважды щелкните на кнопке Отмена. Таким
образом, будет активизировано окно кода для объекта кнопки формы
UserForm, также будет добавлена пустая процедура — CancelButton_click.
Обратите внимание, что название процедуры состоит из имени объекта,
символа подчеркивания и названия события, которое обрабатывает
процедура.
10/26
Курс подготовила
Петрова Светлана Юрьевна
3. Модифицируйте процедуру, как показано ниже (это обработчик
события click объекта CancelButton).
4. Данная процедура выполняется после щелчка пользователем на
кнопке Отмена. Она вызывает выгрузку формы UserForm из памяти.
5.
Нажмите комбинацию клавиш <Shift+F7>, чтобы повторно
отобразить объект UserForm1 (или щелкните на значке View Object в
верхней части окна Project Explorer).
6. Дважды щелкните на кнопке ОК и введите следующую процедуру
(это обработчик события Click объекта OKButton).
Процедура OKButton_click работает следующим образом: сначала она
проверяет, активен ли лист Лист1. После этого запускается функция Excel
СЧЕТ (COUNT) ДЛЯ определения следующей пустой ячейки в столбце А. Затем
текст из текстового поля TextBox передается в определенную ячейку столбца
А. С помощью операторов if определяется выделенный элемент управления
OptionButton, что обеспечивает запись соответствующего текста в столбец в
(Мужчина. Женщина. Другое). Наконец, диалоговое окно перезапускается
(чтобы обеспечить возможность введения следующей записи). Заметим, что
щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для
10/26
Курс подготовила
Петрова Светлана Юрьевна
завершения ввода данных (и выгрузки пользовательского диалогового окна)
щелкните на кнопке Отмена.
7. Перейдите в окно Excel и щелкните на кнопке еще раз, чтобы
отобразить пользовательское диалоговое окно. Запустите процедуру
повторно.
8. Элементы управления диалогового окна должны функционировать
правильно.
Проверка правильности введенных данных
Возможно, вы заметили, что не устранена небольшая проблема —
отсутствует проверка введенных в текстовом поле данных (вы не знаете, ввел
ли пользователь свое имя). Следующий код добавлен в процедуру
OKButton_click перед оператором вставки текста на рабочий лист. Он
проверяет, ввел ли пользователь свое имя (на самом деле проверяется
наличие любого текста) в поле TextBox. Если текстовое поле TextBox осталось пустым, то выводится соответствующее сообщение, и текстовое поле
снова становится активным. Таким образом, пользователь сможет
приступить к введению своего имени. Оператор Exit Sub завершает
выполнение процедуры без выполнения дополнительных действий.
Совместное использование элементов управления SpinButton и
TextBox
Элемент управления SpinButton имеет свойство Value, но не имеет
возможности отображать значение этого свойства. В большинстве случаев
необходимо, чтобы пользователь мог изменить значение элемента
управления SpinButton непосредственно, а не многократно щелкая на
элементе управления.
Эффективным решением может стать объединение элемента
управления SpinButton с элементом управления TextBox, что позволяет
пользователю вводить значение элемента управления SpinButton
непосредственно, используя для этого поле элемента управления TextBox.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Кроме того, щелчок на элементе управления SpinButton позволит изменить
значение, отображаемое в элементе управления TextBox.
Далее приведен простой пример.
Свойство Min элемента управления SpinButton имеет значение 1, а
свойство Мах— 100. Таким образом, щелчок на одной из стрелок элемента
управления SpinButton приведет к изменению значения в пределах от 1 до
100.
Код, реализующий «связывание» элементов управления SpinButton и
TextBox, достаточно простой. В целом все сводится к созданию процедур
обработки событий, которые будут синхронизировать свойство Value
элемента управления SpinButton и свойство Text элемента управления
TextBox.
Представленная далее процедура выполняется каждый раз при
возникновении события Change элемента управления SpinButton. Таким
образом, процедура выполняется тогда, когда пользователь щелкает на
элементе управления SpinButton или изменяет его значение, нажав одну из
клавиш управления курсором.
Процедура просто приравнивает значение свойства Value элемента
управления SpinButton к свойству Text элемента управления TextBox. В
данном случае элементы управления имеют имена, заданные по умолчанию
(SpinButtoni
и TextBoxi). Если пользователь
введет значение
непосредственно в элемент управления TextBox, то будет сгенерировано
событие change, после чего должен выполняться следующий код.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Эта процедура начинается с вызова функции VBA val, которая
преобразует текст элемента управления TextBox в числовое значение (если
элемент управления TextBox содержит строку, то функция Val возвращает
значение 0). Следующий оператор определяет, попадает ли значение в
указанный диапазон допустимых значений. Если это так, то свойство Value
элемента управления SpinButton устанавливается в значение, которое введено
в поле элемента управления TextBox.
Пример организован таким образом, что щелчок на кнопке ОК (которая
называется OKButton) передает значение элемента управления SpinButton в
активную ячейку. Процедура обработки события Click элемента управления
CommandButton выглядит следующим образом.
Данная процедура проводит последнюю проверку: анализируется
текст, введенный в поле элемента управления TextBox, и значения элемента
управления SpinButton. Такая процедура обрабатывает ситуации неверного
ввода данных. Например, если пользователь введет в поле элемента
управления TextBox текст «Зг67», то значение элемента управления
SpinButton не изменится, а результат, который помешается в активную
ячейку, будет отличным от ожидаемого. Обратите внимание, что значение
свойства Value элемента управления SpinButton преобразуется в строку с
помощью функции cstr. Это позволяет предотвратить ошибку, которая
возникает, когда числовое значение сравнивается с текстовым. Если значение
элемента управления SpinButton не соответствует содержимому элемента
управления TextBox, то на экране отображается специальное сообщение.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Причем объект TextBox активен, а его содержимое — выделено (с помощью
свойств Seistart и SelLength). Таким образом, пользователю проще исправить
неправильные значения.
Задание 2. Добавьте в форму из первого задания элемент управления
SpinButton и TextBox для того чтобы установить возраст клиента.
О свойстве Tag
Каждый объект UserForm и каждый элемент управления имеют свойство
Tag. Это свойство не представляет конечные данные и по умолчанию не имеет
значения. Свойство Tag можно использовать для хранения информации, которая
будет применена в программе.
Например, можно создать набор объектов TextBox в пользовательском
диалоговом окне. От пользователя требуется ввести текст только в некоторые из
них. В отдельные поля вводить текст не обязательно. Можно использовать
свойство Tag для идентификации полей, которые необходимо заполнять. В этом
случае значение свойства Tag— это строка, например, Required. Поэтому при
написании кода обработки введенных пользователем данных можно ссылаться на
свойство Tag.
Пример, приведенный ниже, представляет функцию, которая проверяет все
элементы управления TextBox объекта UserFoma1 и возвращает количество пустых
текстовых полей, "требующих" введения информации.
Задание 3. Расширьте форму из первого задания, добавив несколько
текстовых полей (обязательные и необязательные). Установите проверку на
поля, которые требуют обязательного заполнения. Если пользователь их не
заполняет, то должно выводиться сообщение о том, что обязательные поля
необходимо заполнить.
10/26
Курс подготовила
Петрова Светлана Юрьевна
Выбор диапазона
Некоторые встроенные диалоговые окна Excel
позволяют
пользователю выбирать диапазон. Пользователь может или ввести имя
диапазона непосредственно, или применить мышь для выделения диапазона
на листе.
Пользовательское диалоговое окно также обеспечивает подобную
функциональность. Это достигается в результате применения элемента
управления RefEdit. Данный элемент выглядит иначе, чем элемент выбора
диапазона во встроенных диалоговых окнах Excel, однако работает точно так
же. Если пользователь щелкнет на небольшой кнопке в правой части
элемента управления, то диалоговое окно временно исчезнет, а на экране
будет отображен небольшой указатель выбора диапазона (именно так все
происходит и при использовании встроенного диалогового окна Excel).
На рис. ниже представлено пользовательское диалоговое окно с
добавленным элементом управления RefEdit.
Рис.4 Форма
Это диалоговое окно выполняет простую математическую операцию
над всеми не содержащими формул и непустыми ячейками указанного диапазона. Выполняемая операция задается активным переключателем
OptionButton.
Ниже изложены некоторые соображения, о которых следует помнить
при использовании элемента управления RefEdit.

Элемент управления RefEdit возвращает текстовую строку, которая
представляет выбранный диапазон. Можно преобразовать эту строку в
объект Range. Для этого используется следующий оператор.
10/26
Курс подготовила
Петрова Светлана Юрьевна

Удачной практикой считается инициализация элемента управления
RefEdit для представления текущего выделения. Для этого в процедуре
UserForm_Initialize воспользуйтесь таким оператором.

Элемент управления RefEdit не всегда возвращает действительный
диапазон. Выделение диапазона указателем мыши — это один из способов
присвоения значения данному элементу управления. Пользователь может
ввести в поле любой текст, а также отредактировать или удалить уже
отображаемый текст. Таким образом, предварительно необходимо
убедиться, что диапазон является допустимым. Следующий код — это
пример одного из способов проверки допустимости введенного значения.
Если определено, что значение неправильное, то пользователю выдается
сообщение, а элемент управления Ref Edit становится активным,
предоставляя возможность ввести корректный диапазон.

Пользователь может щелкнуть на вкладке одного из листов при выборе
диапазона, применяя элемент управления RefEdit. Поэтому не всегда
выбранный диапазон находится на активном рабочем листе. Если
пользователем выбран другой лист, то адрес диапазона указывается после
имени листа, на котором этот диапазон находится.
 Если необходимо получить от пользователя выделение в виде одной
ячейки, то можно указывать верхнюю левую ячейку выделенного
диапазона. В данном случае воспользуйтесь следующим оператором.
Опишем событие происходящие при нажатии кнопки Выполнить (в
коде эта кнопка называется CommandButton1) на форме (рис.4) - User Form5:
10/26
Курс подготовила
Петрова Светлана Юрьевна
Задание 4. Если Вы обратили внимание, написанная выше процедура,
позволяет провести только сложение значений ячеек диапазона с
операндом, который вводит пользователь в текстовое поле TextBox1.
Допишите процедуру, так чтобы можно было задействовать
оставшиеся OptionButton, установленные на форме, для деления,
умножения и вычитания.
10/26
Download