
2 семестр / vba_2002
.pdfСвойство Значение
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.Использованиепользовательскихформ |