Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
97
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Свойство Значение

Accelerator M

Caption Мужчина

Name OptionMale

Tablndex 0

8.Добавьте в элемент управления Frame еще один элемент управления OptionButton и измените его свойства так, как представлено далее.

Свойство

Значение

Accelerator

F

Caption

Женщина

Name

Option Female

Tablndex

1

9.Добавьте в элемент управления Frame еше один элемент управления OptionButton и измените его свойства следующим образом.

Свойство Значение

Accelerator U

Caption

Другое

Name

OptionUnkrtOWfi

Tablndex

2

Value

true

10.Добавьте элемент управления CommandButton за пределами элемента управления Frame и измените его свойства.

Свойство Значение

Caption OK Default True Name OKButton Tablndex 3

11.Добавьте элемент управления CommandButton за пределами элемента управления Frame и измените его свойства, как показано ниже.

Свойство Значение

Caption Отмена Default True

Hame CancelButton Tablndex 4

ЧастьIV.Работаспользовательскимиформами

349

При создании нескольких подобных элементов управления может оказаться, что быстрее скопировать существующий элемент управления, чем добавлять новый. Для того чтобы скопировать элемент управления, удерживайте клавишу <Ctrl> при перетаскивании элемента управления, что приведет к созданию копии. После этого вам останется внести изменения ES свойствах созданной копии объекта.

Создание кода для отображения диалогового окна

После создания элементов управления на лнет необходимо добавить объект Command- B u t t o n . Эта кнопка будет запускать процедуру, которая предназначена для отображения формы UserForm. Для этого выполните следующие действия.

1.ГДереадите в OKHQ.lytcel. (воспользуйтесь комбинацией клавиш <Alt+Fll>).

2.Щелкните правой кнопкой мыши на любой панели инструментов и выберите Элементы управления из появившегося контекстного меню. Excel отобразит соответствующую панель инструментов на экране. Данная панель подобна панели Toolbox в VBE.

3.Воспользуйтесь панелью инструментов Элементы управления, чтобы добавить на лист объект Кнопка. Щелкните на значке Кнопка, после этого перетащите его на лист для создания кнопки.

Измените при необходимости подпись объекта Кнопка. Для этого щелкните правой кнопкой мыши на объекте Кнопка и выберите Объект CornrnandButton^Edit из появившегося контекстного меню. После этого отредактируйте текст, который отображается на кнопке.

4.Дважды щелкните иа элементе управления Кнопка.

Это приведет к активизации VBE. В нем отображается модуль кода для листа с открытой пустой процедурой обработки событий объекта CommandButton (Кнопка), который расположен на рабочем листе.

5. Введите в процедуру C o m m a n d B u t t o n l _ c l i c k единственный оператор (рис. 13.8). Эта короткая процедура вызывает метод Show объекта UserFonti'l для отображения на экране пользовательского диалогового окна UserForm.

Puc. 13,8. Процедура CommandButtonl_ Clickвыполняетсяпослещелчкаиакнопке, расположеннойнарабочемлисте

Проверка

Следующим этапом является проверка процедуры, отображающей диалоговое окно.

После щелчка на кнопке на рабочем листе ничего не произойдет. Вернее, кнопка будет выделена, но никакие действия она не инициирует. Это связано с тем, что Excel все еще находится в режиме конструктора, в который он автоматически переходит каждый раз, когда с помощью панели инструментов Элементы управления на лист добавляется новый элемент управления. Для того чтобы покинуть режим конструктора, щелкните на кнопке Выход из режима конструктора на панели инструментов Элементы управления.

350

Глава 13. Использование пользовательских форм

Как только Excel выйдет из режима конструктора, щелчок на кнопке приведет к отображению пользовательского диалогового окна (рис. 13.9).

Как только диалоговое окно будет отображено, введите произвольный текст в текстовом поле и щелкните на кнопке ОК, В результате — ничего не происходит: что совершенно справедливо, так как для объекта UserForm не создано ни одной процедуры обработки событий.

Рис. 73.9. Событие Click объекта CoimandButton приводит к отображению пользовательского диалоговогоокна

Щелчокна кнопкех встрокезаголовкадиалоговогоокнапозволитзакрытьего.

Добавление процедур обработки событий

В этом разделе рассматривается задача создания процедур, которые обрабатывают события, возникающие после открытия пользовательского диалогового окна. Выполните следующие действия.

1.Нажмите комбинацию клавиш <Alt+Fl 1>. Это приведет к активизации VBE.

2.Удостоверьтесь, что пользовательское диалоговое окно отображено на экране и, если это так, дважды щелкните на кнопке Отмена. Таким образом, будет активизировано окно кода для объекта кнопки формы UserForm, также будет добавлена пустая прсцедура— CancelButton _ click . Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия события» которое обрабатывает процедура.

3.Модифицируйте процедуру, как показано ниже (это обработчик события c l i c k объекта CancelButton).

Private Sub CancelButton_Click() Unload UserForml

End Sub

Данная процедура выполняется после щелчка пользователем на кнопке Отмена. Она вызывает выгрузку формы UserForm из памяти.

4.Нажмите комбинацию клавиш <Shift+F7>, чтобы повторно отобразить объект UserForml (или щелкните на значке View Object в верхней части окна Project Explorer).

5.Дважды щелкните на кнопке ОК и введите следующую процедуру (это обработчик события Click, объекта OKButton).

Private Sub OKButton_Click()

' Активизация листа

Sheets("Лист1").Activate

Определение следующей пустой строки

ЧастьIV.Работаспользовательскимиформами

351

NextRow = _

Application.WorksbeetFunction.CountA(Range!"A:A"}) + 1

1Передача имени

Cells(NextRow, 1) = TextMame.Text

1Передача пола

If OptionMale Then Cells(NextRow, 2} = "Мужчина"

I£ OptionFema1e Then Cells(NextRow, 2) = "Женщина"

If OptionUnknown Then Cells{NextRow, 2) = "Другое"

' Очистка элементов управления для следующих записей TextKame.Text = ""

OptionUnknown - True TextName.SetFocus

End Sub

6.Перейдите в окно Excel и щелкните на кнопке еще раз для того, чтобы отобразить пользовательское диалоговое окно. Запустите процедуру повторно.

Элементы управления диалогового окна должны функционировать правильно. На

рис. 13.10 показан результат правильного поведения диалогового окна.

Рис.13.10.Вызовпользовательского

диалоговогоокна

Процедура QKButton_Click работает следующим образом: сначала она. проверяет, что лист Лист1 активен. После этого запускается функция Excel СЧЕТ (COUNT) для определения следующей пустой ячейки в столбце А. Затем текст из текстового поля Text Box передается в определенную ячейку столбца А. С помощью операторов If определяется выделенный элемент управления O p t i o n B u t t o n , что обеспечивает запись соответствующего текста в столбец В {Мужчина, Женщина, Другое). Наконец, диалоговое окно перезапускается— чтобы обеспечить возможность введения следующей записи. Заметим, что щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для завершения ввода данных (и выгрузки пользовательского диалогового окна) щелкните на кнопке Отмена.

Проверка правильности введенных данных

Приведенному в этом разделе примеру следует уделить особое внимание. Возможно, вы заметили, что не устранена небольшая проблема — отсутствует проверка введенных в текстовом поле данных (вы не знаете, ввел ли пользователь свое имя). Следующий код добавлен в процедуру O K B u t t o n _ c l i c k перед оператором вставки текста на рабочий лист. Он проверяет, ввел ли пользователь свое имя (на самом деле проверяется наличие любого текста) в поле TextBox. Если текстовое поле TextBox осталось пустым, то выводится соответствующее

352

Глава 13. Использование пользовательскихформ

сообщение, и текстовое поле снова становится активным. Таким образом, пользователь сможет приступить к введению своего имени. Оператор E x i t Sub завершает выполнение процедуры без выполнения дополнительных действий.

Проверка введения имени

If TextName.Text = "" Then MsgBox "Введите имя." TextName.SetFocus

Exit Sub End If

Заработало!

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

События объекта UserForm

Каждый элемент управления в форме UserForm (а также сам объект UserForm) разрабатываются, чтобы реагировать на определенные события. Эти события возникают в результате действий пользователя или генерируются программой Excel. Например, щелчок на кнопке CommandButton приводит к возникновению события C l i c k объекта CommandButton. Можно создать код, который будет выполняться при возникновении определенного события.

Некоторые действия приводят к возникновению одновременно нескольких событий. Например, щелчок на кнопке со стрелкой "вверх" в элементе управления S p i n B u t t o n приведет к возникновению события SpinUp и события Change. После того, как пользовательское диалоговое окно будет отображено с помощью метода Show, Excel генерирует события I n i t i a l i z e и A c t i v a t e объекта UserForm.

Кроме того, Excel поддерживает события объектов Sheet, chart и ThisWorkbock. Эти типы событий рассматриваются в глаее 18.

Получение дополнительной информации о событиях

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

1.Добавьте элемент управления в пользовательское диалоговое окно.

2.Дважды щелкните на элементе управления, чтобы открыть модуль кода для объекта UserForm. VBE вставит пустую процедуру обработки события, принятого по умолчанию

3.Щелкните на раскрывающемся списке в правом верхнем углу окна модуля и просмотрите полный список событий, которые поддерживаются текущим элементом управления (рис. 13.11).

4.Выберите событие из списка, и VBE создаст пустой обработчик события.

ЧастьIV.Работаспользовательскимиформами

353

Рис. J3.1I. Список событий для элемента управления CheckBox

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

Имя процедуры обработки событий содержит полное имя того объема, который генерирует событие. Таким образом, если изменить имя элемента улраэления, то необходимо внести соответствующие изменения и в имя процедуры обработки события. Изменение имени процедуры автоматически не выполняется! Для того чтобы облегчить собственную жизнь, следует присвоить описательные имена элементам управления до того, как приступить к созданию процедуры обработки соответствующих событий.

События объекта UserForm

Несколько событий непосредственно связано с отображением и выгрузкой объекта UserForm.

I n i t i a l i z e — происходит перед загрузкой и отображением формы UserForm. He происходит, если объект UserForm до этого был скрыт.

Activate — происходит в момент отображения объекта UserForm,

Deactivate — происходит в момент деактивизации объекта UserForm. Не происходит при скрытии формы UserForm.

QueryClose — происходит перед выгрузкой объекта UserForm.

Terminate — происходит после выгрузки объекта UserForm.

Часто важно правильно выбрать подходящее событие для процедуры обработки события и проанализировать порядок генерирования событий. Использование метода Show приводит к возникновению событий i n i t i a l i z e и Activate (в указанном порядке). Результатом выполнения метода Load является только генерирование события i n i t i a l i z e . Применяя метод Unload, вы вызываете появление событий QueryClose и Terminate (в указанном порядке). Метод Hide не генерирует ни одно из перечисленных событий.

На Web-узле издательства, находится рабочая книга, которая управляет описанными событиями и отображает в момент возникновения события специальное сообщение. Если изучение событий объекта UserForm у вас связано с большими трудностями, то, проанализировав код этого примера, вы сможете ответить на многиевопросы.

Пример: события элемента управления SpinButton

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

354

Главе 13. Использованиепользовательскихформ

На Web-узле издательства содержится рабочая книга, которая демонстрирует применение событий, генерируемых объектами SpinButton и UserForm (первый содержится во втором). Рабочая книга содержит несколько процедур обработки событий — по одной на каждое событие элемента управления SpinButton и объекта UserForm. Каждая из этих процедур создает окно сообщения, которое указывает на возникновение соответствующего события.

В табл. 13.1 перечислены все события, связанные с элементом управления SpinButton.

Таблица 13.1. События объекта SpinButton

Событие

Описание

Af t e r u p d a t e

Происходит после того, как элемент управления изменяется с помощью поль-

 

зовательского интерфейса

BeforeDragOver

Происходит в процессе операции перетаскивания объекта

Befo r e D r o p o r P a s t e

Происходит перед тем, как пользователь отпустит перетаскиваемый объект или

 

скопирует его из буфера обмена

Bef oreUpdate

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

change

Происходит в момент изменения значения свойства v a l u e

E n t e r

Происходит перед тем, как элемент управления S p i n B u t t o n будет активи-

 

зирован после другого элемента управления этой же формы UserForm

Error

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

 

элемент управления не сможет передать информацию об ошибке е вызываю-

 

щую программу

Exit

Происходит непосредственно перед тем, как элемент управления деактивизи-

 

руется, активным становится другой элемент управления текущей формы

KeyDown

Происходит, когда пользователь нажимает клавишу и объект активный

Keypress

Происходит, когда пользователь нажимает клавишу по вводу символа

кеуир

Происходит, когда пользователь отпускает клавишу и объект активный

spinDown

Происходит, когда пользователь щелкает на нижней {или левой} кнопке элемен-

 

та управления S p i n B u t t o n

s p i n u p

Происходит, когда пользователь щелкает на верхней (или правой) кнопке эле-

 

мента управления S p i n B u t t o n

Пользователь может управлять объектом SpinButton с помощью мыши или {если элемент управления активен) клавиш управления курсором.

События мыши

Когда пользователь щелкает на верхней кнопке элемента управления SpinButton, происходят следующие события.

1.Enter (генерируется только в том случае, если элемент управления неактивен).

2.Change.

3.SpinUp.

События клавиатуры

Пользователь может нажать клавишу <ТаЬ> для того, чтобы сделать активным элемент управления SpinButton . Только после этого можно использовать клавиши управления курсором

ЧастьIV. Работаспользовательскимиформами

355

для изменения значения элемента управления. Если все именно так и происходит, то события генерируются в следующем порядке.

1.Enter.

2.KeyDown.

3.Change.

4.SpinUp.

События, генерируемые кодом?

Элемент управления SpinButton может изменяться выполняющимся кодом VBA, что также провоцирует возникновение соответствующих событий. Например, представленный далее оператор устанавливает свойства Value элеменга управления SpinButton в значение О, а "это приводит к возникновению события Change. Такой результат достигается только в том случае, если исходное свойство Value не равно нулю.

SpinButtonl.Value = 0

Вы вправе предположить, что выполнить отмену генерирования событий можно, установив свойство EnableEvents объекта Application в значение False. К сожалению, это свойство поддерживается только для событий, которые являются "истинными" объектами Excel: Workbook, Worksheet и Chart.

Совместное использование элементов управления SpinButton и TextBox

Элемент управления SpinButton имеет свойство Value, но не имеет возможности отображать значение этого свойства. В большинстве случаев необходимо, чтобы пользователь мог изменить значение элемента управления SpinButton непосредственно, а не многократно щелкая на элементе управления.

Эффективным решением может стать объединение элемента управления SpinButton с элементом управления TextBox, что позволяет пользователю вводить значение элемента управления SpinButton непосредственна, используя для этого поле элемента управления TextBox. Кроме того, щелчок на элементе управления SpinButton позволит изменить значение, отображаемое в элементе управления TextBox.

На рис. 13.12 приведен простои пример. Свойство Min элемента управления SpinButton имеет значение 1, а свойство Мах— 100. Таким образом, щелчок на одной из стрелок элемента управления SpinButton приводит к изменению значения в пределах от 1 до 100,

Рис. 13.12. Элемент управления SpinButton, совмещенный сэлементом управления TextBox

Эта. рабочая книга находится на Web-узле издательства.

Код, реализующий "связывание'" элементов управления S p i n B u t t o n и TextBox, достаточно простой. В целом все сводится к созданию процедур обработки событий, которые будуг

356

Глава 13. Использование пользовательских форм

синхронизировать свойство Value элемента управления S p i n B u t t o n и свойство T e x t элемента управления TextBox.

Представленная далее процедура выполняется каждый раз при возникновений события Change элемента управления S p i n B u t t o n . Таким образом, процедура выполняется тогда, когда пользователь щелкает на элементе управления S p i n B u t t o n или изменяет его значение, нажав одну из клавиш управления курсором.

Private Sub SpinButtonl_Change() TextBoxl.Text = SpinButtonl-Value

End Sub

Процедура просто приравнивает значение свойства Value элемента управления S p i n - B u t t o n к свойству T e x t элемента управления TextBox. В данном случае элементы управления имеют имена, заданные по умолчанию ( S p i n B u t t o n l и TextBoxl) . Если пользователь введет значение непосредственно в элемент управления TextBox, то генерируется событие change, после чего должен быть выполнен следующий код:

P r i v a t e Sub TextBox l_CtiangeО

NewVal = Val(TextBoxl.Text)

If NewVal >= SpinButtonl.Min And _ MewVal <= SpinButtonl.Max Then _ SpinButtonl.Value = NewVal

End Sub

Эта процедура начинается с вызова функции VBA Val, которая преобразует текст элемента управления TextBox в числовое значение (если элемент управления TextBox содержит строку, то функция Val возвращает значение 0). Следующий оператор определяет, попадает ли значение в указанный диапазон допустимых значений. Если это так, то свойство Value элемента управления S p i n B u t t o n устанавливается в значение, которое введено в поле элемента управления TextBox.

Пример организован таким образом, что шелчок на кнопке ОК (которая называется OKButton) передает значение элемента управления S p i n B u t t o n в активную ячейку. Процедура обработки события C l i c k элемента управления CommandButton выглядит следующим образом:

Private sub OKButton_Click()

1 Введение значения в активную ячейку

If CStr(SpinButtonl.Value} = TextBoxl.Text Then ActiveCell = SpinButtonl.Value

Unload Me

Else

MsgBox "Неправильное значение•", vbCritical TextBoxl.SetFocus

TextBoxl.SelStart = 0 TextBoxl.SelLength = Len{TextBoxl.Text)

End If End Sub

Данная процедура проводит последнюю проверку: анализируется текст, введенный в поле элемента управления TextBox, и значения элемента управления S p i n B u t t o n . Такая процедура обрабатывает ситуации неверного ввода данных. Например, если пользователь введет в поле элемента управления TextBox текст Зг, то значение элемента управления S p i n B u t t o n не изменится, а результат, который помешается в активную ячейку будет отличным от ожидаемого. Обратите внимание, что значение свойства V a l u e элемента управления S p i n B u t t o n преобразуется в строку с помощью функции CStr . Это позволяет предотвратить ошибку, которая возникает, когда числовое значение сравнивается с текстовым. Если значение элемента

Часть /V. Работа с пользовательскими формами

357

управления S p i n B u t t o n не соответствует содержимому элемента управления TextBox, то на экране отображается специальное сообщение. Причем объект TextBox активен, а его содержимое — выделено (с помощью свойств S e l S t a r t и S e l L e n g t h ) . Таким образом, пользователю проще исправить неправильные значения.

О свойстве Tag

Каждый объект UserForm и каждый элемент управления имеют свойство Tag. Это свойство не представляет конечные данные и по умолчанию не имеет значения. Свойство Tag можно использовать для хранения информации, которая будет применена в программе.

Например, можно создать набор объектов TextBox в пользовательском диалоговом окне. От пользователя требуется ввести текст только в некоторые из них. В отдельные поля вводить текст не обязательно. Можно использовать свойство Tag для идентификации полей, которые необходимо заполнять. В этом случае значение свойства Tag — это строка, например, Required. Поэтому при написании кода обработки введенных пользователем данных можно ссылаться на свойство Tag.

Пример, приведенный ниже, представляет функцию, которая проверяет все элементы управления TextBox объекта UserForml и возвращает количество пустых текстовых полей, "требующих" введения информации.

Function EmptyCount{)

Dim c t l As Control Emp tyCount = 0

For Each ctl In UserForml.Controls If TypeName(ctl) = "TextBox" Then

If ctl.Tag = "Required" Then If ctl.Text a "" Then

EmptyCount = EmptyCount + 1 End If

End If End If

Next ctl End Function

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

Ссылка на элементы управления пользовательского диалогового окна

При работе с элементами управления, находящимися в форме UserForm, код VBA обычно содержится в модуле кода объекта UserFonn. Кроме того, на элементы управления диалогового окна можно ссылаться из модуля кода VBA общего назначения. Для выполнения этой задачи необходимо задать правильную ссылку на элемент управления, указав имя объекта UserForm. В качестве примера рассмотрим процедуру, которая введена в модуле кода VBA. Эта процедура отображает пользовательское диалоговое окно, которое называется UserForml.

Sub GetDataO

UserForml.Show

End Sub

Предполагается, что диалоговое окно UserForml содержит текстовое поле (TextBoxl). Вам же необходимо указать значение текстового поля по умолчанию. Процедуру можно изменить следующим образом.

358

Глава13.Использованиепользовательскихформ

Соседние файлы в папке 2 семестр