Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

828

Часть VII. Дополнительные темы

Form, в котором насчитывается 100 кнопок, то это диалоговое окно содержится в памя­ ти интерпретатора, но оно не является частью проекта. Для того чтобы формально доба­ вить диалоговое окно U serForm l в коллекцию U serForm s, необходимо воспользо­ ваться методом Add. Возвращаемое этим методом значение (да, этот метод возвращает значение) является ссылкой на диалоговое окно. Именно поэтому в конце вызова метода Add необходимо вызвать метод Show. Из этого следует правило, согласно которому для отображения созданного диалогового окна его сначала необходимо добавить в коллек­ цию UserForm s.

Программное создание диалоговых окон

UserForm

В завершение данной главы речь пойдет об использовании средств VBA для создания диалоговых окон Use г Form на этапе выполнения. В этом разделе представлены два примера: один из них довольно прост, второй — намного сложнее.

Простой пример

Пример, приведенный в этом разделе, не имеет особой практической ценности. Точ­ нее, он совершенно бесполезен. Однако этот пример демонстрирует важные концепции. Процедура M akeForm выполняет следующие задачи.

1.Создает временное диалоговое окно UserForm в активной рабочей книге. Для этого используется метод Add коллекции VBComponents.

2.Добавляет элемент управления CommandButton в диалоговое окно UserForm. Для этого применяется объект D esig n er.

3.Добавляет процедуру обработки события в модуль кода диалогового окна UserForm.

Данная процедура (Com m andButtonl_Click) используется для отображения окна сообщения и закрытия диалогового окна.

4.Отображает диалоговое окно Use г Form.

5.Удаляет диалоговое окно UserForm .

Общим результатом работы процедуры является динамическое создание диалогового окна U serF orm , его использование и удаление после использования. Приводимый при­ мер, а также пример в следующем разделе стирают границу между модификацией диало­ говых окон на этапе разработки и на этапе выполнения. Диалоговое окно создается с по­ мощью методов разработки, но все это происходит на этапе выполнения.

Ниже приводится пример процедуры MakeForm .

Sub MakeForm()

 

 

Dim

TempForm

As

O b je c t

Dim

NewButton As

M sform s. CommandButton

Dim

L in e As

In te g e r

A p p lic a tio n .V B E .M a in W in d o w .V is ib le = F alse

'Создание диалогового окна UserForm

Set TempForm = T h isW o rkb o o k .V B P ro je ct. _ VBComponents.A d d (3) 1vbext_ct_M SForm

W ith TempForm

. P r o p e r tie s ( "C a p tio n ") = "Временная форма"

830

Часть VII. Дополнительные темы

Более слож ны й прим ер

Данный пример имеет как образовательную, так и практическую ценность. Он состо­ ит из функции G e tO p tio n , которая отображает диалоговое окно U serF orm . В этом диалоговом окне находится несколько элементов управления O p tio n B u tto n , подписи которых указываются в виде аргументов функции. Функция возвращает значение, кото­ рое соответствует элементу управления O p tio n B u tto n , выбранному пользователем.

 

 

 

К о м п а к т-д и ск

 

 

 

 

 

 

 

 

 

Рассматриваемый

в

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

 

 

 

к книге компакт-диске в файле g e t o p t io n fu n c t io n . xlsm .

 

Ниже приводится код функции G e tO p tio n .

 

F u n c tio n

G e tO p tio n (ОрАгra y ,

D e fa u lt,

T it le )

 

Dim

TempForm As

O b je c t

 

 

 

 

 

 

Dim

N ew O ptionB utton As M sform s. O p tio n B u tto n

 

Dim

NewCommandButtonl

As

M sform s. CommandButton

 

Dim

NewCommandButton2

As

M sform s. CommandButton

 

Dim

i

As

In te g e r,

TopPos

As In te g e r

 

 

Dim MaxW idth As Long

 

 

 

 

 

 

 

Dim

Code

As

S tr in g

 

 

 

 

 

 

 

'

Сокрытие

окна VBE

во

избежание

мерцания экрана

 

A p p lic a tio n .V B E .M a in W in d o w .V is ib le

= F alse

'

Создание окна

UserForm

 

 

 

 

 

 

Set

TempForm = _

 

 

 

 

 

 

 

 

 

 

T hisW orkbook.V B P roject.V B C om ponents.A dd(3)

 

T e m p F o rm .P ro p e rtie s( "W id th ") =

800

 

1

Добавление

элементов

управления

O p tio n B u tto n

 

TopPos

=

4

0 '

Ширина

наиболее

широкой кнопки O p tio n B u tto n

 

MaxW idth

=

 

For

i

=

LBound(O pArray)

To

UBound(OpArray)

 

 

Set

N ew O ptionB utton =

Tem pForm .D esigner. C o n tr o ls . _

 

 

 

A d d ( " Form s. O p tio n B u tto n .1 ")

 

 

 

 

W ith

N ew O ptionB utton

 

 

 

 

 

 

 

 

.W id th =

800

 

 

 

 

 

 

 

 

 

 

.C a p tio n

=

O p A rra y (i)

 

 

 

 

 

 

 

.H e ig h t =

15

=

L e f t ( . C a p tio n ,

1)

 

 

 

.A c c e le ra to r

 

 

 

. L e ft

= 8

 

 

 

 

 

 

 

 

 

 

 

.Top

= TopPos

 

 

 

 

 

 

 

 

 

.Tag

= i

 

=

True

 

 

 

 

 

 

 

 

.A u to S ize

 

 

 

 

 

 

 

 

 

I f

D e fa u lt

= i

Then

.V alue

=

True

 

 

 

I f

.W id th

 

> MaxW idth

Then MaxW idth = .W id th

End W ith

TopPos = TopPos + 15

N ext i

'Добавление кнопки Отмена

Set NewCommandButtonl = Tem pForm .D esigner. C o n tro ls . _

A d d ( " Form s. CommandButton.1 ")

W ith NewCommandButtonl

.C a p tio n

=

"Отмена"

. Cancel

=

True

Глава 28. Управление компонентами Visual Basic

.H e ig h t

=

18

.W id th

=

44

. L e ft

=

MaxW idth + 12

.Top

=

6

 

End W ith

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

Set

NewCommandButton2

= Tem pForm .D esigner. C o n tro ls .

 

A d d ( " Form s. CommandButton.1 ")

W ith NewCommandButton2

 

 

.C a p tio n

=

"OK"

 

 

.D e fa u lt

=

True

 

 

.H e ig h t

=

18

 

 

.W id th

=

44

 

 

. L e ft

=

MaxW idth +

12

 

.Top =

28

 

 

End

W ith

 

 

 

 

'Процедуры обработки событий для кнопок CommandButton Code = и n

Code

=

Code

Sc

"Sub

CommandButtonl

C lic k ( ) "

& vb C rL f

Code

=

Code

Sc

"

GETOPTION RET VA L=False" & vb C rL f

Code

=

Code

Sc

"

U nload Me"

& vb C rL f

 

 

 

Code

=

Code

Sc

"End

Sub"

Sc

vb C rLf

 

 

 

 

Code

=

Code

Sc

"Sub

C om m andB utton2_C lick( ) "

& vb C rL f

Code

=

Code

Sc

"

Dim

c t l "

Sc vb C rL f

 

 

 

 

Code

=

Code

Sc

"

GETOPTION_RET_VAL

= F a ls e "

& vb C rL f

Code

=

Code

Sc

"

For

Each

c t l

In

M e .C o n tro ls "

& vb C rL f

Code

=

Code

Sc

"

I f

TypeN am e(ctl)

= "" O p tio n B u tto n "" " _

Sc

и

Then"1 Sc:

 

vb C rL f

 

 

 

 

 

 

 

 

Code

=

Code

Sc

"

I f

c t l Then GETOPTION_RET_VAL

=

"

Sc

=

c tl.T a g " Sc v b C rL f

 

 

 

 

 

 

 

 

Code

Code

Sc

"

End

I f "

Sc

vb C rL f

 

 

 

 

Code

=

Code

Sc

"

N ext c t l "

Sc vb C rL f

 

 

 

Code

=

Code

Sc

"

U nload Me"

& vb C rL f

 

 

 

Code

= Code Sc "End Sub"

 

 

 

 

 

 

 

 

W ith

TempForm.CodeModule

 

 

 

 

 

 

 

 

. In s e rtL in e s

. C ountO fLines

+

1, Code

 

 

 

End

W ith

 

 

 

 

 

 

 

 

 

 

 

 

1 Изменение параметров диалогового

окна

 

 

 

W ith

TempForm

 

 

 

 

 

 

 

 

 

 

 

. P r o p e rtie s ( "C a p tio n ")

= T it le

 

 

 

 

. P r o p e rtie s ( "W id th ")

=

NewCommandButtonl. L e ft

+ _

 

NewCommandButton1 .W id th

+

10

 

 

 

I f

. P r o p e rtie s ( "W id th ")

<

160

Then

 

 

 

 

 

. P r o p e r tie s ( "W id th ")

=

160

 

 

 

 

 

NewCommandButtonl. L e ft

=

106

 

 

 

 

NewCommandButton2. L e ft

=

106

 

 

 

End

I f

 

 

 

 

 

 

 

 

 

 

 

 

. P r o p e r tie s ( "H e ig h t")

= TopPos

+ 24

 

 

 

End

W ith

 

 

 

 

 

 

 

 

 

 

 

 

1Отображение диалогового окна

VBA.U serForm s.A d d (TempForm.Name) . Show

'Удаление диалогового окна

ThisW orkbook.VBProj e c t .VBComponents. Remove VBComponent =TempForm

832

Часть VII. Дополнительные темы

'Передача выбранного параметра вызывающей процедуре G e tO p tion = GETOPTION_RET_VAL

End F u n c tio n

Функция G e tO p tio n работает достаточно быстро, учитывая количество действий, которое выполняется в фоновом режиме. Во многих компьютерах диалоговое окно ото­ бражается практически мгновенно. После выполнения своей функции диалоговое окно U se г Form удаляется.

И спользование ф ункции G e tO p tio n

Функция G e tO p tio n принимает три аргумента.

O p A rray — строковый массив, содержащий названия элементов, которые будут

отображены в диалоговом окне с помощью элементов управления O p tio n B u tto n .

D e f a u l t — целое число, которое указывает на элемент управления O p t io n ­ B u tto n , выбранный по умолчанию в момент отображения диалогового окна U s ­ e r Form. Если этот параметр имеет значение 0, то не выбран ни один из элементов управления O p tio n B u tto n .

T i t l e — текст, который будет отображаться в строке заголовка созданного диалогового окна U serF orm .

Принцип д ействия ф ункции G e tO p tio n

Функция G e tO p tio n выполняет следующие операции.

1.Скрывает окно VBE, что позволяет избежать мерцания экрана в момент генерации диалогового окна UserForm и добавления кода процедур обработки событий.

2.Создает диалоговое окно U se г Form и назначает его переменной TempForm.

3.Затем в диалоговое окно добавляются элементы управления O p tio n B u tto n .

Для этого используется массив, который передан в функцию с помощью аргумента O pA rray. Свойство T ag элемента управления используется для сохранения индексного номера. Значение свойства T ag выбранного элемента управления возвращается функцией в качестве результата.

4.После этого функция добавляет два элемента управления CommandButton: кнопку ОК и кнопку Отмена.

5.Для каждого из элементов управления CommandButton создается процедура обработки события.

6.Проводятся завершающие действия по настройке диалогового окна U se г Form: функция изменяет расположение кнопок C om m andB utton и размер диалогового окна U serF orm .

7.

Диалоговое окно U serF orm отображается на экране. Когда пользователь щелкает

 

на кнопке ОК, выполняется процедура C oram an d B u tton l_ C lick . Она определяет,

 

какой из элементов управления O p tio n B u tto n выделен, и присваивает

 

соответствующее значение переменной GETOPTION_RET_VAL (эта* переменная

 

объявлена с областью действия P u b lic ) .

8.

Диалоговое окно Use г Form закрывается и удаляется.

O p s).
U s e r F o r m

Глава 28. Управление компонентами Visual Basic

833

9.Функция возвращает значение переменной GETOPTION_RET_VAL в качестве результата.

П р и м еч ан и е

Заметным преимуществом динамического создания диалогового окна Us- erForm является размещение функции в единственном модуле, а также отсутствие необходимости в ссылке на библиотеку VBA Extensibility Library. Таким образом, этот модуль можно просто экспортировать (название модуля — modOptionsForm), а затем импортировать его в любую из рабочих книг и получить доступ к функции G etO ption .

Следующая процедура демонстрирует использование функции G e t O p t io n . В этом случае диалоговое окно предоставляет пять вариантов выбора (которые со­ держатся в массиве

Sub T e s tG e tO p tio n ()

Dim

O ps(1

To

5)

Dim

U se rO p tio n

O ps(1)

=

"Север"

Ops(2)

=

"Юг"

 

O ps(3)

=

"Запад"

O ps(4)

=

"В осток"

O ps(5)

=

"Все

регионы"

U se rO p tio n

=

G e tO p tion (O ps, 5, "Выберите регио н")

D e b u g .P rin t

U serO ption

MsgBox

O ps(U serO ption)

End Sub

Переменная U s e r O p t i o n хранит индексный номер выбранного переключателя. Ес­ ли пользователь щелкнет на кнопке Отмена (или нажмет клавишу <Escape>), то пере­ менная U s e r O p t i o n будет установлена в значение F a l s e .

Обратите внимание на то, что значение свойства A c c e l e r a t o r установлено равным первому символу для каждого заголовка опции, поэтому пользователь может использо­ вать комбинацию клавиш <Alt+буква> для выбора требуемого варианта. Я не пытался избежать дублирования комбинаций клавиш, поэтому пользователю придется нажать комбинацию клавиш несколько раз для выполнения выделения.

На рис. 28.10 показано диалоговое окно U se r Form, которое генерируется этой функцией.

П р и м еч ан и е

Диалоговое окно UserForm изменяет свой размер для того, чтобы подстро­ иться под заданное количество элементов управления, добавленных в диа­ логовое окно. Теоретически функция G e tO p tion может принимать массив любого размера. Однако на практике количество элементов массива огра­ ничивается, поскольку размер диалогового окна не может превышать раз­ мер экрана. На рис. 28.11 показано, каким образом выглядит окно, содер­ жащее большое количество опций.

Код обработчика собы тий G e tO p tio n

Ниже приводится код процедур обработчиков событий для двух элементов управле­ ния C o m m a n d B u tto n . Этот код генерируется функцией G e t O p t i o n и находится в мо­ дуле кода (для временного диалогового окна U s e r F o r m ) .

27 Зак. 3107