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

Глава 15. Дополнительные приемы работы с пользовательскими формами

477

Счетчики зависящих ячеек и ячеек, от которых зависит текущая, отображают дан­

ные только для активного листа. Это ограничение свойств P re c e d e n ts и D e p e n d e n ts .

Так как длина отображаемой информации может изменяться, код VBA изменяет размер и расстояние между элементами управления L a b e l, а также размер самого диалогового окна U se rF o rm в соответствии с длиной отображаемой информации.

Отображение индикатора текущего состояния

Одним из самых волнующих вопросов для разработчиков приложений Excel является воз­ можность использования индикатора текущего состояния. Это графический “измеритель”,

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

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

• Макрос, который запускается за пределами диалогового окна U serF orm

(отдельный индикатор текущего состояния).

• Макрос, который запускается из диалогового окна U serF orm . В этом случае диа­ логовое окно U se rF o rm использует элемент управления M u ltiP a g e для ото­

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

Макрос, который запускается из диалогового окна U serF orm . В этом случае вы­ сота диалогового окна U se rF o rm увеличивается, а индикатор текущего состояния

отображается в нижней части окна.

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

Отображение индикатора текущего состояния в строке состояния окна

Простой способ отображения хода выполнения макроса — использование строки состояния Excel. Его преимущество — простота реализации. Недостатком же является

то, что большинство пользователей

не привыкли отслеживать информацию, которая

отображается в строке состояния

окна, поскольку предпочитают просматривать ее

в отдельном окне.

 

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

A pplication . S ta tu s B a r = "Пожалуйста, подож дите..."

Можно обновлять строку состояния в процессе выполнения макроса. Например, ес­ ли в макросе используется переменная Pet, которая представляет состояние задачи, можно создать код, который будет периодически выполнять следующий оператор:

A pplication . S ta tu s B a r = "Выполнение... " & Pet & "% завершено"

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

Application. S ta tu sB a r = F alse

480 Часть IV. Пользовательские формы

бражается на экране, поэтому такой вариант не подходит. С другой стороны, событие A c t iv a t e возникает в тот момент, когда диалоговое окно U se rF o rm отображается на

экране, поэтому в данном случае можно остановиться на его использовании.

Вставьте приведенную ниже процедуру в модуль кода диалогового окна UserForm . Эта процедура всего лишь вызывает процедуру G enerateR andom N um bers, когда диало­ говое окно U serF orm отображается на экране. Процедура GenerateRandom Num bers,

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

P riv a te

Sub U se rF o rm _ A c tiv a tе ()

C a ll

GenerateRandomNumbers

End Sub

 

Ниже представлен код процедуры G enerateR andom N um ber. Обратите внимание на

наличие дополнительного модуля, который отслеживает текущее состояние, сохраняя соответствующие сведения в переменной P e t Done.

Sub GenerateRandomNumbers()

'Вставка случайных чисел в активный рабочий лист

Dim

C ounter As

In te g e r

 

 

 

 

Const

RowMax As

In te g e r

=

500

 

Const

ColMax

As

In te g e r

=

4 0

 

 

Dim

r

As

In te g e r,

с As

In te g e r

 

Dim

PctDone As

S in g le

 

 

 

 

I f

T ypeN am e(A ctiveS heet)

<>

"W orksheet" Then E x it Sub

C e lls . C le a r

 

 

 

 

 

 

 

C ounter

=

1

 

 

 

 

 

 

 

For

r

=

1

To

RowMax

 

 

 

 

 

For с

=

1

To

ColMax

 

 

 

 

 

 

C e lls ( r ,

c)

= In t(R n d

*

1000)

 

 

C ounter

=

C ounter

+

1

 

 

 

N ext

с

=

C ounter /

(RowMax

* ColMax)

 

PctDone

 

C a ll U pdateP rogress(P ctD one)

N ext r

U serForm l

 

 

 

 

 

U nload

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

 

 

 

Процедура G enerateR andom N um bers включает два цикла.

Во внутреннем цикле

вызывается

процедура

U p d a te P ro g re s s , которая принимает

только один аргумент

(переменная

P ctD o ne ,

которая

“ответственна” за отображение

процесса выполнения

макроса). Эта переменная может

принимать значения от 0 до 100.

 

Sub

U p d a te P ro g re s s (P e t)

 

W ith U serForm l

 

. F ram eP rogress. C a p tio n

 

. L a b e lP ro g re s s . W id th =

 

. R e p a in t

 

End W ith

End

Sub

= F o rm a t(P e t, "0%")

Pet * ( . F ram eP rogress. W id th - 10)

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

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

Sub ShowUserForm()

W ith U serForm l

Глава 15. Дополнительные приемы работы с пользовательскими формами

481

. L a b e lP ro g re s s . W idth = О

. Show End W ith

End Sub

g b Совет

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

. L a b e lP ro g re s s . B ackC olor = A ctive W o rkb o o k . Theme. _ ThemeColorScheme. C olors(m soThem eAccentl)

Принцип действия процедуры запуска

При выполнении процедуры ShowUserForm ширина объекта L a b el устанавливает­ ся равной 0. После этого вызывается метод Show объекта U serF orm l, что приводит к отображению диалогового окна U serForm (которое играет роль индикатора текущего состояния). Когда диалоговое окно U se г Form отображается на экране, вызывается со­ бытие A c t iv a t e , которое приводит к выполнению процедуры G enerateR andom -

Numbers. Процедура G enerateR andom N um bers включает код,

который

вызывает

процедуру U p d ate P r o g r e s s при каждом изменении

переменной

счетчика

цикла г.

Обратите внимание, что процедура U p d ate P r o g r e s s

использует метод R e p a in t объ­

екта UserForm. Если бы этого оператора не было, изображение на экране не обновля­ лось бы. Перед завершением процедуры G enerateR andom N um bers ее последний опе­ ратор выгружает диалоговое окно U serForm из памяти.

Для того чтобы модифицировать эту методику, необходимо разобраться, как опреде­ ляется процент завершения выполняемой задачи. После этого значение состояния задачи можно будет присваивать переменной P ctD one. Определение этой величины осуществ­ ляется различными способами в зависимости от приложения. Если код выполняется в цикле (как в данном примере), вычисление процента выполнения сравнительно неслож­ ное. Если же код выполняется не в цикле, определение состояния выполнения происхо­ дит в различных точках кода.

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

В предыдущем примере макрос запускался не из диалогового окна U serForm . Во многих случаях долго выполняющийся макрос можно вынудить “уйти со сцены”, щелк­ нув мышью на кнопке ОК в диалоговом окне UserForm . В этом же разделе будет опи­ сан лучший способ, использование которого возможно при следующих допущениях:

проект завершен и отлажен;

в проекте используется диалоговое окно U serForm (без элемента управления

 

M u ltiP age) для запуска долго выполняющегося макроса;

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

©Пример, демонстрирующий описанный прием, находится на прилагаемом к книге компакт-диске в файле p ro g re s s in d ic a to r 2 . xlsm .Компакт-диск

16 3ak. 3107