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

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

491

I f

obWord2 Then C e lls (г,

7)

=

О

 

I f

obWord3 Then

C e lls ( r ,

7)

=

1

 

I f

obWord4 Then

C e lls ( r ,

7)

=

2

 

I f

obAccessl Then

C e lls ( r ,

8 )

= ""

 

I f

obAccess2 Then

C e lls ( r ,

8 )

= 0

 

I f

obAccess3 Then

C e lls ( r ,

8 )

= 1

 

I f

obAccess4 Then

C e lls ( r ,

8 )

= 2

 

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

Unload Me End Sub

Как только мастер будет испытан и все станет работать должным образом, можно из­ менить значение свойства S t y le элемента управления M u ltiP a g e . Это свойство должно иметь значение 2 fm T a b S ty le N o n e .

Имитация работы функции MsgBox

Функция VBA MsgBox достаточно необычна. В отличие от остальных функций она

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

В приведенном ниже примере содержится пользовательская функция, которая эмули­ рует функцию VBA MsgBox. Вначале может показаться, что это легкая задача. Учиты­ вая то, что функция M sgBox невероятно гибкая (благодаря огромному количеству аргу­

ментов, которые она принимает), можно утверждать: создать пользовательскую функ­ цию, эмулирующую поведение функции MsgBox, весьма непросто.

Примечание

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

Создаваемая функция, которая будет имитировать поведение функции MsgBox, по­ лучила название MyMsgBox. Имитация не является безупречной, так как функция MyMsgBox имеет следующие ограничения:

• не поддерживает аргумент с п р а в к а (он способствует появлению кнопки Справ­ ка, щелчок на которой позволяет открыть файл справочной системы);

не поддерживает аргумент р а з д е л (он указывает раздел в файле справки);

не поддерживает опцию модальности (которая приостанавливает работу всей программы до тех пор, пока пользователь не ответит на запрос окна сообщения);

не воспроизводит звук при вызове.

Ниже приведен синтаксис функции MyMsgBox.

MyMsgBox( з а п р о с [, кн о п ки ] [, з а г о л о в о к ])

Этот синтаксис полностью соответствует синтаксису функции MsgBox, кроме того

что в первой не поддерживаются два последних аргумента ( с п р а в к а и р а з д е л ). Функ­

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

ция MyMsgBox использует те же предопределенные константы, что и функция MsgBox: vbO K O nly, v b Q u e s tio n , v b D e f a u lt B u t t o n l и т.д.

Примечание

Если вы не знакомы с функцией VBA MsgBox, обратитесь к справочной сис­ теме для получения информации о ее аргументах.

Код функции M yM sgB ox

Функция MyMsgBox использует диалоговое окно U serF orm , которое называется MyMsgBoxForm. Данная функция очень короткая. Ее текст приводится ниже. Основная часть работы выполняется в функции обработки события I n i t i a l i z e (UserForm I n i t i a l i z e ) .

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

Полный код функции MyMsgBox слишком длинный, чтобы приводить его здесь, но он доступен в рабочей книге msgbox e m u la tio n .x ls m , находя­ щейся на прилагаемом к книге компакт-диске. Эта рабочая книга настроена так, что вы сможете проверять работу различных опций.

P u b lic

Prom pt1 As S trin g

P u b lic

B u tto n s l

As

In te g e rP u b lic T i t l e l As S trin g

P u b lic

U s e rC lic k

As

In te g e r

F u n c tio n MyMsgBox(ByVal

Prompt As

S trin g , _

O p tio n a l

ByVal

B u tto n s

As In te g e r,

_

O p tio n a l

ByVal

T it l e

As

S trin g )

As

In te g e r

Prom pt1

= Prompt

 

 

 

 

B u tto n s l

=

B u tto n s

 

 

 

 

T i t l e l

=

T it le

 

 

 

 

MyMsgBoxForm. Show

 

 

 

 

MyMsgBox

= U s e rC lic k

 

 

 

 

End F u n c tio n

 

 

 

 

 

 

 

На рис. 15.11 показан результат выполнения функции MyMsgBox. Он напоминает окно

сообщения VBA, но в этом случае применяется другой шрифт для выделения текста сооб­ щения (Calibri, 12 пунктов, полужирный), а также используются другие пиктограммы.

Если к вашему компьютеру подключено несколько мониторов, форма U serForm

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

W ith MyMsgBoxForm

 

 

 

 

. S ta rtU p P o s itio n = 0

 

 

 

 

. L e f t =

A p p lic a tio n . L e ft

+ (0 .5

* A p p lic a tio n . W idth)

-

_

0 .5

*

.W idth)

 

 

 

 

.Top =

A p p lic a tio n .T o p +

(0 .5 *

A p p lic a tio n . H e ig h t)

-

_

(0 .5

 

* .H e ig h t)

 

 

 

 

. Show

 

 

 

 

 

 

End W ith

 

 

 

 

 

 

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

Prompt

="Вы в ы брали

с о х р а н е н и е р а б о ч е й к н и г и "

& vb C rL f

Prompt

=Prompt

& "н а

д и с к е ,

к о то р ы й н е д о с т у п е н "

&

vb C rL f

Prompt

=Prompt

& "д л я в с е х

с о т р у д н и к о в ." & vb C rL f

& vb C rL f

Prompt

=Prompt

& "П р о д о л ж а ть ? "

 

 

B u tto n s

= vb Q u e stio n

+ vbYesNo

 

 

494

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

определяет расположение текста в диалоговом окне;

определяет ширину диалогового окна (используется API-функция, которая пре­ доставляет информацию о разрешении экрана);

определяет необходимую высоту диалогового окна;

отображает диалоговое окно U se г Form.

Три дополнительные процедуры обработки событий используются для элементов управления CommandButton. Эти процедуры определяют, на какой из кнопок щелкнул пользователь. Затем переменной U s e r C lic k присваивается соответствующее значение.

Интерпретация второго аргумента (Кнопки) может оказаться немного сложнее. Этот аргумент может включать ряд констант и выглядеть следующим образом:

VbYesNoCancel + V bQ uestion + V b D e fa u ltB u tto n 3

Данный аргумент создает окно сообщения с тремя кнопками MsgBox (Да, Нет и От­ мена), отображает пиктограмму со знаком вопроса и делает третью кнопку выбранной по

умолчанию. Аргумент равен 547 (3+32+512). Основной трудностью в данном случае может оказаться получение трех фрагментов информации на основе одного числа. Решить данную проблему несложно: преобразуйте числа в двоичную форму и проверьте состояние отдельных битов этого аргумента. Например, число 547 в двоичной форме записывается как 1000100011. Двоичные цифры 4-6 определяют отображаемую пиктограмму, цифры 8 -10 — отображае­

мые кнопки, а цифры 1 и 2 — кнопку, которая будет выбрана по умолчанию.

Использование функции M yM sgB ox

Для того чтобы применить эту функцию в собственном проекте, экспортируйте мо­ дуль MyMsgBoxMod и диалоговое окно MyMsgBoxForm. Затем можете импортировать эти два файла в собственный проект. Используйте функцию MyMsgBox в коде точно так же, как функцию MsgBox.

Диалоговое окно U serForm с перемещаемыми элементами управления

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

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

Рассматриваемый в этой главе пример доступен на прилагаемом к книге компакт-диске и находится в файле move c o n tr o ls . xlsm .

Каждый из элементов управления Im age включает две ассоциированные с ним про­ цедуры обработки событий: MouseDown и MouseMove. Ниже приводится код процедур обработки событий для элемента управления Im age 1 (другие процедуры идентичны, за исключением используемых имен элементов управления).

P riv a te

Sub Imagel_MouseDown(ByVal B u tto n As

In te g e r,

_

ByVal

S h if t As In te g e r, ByVal X As S in g le ,

ByVal Y

As S in g le )

1 Н а ч а л ь н а я п о з и ц и я в м о м ен т щ елчка на к н о п к е

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

499

Совет

Изображения, отображаемые на элементах управления, представляют со ­

Обой символы из набора шрифтов Wingding. Для ввода символов в ячейки

применялась команда Excel Вставка^Текст^Символ (Insert^Text^Symbol). Затем символы копировались в буфер обмена с последующей вставкой в свойство P ic tu re в окне Properties. Это простой и быстрый способ добав­ ления изображений в элементы управления окна userForm .

Диалоговое окно U serForm с изменяемыми размерами

В Excel используется ряд диалоговых окон с изменяемыми размерами. Например, можно изменить размеры диалогового окна Диспетчер имен (Name Manager) путем

щелчка и перетаскивания нижнего правого угла окна.

Если вы попытаетесь создать диалоговое окно с изменяемыми размерами, то очень быстро обнаружите, что нет прямого способа сделать это. Первое решение заключается в использовании вызовов Windows API. Этот метод работает, но сложен в реализации. В этом разделе представлен более простой метод, обеспечивающий создание диалогово­ го окна U serForm с изменяемыми размерами.

Примечание

Этот прием был разработан Энди Поупом, экспертом по Excel и профессио­ налом Microsoft (MVP), проживающим в Великобритании. Энди — один из наиболее креативных разработчиков Excel. Желающие пообщаться с ним (а также загрузить интересные примеры) могут посетить его веб-сайт h t t p : //a n d y p o p e . in f o .

На рис. 15.18 показано диалоговое окно U serF orm , описанное в этом разделе. Оно включает элемент управления L is tB o x , отображающий данные из рабочего листа. Об­ ратите внимание на полосы прокрутки элемента управления L is tB o x . Их появление оз­

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

На рис. 15.19 показано то же самое диалоговое окно U ser Form, размеры которого изменены пользователем. Обратите внимание на то, что размеры элемента управления ListBox были также увеличены, а кнопка Закрыть (“крестик”) осталась в том же са­

мом относительном положении. Если у вас небольшой монитор, можете сжать диалого­ вое окно U se г Form.

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

Рассматриваемый в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле re s iz a b le u s e rfo rm .x ls m .

В представленном примере используется элемент управления L a b e l, добавленный в диалоговое окно Use г Form во время выполнения. Элемент управления, изменяющий

размеры окна, который находится в нижнем правом углу окна, фактически представляет собой элемент управления L a b e l. Он отображает единственный символ: букву “о”

(символ “111”) шрифта Marlett, набор символов 2. Этот элемент управления (под назва­

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

501

. Z o rd e r

-

.H e ig h t

 

.Тор

= Me. In s id e H e ig h t

 

.L e ft

= Me. In s id e W id th

-

.W id th

 

End W ith

 

 

 

 

End Sub

 

 

 

 

Примечание

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

Описанная в этом разделе техника основана на следующих фактах.

Пользователь может перемещать элемент управления в диалоговом окне U se r - Form (см. раздел “Диалоговое окно с перемещаемыми элементами управления”).

Идентификация перемещений мыши, а также определение координат указателя мыши производится с помощью событий. В данном случае используются события MouseDown и MouseMove.

Код VBA может изменять размер диалогового окна U se г Form во время выпол­ нения, но пользователю подобные возможности недоступны.

В результате творческого осмысления этих фактов можно сделать выводы о том, что можно преобразовать перемещение указателя мыши в области элемента управления Label в информацию, которая может использоваться для изменения размеров диалого­ вого окна U se г Form.

После щелчка мышью на объекте ob j Re s i z e r L a b el на выполнение вызывается процедура обработчика событий ob jR esizer_ M ou seD ow n .

Private

Sub objR esizer_M ouseD own(ByVal

B u tto n

As In te g e r,

_

ByVal

S h if t

As

In te g e r, ByVal X As

S in g le ,

ByVal Y As

S in g le )

I f

B u tto n =

1

Then

 

 

 

 

L e ftR e size P o s

= X

 

 

 

End

TopResizePos

= Y

 

 

 

I f

 

 

 

 

 

 

End Sub

Эта процедура выполняется только в том случае, когда нажата левая кнопка мыши (при этом аргумент B u tto n принимает значение 1), а ее указатель установлен на метке obj R e siz e r . Координаты указателя мыши X и Y, зафиксированные во время щелчка мышью, хранятся в переменных уровня модуля: L ef tR e s iz e P o s и T o p R esizeP o s.

Последовательные перемещения указателя мыши приводят к вызову события

MouseMove, после чего в игру вступает обработчик событий

o b jR e siz e r _ M o u se -

Move. Соответствующий код приводится ниже.

 

 

 

 

 

Private

Sub objR esizer_M ouseM ove(ByVal

B u tto n

As

In te g e r,

_

ByVal

S h if t

As

In te g e r,

ByVal

X

As

S in g le ,

ByVal

Y As

S in g le )

I f B u tto n =

1

Then

 

 

 

 

 

 

 

 

 

W ith o b jR e s iz e r

L e ftR e s iz e P o s , .Top

+

Y -

_

 

 

.Move

. L e ft + X -

 

 

TopResizePos

 

X

-

L e ftR e size P o s

 

 

 

 

M e.W idth

=

M e.W idth +

 

 

 

 

M e .H eight

= M e .H eight

+

Y

- TopResizePos

 

 

 

 

.L e ft

=

Me. In s id e W id th

 

-

.W id th

 

 

 

 

 

.Top

= Me. In s id e H e ig h t

 

-

.H e ig h t

 

 

 

 

End W ith

 

 

 

 

 

 

 

 

 

 

 

 

End Sub