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

630

Часть V. Профессиональные методы программирования

 

End W ith

 

 

 

. F ra m e E v e n ts . S c r o llH e ig h t

= . lb lE v e n t s . H e ig h t + 2 0

 

. F ra m e E v e n ts . S c ro llT o p =

EventNum *

2 0

 

End W ith

 

 

End

Sub

 

 

Процедура LogEvent обновляет

диалоговое

окно UserForm, изменяя свойство

C ap tio n элемента управления L abel, который называется lb lE v e n ts . Кроме того, процедура изменяет значения свойств S c ro llH e ig h t и S c ro llT o p элемента управ­ ления Frame, называющегося Fram eEvents. Элемент управления L abel расположен внутри элемента управления Frame. Изменение значений этих свойств приведет к ото­ бражению недавно добавленного текста и к сокрытию ранее добавленного текста. Мож­ но также изменить размер окна U serForm по вертикали. Для этого используется техни­ ка, описанная в главе 15.

События объекта UserForm

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

Таблица 19 .5 . Собы тия, поддерж иваем ы е объектом U serF orm

Событие

Действие, приводящее к возникновению события

A c tiv a te

Активизация диалогового окна UserForm

A ddC ontrol

Добавление элемента управления на этапе выполнения

B eforeD ragO ver

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

 

над диалоговым окном)

B eforeD rop O r-

Удаление или вставка данных пользователем (момент непосредствен­

P aste

ного отпускания кнопки мыши)

C lic k

Щелчок мышью в момент, когда ее указатель находится над диалого­

 

вым окном

D b lC lic k

Двойной щелчок мышью, когда ее указатель находится над диалоговым

 

окном

D e a c tiv a te

Деактивизация диалогового окна UserForm

E rr o r

Вызов ошибки элементом управления, но отсутствие возможности пе­

 

редать сведения о ней вызывающей программе

I n i t i a l i z e

Загрузка в память диалогового окна UserForm

KeyDown

Нажатие клавиши

KeyPress

Нажатие пользователем любой клавиши, приводящей квводусимвола

KeyUp

Отпускание клавиши

Layout

Изменение размеров диалогового окна UserForm

MouseDown

Нажатие кнопки мыши

MouseMove

Перемещение указателя мыши

MouseUp

Отпускание кнопки мыши

Q ueryClose

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

Rem oveControl

Удаление элемента управления из диалогового окна на этапе выполнения

b oo k _ B ef o re C lo s e ,
w ork-

632

Часть V. Профессиональные методы программирования

A p p lic a tio n .O n T im e

Now + T im eV a lu e ("0 0 :20 : 0 0 ") , _

" D is p la y A la rm "

 

Метод OnTime можно также использовать, если вы планируете вызов процедуры на определенную дату. Представленный далее оператор запустит процедуру D is p la y ­ Alarm 1 апреля 2010 года в 12:01,

A p p lic a t io n . OnTime D a t e S e r i a l (2 0 0 8 , 4 , 1) + _

T im e V a lu e ( " 0 0 : 0 0 : 0 1 " ) , " D is p la y A la rm "

П рим ечан ие

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

Приведенные ниже две процедуры демонстрируют методы управления повторяющими­ ся событиями. В данном случае ячейка А1 обновляется каждые пять секунд и в нее зано­ сится текущее время. При выполнении процедур U pdateC lock время сохраняется в ячей­ ке А1, и эта операция повторяется через пять секунд. Для остановки “часов” используется процедура StopC lock. Обратите внимание, что N extT ick — это переменная уровня мо­ дуля, которая сохраняет интервал времени перед наступлением следующего события.

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

 

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

этом

разделе

пример

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

 

к книге компакт-диске в файле o n tim e

e v e n t demo. xlsm .

Dim

N e x tT ic k

 

As D a te

 

 

 

 

 

 

Sub

U p d a te C lo c k ()

 

 

 

 

 

 

'

Вносит в

 

ячейку A l текущ ее значение

времени

 

 

T h is W o rk b o o k . S h e e ts ( 1 ) .R a n g e ( " A l" )

=

Tim e

 

1

Следующее

событие

вызывается

через

пять секунд

 

N e x tT ic k

=

Now + T im e V a lu e (" 0 0 :0 0 :0 5 " )

 

 

A p p lic a t io n . OnTime

N e x tT ic k ,

"U p d a te C lo c k "

 

End

Sub

 

 

 

 

 

 

 

 

Sub

S to p C lo c k ()

 

 

 

 

 

 

1

Отменяет

 

событие

OnTime

(часы останавливаю тся)

 

On E r r o r

Resume N e x t

 

 

 

 

 

 

A p p lic a t io n . OnTime

N e x tT ic k ,

" U p d a te C lo c k " ,

, F a ls e

End

Sub

 

 

 

 

 

 

 

 

П р едупр еж д ен и е

Событие OnTime наступает даже в том случае, когда рабочая книга закрывается. Другими словами, если закрыть рабочую книгу без запуска процедуры S to p C lo c k , рабочая книга повторно откроется через пять секунд (если Excel будет выполняться). Для предотвращения подобного поведения рабочей книги используется процедура обработки событий

которая содержит следующий оператор:

C a ll S to p C lo c k

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

Для просмотра примера повторения события OnTime обратитесь к примеру стрелочных часов, рассмотренному в главе 18.

Глава 19. Концепция событий Excel

633

Событие ОпКеу

В процессе работы Excel постоянно отслеживает нажимаемые пользователем клави­ ши. Поэтому вы можете настроить клавишу (или комбинацию клавиш), которая после нажатия запустит определенную процедуру. Эта клавиша не распознается, если пользо­ ватель вводит формулу или работает в диалоговом окне.

П р ед уп р еж д ен и е

МВД Учтите, что процедура, которая вызывается в ответ на событие ОпКеу, не ограничивается единственной рабочей книгой. Выбранная пользователем ком­ бинация клавиш может применяться во всех открытых рабочих книгах. Также, если вы планируете работать с событием ОпКеу, убедитесь в том, что имеется способ отмены вызываемого события. Для этого обычно используется проце­ дура обработки события W o rk b o o k B e f o re C lo s e .

Пример использования собы тия ОпКеу

Вследующем примере используется метод ОпКеу для настройки события ОпКеу.

Вданном случае переназначается значение клавиш <PgUp> и <PgDn>. После выполне­ ния процедуры Setup_OnKey нажатие клавиши <PgDn> приведет к запуску процедуры PgDn_Sub, а нажатие клавиши <PgUp> — процедуры PgUp_Sub. В итоге проведенных изменений нажатие клавиши <PgDn> вызывает перемещение курсора на одну строку вниз, а клавиши <PgUp> — на одну строку вверх.

Sub S etu p _ O nK ey()

A p p lic a t io n . ОпКеу A p p lic a t io n . ОпКеу

End Sub

" {P g D n }" ,

"PgDn_Sub"

"{P g U p }" ,

"PgUp_Sub"

Sub PgDn_Sub()

On E r r o r

Resume

N e x t

A c t iv e C e ll . O f f s e t (1 , 0 ) . A c t iv a t e

End

Sub

 

 

Sub

PgUp_Sub ()

 

On E r r o r

Resume

N e x t

A c t iv e C e ll . O f f s e t ( - 1 , 0 ) .A c t iv a t e

End Sub

 

/ N

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

 

Рассматриваемый в этом разделе пример находится на прилагаемом к книге

 

компакт-диске в файле onkey e v e n t dem o.xlsm .

В предыдущих примерах использовался оператор On E rro r Resume Next, кото­ рый позволял игнорировать все возникающие ошибки. Например, если активная ячейка находится в первой строке, то перемещение на одну строку вверх приводит к возникно­ вению ошибки. Кроме того, если активным является лист диаграммы, то возникнет ошибка, так как на листе диаграммы не существует такого понятия, как активная ячейка.

Запустив следующую процедуру, можно отменить событие ОпКеу и вернуть клави­ шам их обычную функциональность.

Sub Сапсе1_ОпКеу ()

A p p lic a t io n .ОпКеу "{P gD n }"

634

Часть V. Профессиональные методы программирования

A p p lic a t io n . ОпКеу

"{P gU p}"

End Sub

 

Использование пустой строки в качестве второго аргумента метода ОпКеу не приво­ дит к отмене текущего события ОпКеу. Вместо этого Excel игнорирует нажатие указан­ ных клавиш и не выполняет вообще никаких действий при их нажатии. Например, при­ веденный ниже оператор сообщает Excel, что необходимо игнорировать нажатие комби­ нации клавиш <Alt+F4> (символ процента представляет клавишу <Alt>).

A p p lic a t io n . ОпКеу " % {F 4 }" / ""

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

Хотя метод ОпКеу можно использовать для назначения комбинаций клавиш макросу, лучше для этого обратиться к диалоговому окну Параметры макро­ са (Macro Options). Дополнительные сведения можно найти в главе 9.

Коды клавиш

Наверное, вы обратили внимание, что в предыдущем примере кода клавиша <PgDn> заключена в фигурные скобки. Это— код клавиши. В табл. 19.6 приведены коды кла­ виш, которые можно использовать в процедурах, обрабатывающих событие ОпКеу.

Таблица 19 .6 . Коды клавиш для собы тия ОпКеу

Клавиша

<Backspace>

<Break> <Caps Lock>

<Delete> или <Del>

< i>

<End>

<Enter>

<Enter> (на цифровой клавиатуре) <Escape>

<Home>

<lns>

<<->

<NumLock> <Page Down> <Page Up>

< ->>

<Scroll Lock> <Tab>

<T>

От <F1> до <F15>

Код

{BACKSPACE} ИЛИ {BS}

{B R E A K }

{C A P S L O C K }

{DELETE} ИЛИ {DEL}

{DOWN}

{END}

~ (тильда)

{ENTER}

{escape} и л и {esc}

{H O M E }

{IN S E R T }

{L E F T }

{N U M L O C K }

{PGDN}

{PGUP}

{R IG H T }

{S C R O L L L O C K }

{T A B }

{UP}

От { F I } ДО { F 1 5 }

Можно также определить комбинации клавиш совместно с клавишами <Shift>, <Ctrl> и <Alt>. Для определения комбинации клавиш совместно с другими клавишами восполь­ зуйтесь следующим синтаксисом:

Глава 19. Концепция событий Excel

635

<Shift> — знак “плюс” (+);

<Ctrl> — знак “крышка” (А);

<Alt> — знак процента (%).

Например, для назначения процедуре комбинации клавиш <Ctrl+Shift+A> восполь­ зуйтесь следующим оператором:

A p p lic a tio n . ОпКеу " а +А ", "SubName:"

Для назначения процедуре комбинации клавиш <Alt+Fll> (обычно эти клавиши применяются для открытия окна VB Editor) используйте следующий оператор:

A p p lic a tio n . ОпКеу " ^ { F l l } " , "SubName"

Отключение контекстного меню

Ранее уже рассматривалась процедура W o rk sh eet_ B efo reR ig h tC lick , которая отключает контекстное меню. Приведенная ниже процедура размещается в модуле кода объекта ЭтаКнига (ThisW orkbook).

P riv a te Sub W o rk s h e e t_ B e fo re R ig h tC lic k

_

 

(B yVal

T a rg e t As

E x c e l.R a n g e ,

C a n c el

As B o o lean )

C ancel

= T ru e

 

 

 

 

MsgBox

"Попытка -

не пы тка, но

вам

не

п о в е зл о ."

End Sub

 

 

 

 

 

Пользователь по-прежнему может вызывать контекстное меню с помощью комбина­ ции клавиш <Shift+F10>. Для перехвата кодов этих клавиш в стандартный модуль VBA добавьте следующие процедуры.

Sub S e tu p N o S h iftF 1 0 ()

 

A p p lic a t io n . ОпКеу

" + {F 1 0 }" , " N o S h iftF lO "

End Sub

 

 

Sub T u r n O ffN o S h iftF 1 0 ()

A p p lic a t io n . OnKey

" + { F 1 0 } |"

End Sub

 

 

Sub N o S h iftF lO

()

 

MsgBox "Эти

клавиши не р аб о таю т ."

End Sub

 

 

После вызова на выполнение процедуры S e tu p N o S h iftF l0 нажмите комбинацию клавиш <Shift+F10> — и вы увидите сообщение, показанное на рис. 19.11. Помните о том, что процедура W orksheet_B ef o reR ig h t C lick корректно работает только в той рабо­ чей книге, в которой она была создана. С другой стороны, событие, вызываемое нажатием комбинации клавиш <Shift+F10>, применяется ко всем открытым рабочим книгам.

П рим ечание

На некоторых клавиатурах имеется специальная клавиша, которая вызывает контекстное меню. На моей клавиатуре такая клавиша находится в правой части клавиатуры между клавишами <Windows> и <Ctrl>. Как ни странно, но процедура перехвата комбинации клавиш <Shit+F10> также отключает выделенную клавишу вызова контекстного меню.