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

836

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

Ниже приводится список типичных вариантов использования модулей классов.

Обработка событий, связанных с внедренными диаграммами. (Соответствую­ щий пример представлен в главе 18.)

Контроль над событиями уровня приложения. В число таких событий входит ак­ тивизация рабочей книги. (Соответствующие примеры находятся в главах 19 и 22.)

Перенастройка функций Windows API для упрощения их использования в исход­ ном коде. Например, можно создать класс, который упрощает определение или изменение состояния клавиш <NumLock> и <CapsLock>. Также можно создать класс, который упрощает доступ к системному реестру.

Выполнение одной процедуры несколькими объектами диалогового окна

U serForm . Обычно объект имеет собственную процедуру обработки события. Пример в главе 15 демонстрирует использование модуля класса, предназначенно­ го для предоставления нескольким элементам управления CommandButton од­ ной процедуры обработки события C lick .

Создание компонентов, рассчитанных на повторное использование; их мож­ но импортировать в другие проекты. Как только будет создан модуль класса общего назначения, его можно импортировать в другие проекты для сокращения объема работ по разработке приложений.

Пример создания модуля класса

В данном разделе приводится пошаговая инструкция создания полезного, хотя и до­ статочно простого, модуля класса. Этот модуль класса создает класс NumLock, который имеет одно свойство (Value) и один метод (Toggle).

Определение или установка значения клавиши <NumLock> требует использования нескольких функций Windows API. Такой модуль класса предназначен для упрощения операции управления клавишей <NumLock>. Вызовы API-функций, а также необходи­ мый код расположены в модуле класса (а не в обычном модуле кода VBA). В чем пре­ имущества такого подхода? Работать с подобным кодом намного проще, а модуль класса можно использовать в других проектах.

Создав класс в коде VBA, определите текущее состояние клавиши <NumLock> с по­ мощью инструкции, отображающей значение свойства V a l u e .

MsgBox NumLock.V alue

Также в коде можно изменить состояние клавиши <NumLock>. Например, следую­ щий оператор включает клавишу <NumLock>:

NumLock.Value = True

Также клавишу <NumLock> можно включить с помощью метода Toggle.

NumLock. Toggle

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

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

838

 

 

 

 

 

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

A lia s "G etV ersionE xA " _

OSVERSIONINFO)

As Long

 

 

 

(lp V e rs io n ln fo rm a tio n

As

 

 

 

P riv a te

D e cla re

P trS a fe

Sub

keybd _event L ib

"u se r3 2 "

_

 

(ByVal bVk

As

B yte , _

 

 

 

 

 

 

ByVal

bScan

As B yte ,

_

 

 

 

 

 

ByVal

d w fla g s

As Long, ByVal d w E x tra ln fo

As Long)

 

 

P riv a te

D e cla re

P trS a fe

F u n c tio n G etK eyboardS tate

L ib

"u s e r3 2 n

_

(pbKeyState

As B yte)

As Long

 

L ib

"u se r3 2 "

_

P riv a te

D e cla re

P trS a fe

F u n c tio n S e tK eyb oa rd S tate

(Ipp bK eyS ta te

As B yte) As

Long

 

 

 

 

' Определения

констант

 

 

 

 

 

 

Const VK_NUMLOCK = &H90

 

 

 

 

 

 

Const VK_SCROLL = &H91

 

 

 

 

 

 

Const VK_CAPITAL = &H14

 

 

 

 

 

 

Const KEYEVENTF_EXTENDEDKEY = &H1

 

 

 

 

Const KEYEVENTF_KEYUP =

&H2

 

 

 

 

 

После этого создайте процедуру, которая будет получать текущее состояние клавиши <NumLock>. Она определяет свойство V a l u e создаваемого объекта. В качестве имени свойства можно использовать любое название. V a l u e — неплохой вариант. Для того чтобы получить текущее состояние клавиши, вставьте в модуль следующую процедуру

P r o p e r t y G e t .

 

P ro p e rty Get

V a lu e ()

As Boolean

1

Получение

текущего

состояния

 

Dim k e y s (0

To 255)

As B yte

 

G etK eyboardS tate keys(O )

 

V alue = keys(VK_NUMLOCK)

End

P ro p e rty

 

 

Перекрестная ссы лка

©Подробно код процедур группы P ro p e rty рассматривается далее. Для по­ лучения необходимых сведений обратитесь к разделу “Программирование свойств объектов”.

Процедура, использующая функцию W in d o w s API G e t K e y b o a r d S t a t e , определяет текущее состояние клавиши <NumLock>. Эта процедура вызывается каждый раз, когда код VBA запрашивает значение свойства V a lu e . Например, оператор VBA, который представлен ниже, приводит к выполнению процедуры P r o p e r t y G e t .

MsgBox Num Lock.Value

Теперь необходимо создать процедуру, которая будет устанавливать состояние кла­ виши <NumLock>. Клавиша может иметь одно из двух состояний: включена или выклю­ чена. Такая задача выполняется с помощью следующей процедуры P r o p e r t y L e t .

P ro p e rty L e t

V a lu e (b o o lV a l As Boolean)

 

 

 

 

 

Dim

о As OSVERSIONINFO

 

 

 

 

 

 

Dim

ke ys(0

To

255)

As

B yte

 

 

 

 

 

о . d w O S V ersionlnfoS ize

= Len(o)

 

 

 

 

 

G etV ersionE x

о

 

 

 

 

 

 

 

G etK eyboardS tate keys(O )

 

 

 

 

 

' Находится

ли

в этом состоянии?

 

 

 

 

 

I f

b o o l V a l

=

True

And

keys (VK_NUMLOCK)

=

1

Then

E x it

P ro p e ifty

I f

b o o lV a l

=

F alse

And

keys(VK_NUMLOCK)

=

0

Then

E x it

P ro p e rty

'Переключение.

'Имитация нажатия клавиши

keybd _event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0

T r u e .
N u m ­

Глава 29. Модули классов

839

Имитация отпускания клавиши

keybd_event VK_NUMLOCK, &Н45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0

End P ro p e rty

Процедура P r o p e r t y L e t принимает один аргумент, который может иметь либо

значение T r u e ,

либо F a l s e . Оператор VBA, который приводится ниже, устанавливает

значение V a l u e

объекта N u m L o c k в значение T r u e . Для этого вызывается процедура

P r o p e r t y L e t :

NumLock.Value

= True

Н аконец, вам потребуется процедура переклю чения реж има N u m L o c k .

Sub T o g g le ()

1Переключение состояния Dim о As OSVERSIONINFO

о . dw O S V e rsio nln foS ize

= Len(o)

G etV ersionE x

о

 

Dim ke ys(0 To

255) As

Byte

G etK eyboardS tate keys(O)

1Имитация нажатия клавиши

keybd _event VK_NUML0CK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0

'Имитация отпускания клавиши

keybd _event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0

End Sub

Обратите внимание на то, что в качестве процедуры T o g g le применяется стандартная процедура (а не процедуры P r o p e r t y L e t либо P r o p e r t y G e t) . Приведенный ниже опе­ ратор VBA переключает состояние объекта N u m L o c k путем вызова процедуры T o g g le :

N u m Lo ck . T o g g le

И спользование модуля класса Num Lockciass

Перед применением модуля класса N u m L o c k C la s s необходимо создать экземпляр класса. Оператор, который находится в модуле кода VBA общего назначения (не в моду­ ле класса), создает такой экземпляр:

Dim NumLock As New NumLockClass

Обратите внимание на то, что тип объекта указан как N u m L o c k C la s s (т.е. использу­ ется название модуля класса). Сама переменная может иметь любое название, но

L o c k — наиболее приемлемое.

Представленная далее процедура устанавливает свойство V a l u e объекта N u m L o c k в значение Это приводит к включению клавиши <NumLock>.

Sub NumLockOn()

Dim NumLock As New NumLockClass

NumLock. Value = True

End Sub

Следующая процедура отображает окно сообщения, которое указывает на текущее состояние клавиши <NumLock> (True — если клавиша включена и F a lse — в против­ ном случае).

Sub G etN um LockState()

Dim NumLock As New NumLockClass