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

2 семестр / vba_2002

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

Вы можете использовать и другой тип форматирования для изменения внешнего вида элементов управления: например, изменить значение свойства SpecialEf fee t для элемента управления Frame, как показано на рис. 15.1.

Рис. 15.1. Это диалоговое окно UserForm служит контейнером индикатора текущего состояния

Создание процедуры обработки события

В данном случае важно, чтобы процедура автоматически запускалась при отображении диалогового окна UserForm. Один из вариантов подразумевает использование события I n i t i a l i z e . Но это событие возникает еще до того, как диалоговое окно отображается на экране, поэтому такой вариант не подходит. С другой стороны, событие A c t i v a t e возникает в тот момент, когда диалоговое окно UserForm отображается на экране, поэтому в данном случае можно остановиться на его использовании.

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

P r i v a t e Sub UserForm_Activate()

Call Main End Sub

Ниже приведена процедура Main. Эта демонстрационная программа просто вставляет случайные числа в ячейки активного листа. В процессе своей работы макрос изменяет ширину элемента управления Label и отображает процент завершения задачи в строке заголовка элемента управления Frame. Данная процедура лишь иллюстрирует использование индикатора текущего состояния. Но вы всегда можете использовать собственную процедуру, которая выполняет более полезную функцию.

Sub

Main()

 

 

'

Вставить

случайные числа в ячейки активного листа

 

Cells.Clear

 

Counter = 1

 

RowMax

=200

 

ColMax

= 2 5

 

For r = 1 To RowMax

 

For с = 1 To ColMax

 

 

Cellsfr, c) = IntfRnd * 1000)

 

 

Counter = Counter + 1

 

Next

с

 

PctDone = Counter / (RowMax * ColMax)

 

Call

UpdateProgress{PctDone}

 

Next r

 

 

Unload UserForml End Sub

Процедура Main содержит цикл (фактически, два цикла). Внутри цикла вызывается процедура updateProgress. Она принимает один аргумент: значение в диапазоне от 0 до J00, которое представляет процент завершения выполняемой задачи:

Sub UpdateProgress(Pet)

 

With UserForml

 

.FrameProgress.Caption = Format(Pct,

"0%")

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

389

.LabelProgress.Width = Pet * (.FrameProgress.Width - 10)

.Repaint End With

End Sub

Создание процедуры запуска

Все, что осталось сделать — это написать процедуру отображения диалогового окна U s e r - Form. Введите следующий код в модуль VBA.

Sub ShowDialog() UserForml.LabelProgress.width • 0 UserForml.Show

End Sub

Как она работает

При выполнении процедуры ShowDialog ширина объекта L a b e l устанавливается в значение 0. После этого вызывается метод Show объекта UserForml . Это приводит к отображению диалогового окна UserForm (которое выполняет роль индикатора текущего состояния). Когда диалоговое окно UserForm отображается на экране, происходит событие A c t i v a t e , которое приводит к выполнению процедуры Main. Процедура Main периодически обновляет ширину элемента управления Label . Обратите внимание, что процедура использует метод R e p a i n t объекта UserForm. Без этого оператора изменения в элементе управления L a b e l не будут представлены на экране. Перед завершением выполнения процедуры последний оператор выгружает диалоговое окно UserForm из памяти.

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

Вывод информации о текущем состоянии с помощью элементауправленияMultiPage

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

Проект завершен и отлажен.

В проекте используется диалоговое окно UserForm (без элемента упра&тения Multi - Page) с целью запустить долго выполняющийся макрос.

Существует метод оценки степени завершения выполняемой задачи

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

Модификация диалогового окна UserForm

На данном этапе предполагается, что диалоговое окно UserForm уже настроено. Вам осталось добавить элемент управления MultiPage . Первая страница элемента управления M u l t i P a g e будет содержать все первоначальные элементы управления. На второй странице располагаются эле-

390

Глава 15. Использование диалоговых окон UserForm

менты управления, которые используются для отображения индикатора текущего состояния. Когда макрос начнет выполняться, в коде VBA значение свойства Value элемента управления M u l t i - Page изменится. В результате будут скрыты исходные элементы управления и отображены элементы управления, которые используются для создания индикатора текущего состояния.

Первым шагом будет добавление элемента управления M u l t i P a g e в диалоговое окно UserForm. После этого необходимо переместить все существующие в диалоговом окне U s e r - Form элементы управления на первую страницу элемента управления Mu 11 i Page.

Затем следует активизировать вторую страницу элемента управления M u l t i P a g e и настроить ее так, чтобы она выглядела, как показано на рис. 15.2. В данном случае используется та же комбинация элементов управления, что и в предыдущем примере.

1.Добавьте элемент управления Frame и назовите его F r a m e P r o g r e s s .

2.Добавьте элемент управления Label внутрь элемента управления Frame и назовите

его L a b e l P r o g r e s s . Удалите заголовок элемента управления Label и в качестве фона установите красную заливку.

3.Добавьте еще один элемент управления L a b e l для того, чтобы отображать описание выполняющейся задачи (этот элемент управления добавлять не обязательно).

Рис. }5,2. Вторая вкладка элемента управления Mul tiPage, которая используется для отображения индикаторатекущегосостояния

4.После этого активизируйте элемент управления MultiPage (элемент управления целиком, а не одну из его вкладок) и установите его свойство S t y l e в значение 2 - fmTabStyltN me (это приведет к скрытию вкладок на страницах элемента управления). Самым простым способом выбора элемента управления M u l t i P a g e является использование выпадающего списка в диалоговом окне Properties. Скорее всего, понадобится изменить размеры объекта M u l t i P a g e для того, чтобы учесть отсутствие ярлыков вкладок.

Вставка процедуры UpdateProgress

Вставьте следующую процедуру в модуль кода диалогового окна UserFarm.

Sub UpdateProgress(Pet)

With UserForml

.FrameProgress.Caption = Format(Pet, "0%")

.LabelProgress.Width = Pet * (.FrameProgress.Width - 10)

.Repaint End With

End Sub

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

Изменение процедуры

Далее необходимо модифицировать процедуру, которая выполняется при щелчке пользователя на кнопке ОК. Данная процедура выступает обработчиком события C l i c k и называется OKButton _ Click . Для начала необходимо вставить оператор в начало процедуры:

MultiPagel.Value = 1

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

391

Этот оператор приводит к активизации иторой вкладки элемента управления MultiPage (той страницы, на которой отображается индикатор текущего состояния).

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

Call UpdateProgress(PctDone)

Как это работает

Данная техника довольно проста, кроме того, она требует использования только одного диалогового окна UserForm. В коде программа переходит к другой странице элемента управления MultiPage и превращает нормальное диалоговое окно в индикатор текущего состояния.

Отображение индикатора текущего состояния без использования элемента управления MultiPage

Пример, приведенный в этом разделе подобен методу, представленному в предыдущем разделе. Но рассмотренная далее методика немного проще, так как не требует применения элемента управления MultiPage . Вместо :>того индикатор текущего состояния содержится в нижней части диалогового окна UserForm. Для того чтобы элементы управления, составляющие индикатор текущего состояния, изначально не были видны, высота диалогового окна UserForm уменьшена до соответствующего размера. Как только приходит время отображать индикатор текущего состояния, высота диалогового окна UserForm увеличивается, что делает индикатор видимым на экране.

На Web-узле издательства содержится пример, демонстрирующий использование этой методики.

На рис. 15.3 показано диалоговое окно UserForm в редакторе VBE. Свойство Height диалогового окна UserForm имеет значение 170. Но перед тем, как отобразить диалоговое окно UserForm, значение свойства Height устанавливается равным 120 (это приводит к тому, что элементы управления, представляющие индикатор текущего состояния, становятся невидимыми). Как только пользователь щелкнет на кнопке ОК, код VBA изменит значение свойства Height на 170. Для этого используется следующий оператор:

Me.Height = 1 7 0

Pvc. 15.3. Уменьшение высоты диалогового окна UserForm приведет к скрытию элементовуправления,составляющихиндикатортекущегосостояния

392 Глава 15. Использованиедиалоговых окон UserForm

Создание мастеров

Некоторые приложения используют специальные мастера для предоставления пользователям пошаговых инструкций по выполнению определенных задач. Мастер импорта текстовых файлов Excel является хорошим примером такого подхода к решению задач. Этот мастер является последовательностью диалоговых окон, которые предоставляют пользователю информацию и запрашивают у него необходимые сведения. Часто выбор пользователя в первых диалоговых окнах влияет на содержимое последующих окон, Как правило, пользователю предоставляется возможность свободно перемещаться вперед и назад по последовательности диалоговых окон. Кроме того, он может щелкнуть на кнопке Готово, чтобы использовать значения, принятые по умолчанию.

Вы вправе также создать мастер посредством VBA-кода и последовательности диалоговых окон UserForm. Однако существует более эффективный способ создания мастера с помощью единственного диалогового окна UserForm и элемента управления M u l t i P a g e .

На рис. 15.4 показан пример простого мастера из четырех этапов. Этот мастер состоич из диалогового окна UserForm, которое содержит элемент управления M u l t i P a g e . Каждый из этапов работы мастера соответствует отдельной вкладке элемента управления M u l t i P a g e .

Рис.15.4.Этотмастер,состоящи, кием элемента управления Mul t i Page

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

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

Настройка элемента управления MultiPage

Начните с создания нового диалогового окна UserForm. После этого добавьте элемент управления M u l t i P a g e . По умолчанию он содержит две страницы. Щелкните правой кнопкой мыши на элементе управления M u l t i P a g e и вставьте достаточное количество страниц,

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

которые будут использоваться при создании мастера (по одной странице на каждый этап работы мастера). Пример мастера на Web-узле состоит из четырех этапов, поэтому элемент управления M u l t i P a g e содержит четыре страницы. Имена страниц элемента управления M u l t i P a g e в данном случае роли не играют. Свойство S t y l e элемента управления M u l t i - Page должно быть установлено в значение 2 - fmTabStyleNone. При настройке диалогового окна UserForm вкладки необходимо сделать видимыми для того, чтобы иметь возможность обращаться к разным страницам элемента управления M u l t i P a g e .

Добавьте все необходимые элементы управления на каждую страницу элемента управления M u l t i P a g e . Эти элементы будут зависеть от целей конкретного приложения. Вы также вправе изменить размер элемента управления M u l t i P a g e для того, чтобы обеспечить место для всех элементов управления.

Добавление кнопок

Далее необходимо добавить кнопки, которые будут управлять переходом между этапами работы мастера. Эти кнопки должны размещаться за пределами элемента управления Mul- t i P a g e , поскольку они используются при отображении любой страницы элемента управления M u l t i P a g e . Как правило, мастера имеют четыре стандартные кнопки.

Отмена: позволяет отменить работу мастера.

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

Далее: позволяет перейти к следующему этапу работы мастера. На последнем этапе эта кнопка должна быть неактивна.

Готово: позволяет завершить работу мастера.

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

В этом примере элементы управления CommandButton (кнопки) в коде называются CancelButton, BackButton, NextButton и FinishButton.

Программирование кнопок

Каждая из четырех кнопок мастера требует использования процедуры обработки события C l i c k . Ниже приведена процедура обработки события для кнопки C a n c e l B u t t o n . Эта процедура использует функцию MsgBox (рис. 15.5), чтобы проверить, завершена ли работа мастера. Если пользователь щелкнет на кнопке Отмена, то диалоговое окно UserForm будет выгружено из памяти и никакие действия произведены не будут. Этот тип проверки не является обязательным.

Private Sub CancelButton_Click()

Msg = "Прекратить работу мастера?"

 

Ans = MsgBox(Msg, vbQues'tion + vbYesNo, APPNAME)

 

If Ans = vbYes Then Unload Me

End Sub

394

Глава 15. Использование диалоговых окон UserForm

Рис. 7.5.5. Щелчок на кнопке Отмена приводит к отображению окна сообщения

Ниже представлены процедуры обработки событий для кнопок Далее и Назад.

Private Sub BackButton_Click()

Multipagel.Value = MultiPagel.Value - 1 UpdateControls

End Sub

Private Sub NextButton_Click() Multipagel.Value = MultiPagel.Value + 1 UpdateControls

End Sub

Эти две процедуры очень просты. Они изменяют значение свойства Value элемента управления MultiPage, после чего вызывают другую процедуру, которая называется UpdateControls (данная процедура будет показана ниже).

Процедура UpdateControls, представленная в листинге 15.1, отвечает за включение и отключение кнопок BackButton и NextButton.

1. Процедуры включения кнопок, управляющих работой мастера

Sub UpdateControlsО

Select Case MultiPagel.Value Case 0

BackButton.Enabled = False

NextButton.Enabled = True

Case MultiPagel.Pages.Count - 1

BackButton.Enabled = True

NextButton,Enabled = False Case Else

BackButton,Enabled = True

NextButton,Enabled = True End Select

1Обновить заголовок

Me.Caption = APPNAME & • Шаг " _

&MultiPagel.Value + 1 & " из " _

&MultiPagel.Pages.Count

1 Поле Имя заполнять обязательно

If tbName.Text = "" Then FinishButton.Enabled = False

Else

FinishButton.Enabled = True End If

End Sub

Процедура изменяет заголовок диалогового окна UserForm для того, чтобы он отображал текущий этап работы мастера и общее количество этапов (константа APPNAME является глобальной и определена в модуле кода Modulel). После этого проверяется содержимое поля Имя на первой странице элемента управления MultiPage (для создания этого поля

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

395

используется элемент управления TextBox, который называется tbName). Данное поле следует обязательно заполнить, поэтому кнопка Готово отключена до момента заполнения. Если элемент управления TextBox остается пустым, кнопка F i n i s h B u t t o n будет оставаться отключенной. В противном случае кнопка Готово активизируется, и у пользователя появляется возможность на ней щелкнуть.

Программирование зависимостей

В большинстве мастеров ответ пользователя на определенном этапе может повлиять на элементы управления, которые отображаются на последующих этапах. В примере, который находится на Web-узле, на третьем этапе пользователь указывает, какие программы он применяет в своей работе. После этого (на четвертом этапе) пользователю предлагается оценить выбранные программные продукты Microsoft. Элемент управления O p t i o n B u t t o n для каждого продукта отображается только в том случае, если пользователь выбрал этот продукт на предыдущем этапе.

С точки зрения программирования, эта задача реализуется в результате обработки события Change элемента управления M u l t i P a g e . Как только значение элемента управления M u l t i P a g e изменится (после щелчка пользователя на кнопке Назад или Вперед), будет запущена процедура M u l t i P a g e l _ C h a n g e . Если в элементе управления активной является последняя страница (четвертый этап), то процедура проверяет значения элементов управления CheckBox на странице, соответствующей трегьему этапу работы мастера. После этого на странице для четвертого этапа выполняются необходимые изменения элементов управления.

В данном примере используется два массива — один для элементов управления CheckBox, соответствующих продуктам (используются на третьем этапе), а второй для элементов управления Frame (используются на четвертом этапе). Цикл F o r Next скрывает элементы управления Frame для тех продуктов, которые не были выбраны на предыдущем этапе. После этого изменяется вертикальное расположение отображаемых на экране элементов управления Frame. Если на странице, соответствующей третьему этапу работы мастера, не был выбран ни один из продуктов, то на последнем этапе скрываются see элементы управления, кроме TextBox, который содержит сообщение Щелкните на кнопке Готово для выхода (если, конечно, на первом этапе введено имя). Процедура M u l t i P a g e l _ C h a n g e приведена в листинге 15.2.

Листинг15.2.Отображениестраницы,соответствующейвыборупользователя

Private Sub MultiPagel_ChangeО

'Настраивать страницу рейтинга? If MultiPagel.Value = 3 Then

Создание массива элементов управления CheckBox Dim ProdCBU To 3) As MSForms .CheckBox

Set ProdCBU) = cbExcel Set ProdCB{2) « cbWord Set ProdCB(3) = cbAccess

'Создание массива элементов управления Frame Dim ProdFrame{1 To 3) As MSForms.Frame

Set ProdFrame(1) = FrameExcGl Set ProdFrame(2) = FrameWord Set ProdFrame{3) = FrameAccess

TopPos

= 2 2

FSpace = 8

396

Глава 15. Использование диалоговых окон UserForm

AtLeastOne = False

1Просмотр всех продуктов For i = 1 То 3

If ProdCB(i) Then

ProdFrame(i).Visible = True

ProdFrame(i).Top = TopPos

TopPos = TopPos + ProdFrame(i).Height + FSpace

AtLeastOne = True

Else

ProdFrame(i).Visible = False

End If

Next i

1Ни один из продуктов не выбран? If AtLeastOne Then

lblHeadings.Visible = True Image4.Visible = True lblFinishMsg.Visible = False

Else

lblHeadings.Visible = False Image4.Visible = False lblFinishMsg.Visible = True If tbName = "" Then

lblFinishMsg.Caption = „ "Введите имя в этапе 1."

Else

lblFinishMsg.Caption = _

"Щелкните на кнопке Готово для выхода."

End If End If

End If End Sub

Выполнение задачи

Когда пользователь щелкает на кнопке Готово, мастер выполняет свою задачу: перемешает информацию из диалогового окна UserForm в следующую пустую строку рабочего листа. Эта процедура, показанная в листинге 15.3, довольно проста. Она начинается с определения следующей пустой строки рабочего листа и задания значения переменной (г). Остальная часть процедуры занимается идентификацией значений элементов управления и вводом данных в ячейки листа.

Листинг 15.3. Вставка полученных данных в рабочий лист

Private Sub FinishButton_Click()

г * Application.WorksheetFunction. _

CountA{Range("A:A")) + 1

 

Вставить имя

 

Cells(г,

1) = tbName.Text

 

' Вставить

пол

 

Select Case True

 

Case obMale: Cells(r, 2} = "Муж"

 

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

397

Case obFemale: Cells (r, 2) » "Жен"

Case obNoAnswer: Cells(r, 2) = "Другое"

End Select

1Определить используемость Cells(г, 3) = cbExcel Cells(r, 4) = cbWord Cells(r, 5) = cbAccess

'Вставить оценки

 

If obExcell Then Cells(r, 6) = ""

 

If obExcel2 Then Cells(r, 6) = 0

 

If obExcel3 Then Cells(r, 6) = 1

 

If obExcel4 Then Cells(r, 6) = 2

 

If obWordl Then Cells(r, 7) =

 

If Obword2 Then Cells(r, 7) = 0

 

If obword3 Then Cells(r, 7) = 1

 

If obWord4 Then Cells(r, 7) = 2

 

If obAccessl Then Cells(r, 3) « ""

 

If obAccess2 Then Cells(r, 8) о О

 

If obAccess3 Then Cells (r, 8) •= 1

 

If obAccess4 Then Cells (r, 8) == 2

1

Выгрузить форму

 

Unload Me

End

Sub

Последние шаги

Как только мастер будет испытан, и все станет работать так, как должно работать, можно изменить значение свойства S t y l e элемента управления M u l t i P a g e . Это свойство должно иметь значение 2 - fmTabStyleNone.

Эмуляция функции MsgBox

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

Приведенный ниже пример содержит пользовательскую функцию, которая эмулирует функцию VBA MsgBox. Вначале может показаться, что создание такой функции является простой задачей. Учитывая то, что функция KsgBox невероятно гибкая, благодаря огромному количеству аргументов, которые она принимает, можно утверждать: создать пользовательскую функцию, эмулирующую поведение функции MsgBox, непросто.

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

Создаваемая функция, которая будет эмулировать поведение функции MsgBox, получила

называние MyMsgBox. Эмуляция не является безупречной, так как функция MyMsgBox имеет

следующие ограничения.

 

398

Глава 15. Использование диалоговых окон UserForm

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