[an error occurred while processing this directive] | |||||||||||||||||
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
15-й час. Автоматизация экранных формПеред автоматизацией экранных форм нужно выяснить для себя следующее. Первое, каким будет внешний вид формы при ее загрузке. Второе, надо описать поведение элементов управления, определить их доступность для пользователя. Кроме того, нужно продумать процедуру проверки корректности вводимых данных, а затем способ записи их в рабочий лист. Способам реализации этих задач посвящается текущий час, а в качестве "подопытного" материала будем использовать экранную форму, созданную в предыдущем часе. В этом часе будут рассмотрены следующие вопросы.
Инициализация значений экранной формыВы должны заранее подумать о том, что произойдет при загрузке экранной формы. Например, желательно поместить текущую дату в поле ввода Дата - пользователи будут весьма благодарны за то, что отпадет необходимость вводить дату. Чтобы сделать это и все остальное, что должно выполняться при открытии формы, нужно создать процедуру загрузки формы (назовем ее ЗагрузкаФормы). В этой процедуре должен быть код, задающий значения для элементов управления формы. Эта процедура должна, кроме того, вставить заранее созданные на рабочем листе списки значений в списки экранной формы. В нашем случае (напомню, что мы продолжаем работать с экранной формой, созданной в предыдущем часе) надо иметь списки значений для полей со списками Тип расходов и Тип карты. Для создания списков значений выполните следующие действия.
в ячейку В2: Пляжный зонтик, в ячейку B3: Аренда велосипеда, в ячейку В4: Уроки гольфа, в ячейку В5: Гольф, 18 лунок, в ячейку В6: Гольф, 9 лунок, в ячейку В7: Полотенце для бассейна, в ячейку В8: Теннисный корт, в ячейку В9: Уроки тенниса.
Чтобы задать имя диапазону ячеек, выделите этот диапазон и в поле Имя (с левой стороны в строке формул) введите имя диапазона. Нажмите клавишу <Enter>.
в ячейку F2: Mastercard, в ячейку F2: Visa, в ячейку F2: American Express, в ячейку F2: Diner's Club.
Теперь необходимо связать введенные значения и соответствующие им элементы управления экранной формы. Для этого выполните следующее.
Рис. 15.1. Окно кода для создания и редактирования процедур, управляющих экранной формой
Ключевой момент при инициализации значений в форме - использование процедуры, реагирующей на событие Activate (открытие формы). Используя подобный код, можно задать значения флажков, переключателей и любых других элементов управления.
Рис. 15.2. Автоматическое заполнение списков и полей формы при ее открытии Полный код процедуры UserForm_Activate приведен в листинге 15.1. Листинг 15.1. Процедура UserForm Activate
Для задания значений списков используются одинаковые группы операторов. Так, для списка Типы расходов значения задаются следующими операторами:
Свойство RowSource ссылается на имя диапазона, где хранятся значения элементов списка. (Очевидно преимущество использования имени диапазона по сравнению с адресом диапазона - меньше вероятность неправильно ввести ссылку, возможность в дальнейшем переопределить диапазон без изменения кода процедуры, лучшая читаемость кода.) Свойство ListIndex определяет, какой элемент списка будет отображаться при открытии формы - все элементы списка пронумерованы, начиная с нуля. По-иному задается значение для поля Дата:
Функция Now возвращает текущую дату, функция Format форматирует текущую дату в соответствии с форматом dd/mm/yy (день месяца, порядковый номер месяца, две цифры года). Вызов экранной формыВы еще не думали о том, как вызвать на экран форму во время выполнения приложения или просто из рабочего листа? Вот самый простой способ вызова экранной формы из окна рабочей книги: надо написать простенькую процедуру, вызывающую экранную форму, а затем назначить эту процедуру какому-либо объекту в окне рабочей книги, например командной кнопке, кнопке панели инструментов или просто пункту меню. В следующем 16-м часе "Панели инструментов" мы подробно рассмотрим методы работы с панелями инструментов, а в 17-м часе "Работа с меню" - методы работы с меню. Ранее (в начале книги) мы уже рассматривали способы назначения элементам интерфейса макросов и процедур. Поэтому с назначением какой-нибудь кнопке панели инструментов процедуры, вызывающей экранную форму, у вас не должно быть проблем. А вызывающая процедура может состоять только из одной строки:
Метод Show загружает экранную форму в память компьютера и выводит ее на экран. Для создания такой процедуры выполните следующее.
Для вставки в рабочий лист командной кнопки надо отобразить панель инструментов Формы.
Итак, вызов экранной формы осуществляется с помощью метода Show. В следующих главах книги созданную здесь процедуру ЗагрузкаФормы мы будем использовать для назначения ее кнопке панели инструментов и пункту меню. Управление поведением формыПроцедура, выводящая форму на экран, создана. Теперь надо подумать о том, как форма будет себя вести на экране, т.е. продумать реакцию ее элементов на различные события, вызываемые действиями пользователя. Например, при установке флажка Включить в группе элементов Дополнительно надо снять блокировку с поля ввода сумму. Надо также снять блокировку с полей, принимающих информацию о кредитной карте, если выбран переключатель Кредитная карта. За подобные действия должна отвечать процедура, вызываемая событием Change (Изменить). Это событие генерируется всякий раз, когда изменяется значение свойства Value (Значение) какого-либо элемента управления. В данном случае, чтобы изменить свойства связанных элементов, надо сначала изменить значение свойства Value на True флажка Включить и переключателя Кредитная карта. Выполните следующую последовательность действий.
Рис. 15.3. После открытия формы некоторые элементы недоступны
Рис. 15.4. С помощью события Change все элементы стали доступны В процедуре optCreditCard_Change событие Change использовалось для проверки значения свойства Value, и в зависимости от этого значения блокировка элементов управления или снималась (свойство Enabled равно True) или устанавливалась (свойство Enabled равно False). Но при обработке события Change вы не ограничены работой только со свойством Enabled, можно изменить значения таких свойств элементов управления, как Text, Value или Caption. Проверка вводимых данныхПосле того как пользователь ввел всю нужную информацию в форму, он щелкает на кнопке Сохранить. Что должно произойти после этого? Процедура, которая запускается на исполнение после щелчка на кнопке Сохранить, должна проверить правильность введенных данных и в случае их корректности записать данные в рабочий лист. Начнем с проверки правильности данных. Понятие правильности (корректности) данных зависит от выполняемого приложения. Поле ввода может принять все, что вы способны ввести с клавиатуры. И если вы ввели какую-нибудь абракадабру, то это не значит, что введенное значение некорректно. Все зависит от тех ограничений, которые накладывает приложение на вводимые данные. Например, на разрабатываемой нами экранной форме есть поле ввода Номер комнаты. Очевидно, что корректными значениями для этого поля будут целые положительные числа. Далее предположим, что в нашем отеле сдаются только комнаты с номерами от 101 до 730. В этом случае корректными данными для поля будут лишь целые числа из указанного интервала. Аналогичные ограничения должны накладываться на значения полей Тип расходов, Сумма, Дата, а также на значения полей группы Способ оплаты. (Обратите внимание на маленькую, но существенную деталь: проверку поля сумму и полей с данными о кредитной карте надо выполнять только тогда, когда эти поля разблокированы.) Надеюсь, вы поняли, от чего зависит правильность данных, и сейчас мы приступим к созданию процедуры, которая будет выполняться после щелчка на кнопке Сохранить и проверять корректность введенных данных. Выполните следующие действия.
Вы, конечно, заметили, что в этой процедуре проверялись свойства Text и Value элементов управления. Рассмотрим подробнее код одной такой проверки, показанный в листинге 15.2. Листинг 15.2. Проверка значения поля Номер комнаты
Здесь оператор If проверяет, находится ли значение поля txtRoomNumber (Номер комнаты) в интервале от 101 до 730. Отметим применение функции Val, преобразующей строковое значение в числовое. Она необходима из-за того, что значение свойства Text (т.е. введенное в поле значение) имеет строковый (текстовый) тип данных. Вы обратили внимание, что здесь нет проверки той ситуации, когда пользователь вообще ничего не ввел в это поле? Просто эта ситуация подпадает под тот случай, когда введенное значение меньше 101.
Рис. 15.5. Одно из многих окон с сообщениями о некорректности введенных данных Метод SetFocus делает активным указанный элемент управления формы. Оператор выхода из процедуры Exit Sub используется после каждой проверки, так как нет смысла продолжать процедуру, если ошибка обнаружена и выведено соответствующее окно сообщения. Если ошибки не обнаружены, то с помощью оператора Unload Me форма выгружается из памяти компьютера и удаляется с экрана. Сохранение данных, введенных в формуПроверка корректности данных - это только одна задача, которую решает процедура cmdSave_Click. Вторая задача, решаемая данной процедурой, заключается в записи данных, введенных в форму, в ячейки рабочего листа. Для этого применяются уже проверенные на корректность значения свойств Text и Value элементов управления. Используйте следующие инструкции для завершения написания процедуры cmdSave_Click.
Теперь изучим подробнее вторую часть кода процедуры. Рассмотрим начало записи данных в рабочий лист.
Рис. 15.6. Все введенные в форму данные скопированы в рабочий лист Здесь сначала делается текущим рабочий лист Расходы, а затем - ячейка А2. Ввод данных начинается со второй строки рабочего листа, так как в первой размещены заголовки столбцов. Далее проверяется, занята ли ячейка А2. Если нет, то начинается запись данных. Если ячейка А2 занята, то находится последняя занятая ячейка. Здесь ведущую роль играет свойство CurrentRegion (Текущая область) объекта Range. После выделения текущей области можно определить ее размеры и, следовательно, найти первую свободную строку. Для этого используется свойство Offset (Смешение). Далее в процедуре идет непосредственно запись введенных данных в рабочий лист. Затем проверяется, установлены ли флажок Включить и переключатель Кредитная карта, и если установлены, то также переписываются данные из соответствующих полей. Для того чтобы наша форма стала функционально полностью завершенной, необходимо написать еще одну процедуру - для кнопки Отмена.
Теперь, если пользователь щелкнет на кнопке Отмена, то экранная форма удалится из памяти компьютера и с экрана. В реальных приложениях при щелчке на кнопке Отмена часто открывается окно сообщения, требующее подтверждение на закрытие формы. Надеюсь, для вас не составит большого труда добавить в процедуру cmdCancel_Click код, открывающий такое окно сообщения. РезюмеИтак, создано полнофункциональное диалоговое окно, позволяющее вводить данные, проверять их и записывать в рабочий лист. Поздравляю! Вы делаете большие успехи в программировании! Подведем промежуточные успехи. В последнем часе рассмотрена методика разработки структуры экранной формы. Этот час был посвящен автоматизации экранной формы, т.е. написанию процедур, управляющих поведением формы и ее элементов управления. Другими словами, вы прошли все этапы создания экранных форм от начала до конца. Вы знаете, как вывести форму на экран и инициализировать ее значения, как проверить корректность вводимых в форму данных и записать их в рабочий лист. Вопросы и ответыВопрос. Какие свойства элементов управления возвращают значения, введенные пользователем? Ответ. Смотрите следующую таблицу.
Вопрос. Значения элементов списков экранной формы содержатся на листе рабочей книги. Но я не хочу, чтобы другие пользователи изменяли или даже видели эти данные. Что для этого нужно сделать? Ответ. Есть несколько способов. Первый: с помощью команды Excel Формат > Лист > Скрыть можно скрыть этот рабочий лист. Другой путь программный: в процедуре рабочей книги Auto_Open установите свойство Visible (Видимый) рабочего листа как False. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеСоздайте процедуру под именем ПоказФормы, которая должна выводить на экран форму frmSplash, созданную как упражнение в 14-м часе. Создайте код, с помощью которого после щелчка на кнопке ОК в форме frmSplash будет открываться форма Гостевые расходы. Перейдите на Лист1 в рабочей книге Гость и назначьте процедуру ПоказФормы командной кнопке. |
||||||||||||||||
[an error occurred while processing this directive] |