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

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

617

Помните, что код процедуры обработки события рабочего листа должен храниться в модуле кода соответствующего объекта рабочего листа.

т т

Для быстрого перехода к окну модуля кода щелкните правой кнопкой мыши на ярлычке листа и выберите пункт Исходный текст (View Code).

Событие Change

Событие Change возникает в момент изменения значения ячейки пользователем или VBA-процедурой. Событие Change не возникает, когда расчеты приводят к появлению другого значения формулы или когда на рабочий лист добавляется новый объект.

При вызове процедуры W orksheet_C hange в качестве аргумента T a rg e t ей пере­ дается объект Range. Этот объект представляет изменившуюся ячейку (или диапазон), которая привела к возникновению события. В следующем примере отображается окно сообщения, которое выводит адрес диапазона, указанного в параметре T a rg et.

P rivate Sub W o rksh ee t_ C h a n g e(B yV al T a rg e t

As E x c e l.R a n g e )

MsgBox "Д иапазон " & T a rg e t.A d d re s s &

" и зм ен и л ся ."

End Sub

 

Для того чтобы получить представление о типах действий, которые приводят к возник­ новению события Change в рабочем листе, добавьте предыдущую процедуру в модуль ко­ да объекта W orksheet. После ввода этой процедуры активизируйте Excel и внесите изме­ нения в рабочий лист, используя для этого различные методы. Каждый раз при возникно­ вении события Change будет отображаться адрес диапазона, который изменился.

После запуска этой процедуры вами может быть замечена интересная особенность: некоторые действия, которые должны способствовать возникновению этого события, ни к чему не приводят, а те, которые не должны выполнять эту задачу, приводят к возник­ новению события Change!

Изменение форматирования ячейки не приводит к возникновению события Change, а использование команды Главная1^Редактирование^Очистить^Очистить фор­ маты (Home^Editing^Clear^Clear Formats), наоборот, вызывает это событие. Так­ же это событие вызывается при использовании диалогового окна Специальная вставка (Paste Special).

Добавление, редактирование или удаление комментария в ячейке не приводит к возникновению события Change.

Нажатие клавиши <Del> приводит к генерации события Change даже в том слу­ чае, если в ячейке не содержится данных.

Ячейки, которые изменяются с помощью команд Excel, могут генерировать, а могут и не генерировать событие Change. Например, команды сортировки диапазона не генерируют это событие, а проверка грамматики — генерирует.

I• Если процедура VBA изменяет содержимое ячейки, то это приводит к возникнове­ нию события Change.

Рассматривая приведенный выше список, вы убедитесь, что использовать событие Change для отслеживания изменений в ячейках нецелесообразно.

618

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

О тслеж ивание изм енений в определ ен н ом д иапазон е

Событие Change возникает при внесении изменений в любую ячейку рабочего листа. Но в большинстве случаев важно отслеживать изменения, которые вносятся в опреде­ ленную ячейку или диапазон. Когда вызывается процедура обработки события Worksheet_ C hange, она получает в качестве параметра объект Range. Этот объект пред­ ставляет диапазон ячеек или ячейку, которая после изменения приводит к возникнове­ нию события Change.

Предположим, что на рабочем листе определен диапазон In p u t Range, и вам необ­ ходимо отслеживать только те изменения, которые внесены в этом диапазоне. Не суще­ ствует события Change для отдельного объекта Range, но можно выполнить необхо­ димую проверку в начале процедуры W orksheet_C hange.

P r iv a t e Sub W o rksh ee t_ C h a n g e(B yV al

T a rg e t As E x c e l.R a n g e )

Dim

MRange

As Range

 

 

S e t

MRange

= R a n g e ( " In p u tR a n g e " )

 

 

I f

N o t In t e r s e c t ( T a r g e t , MRange)

Is

N o th in g Then _

 

MsgBox

"Изменена ячейка текущ его

д и а п а зо н а ."

End Sub

 

 

 

В данном примере используется объект Range, который называется VRange. Он представляет диапазон ячеек на рабочем листе, который необходимо проверять на пред­ мет внесения изменений. Процедура использует функцию VBA I n te r s e c t, чтобы оп­ ределить расположение диапазона T a rg e t (полученного в качестве атрибута процеду­ ры) в диапазоне VRange. Функция I n t e r s e c t возвращает объект, который состоит из всех ячеек, содержащихся в обоих аргументах. Если функция I n t e r s e c t возвращает значение N othing, то эти диапазоны не имеют общих ячеек. Оператор отрицания Not используется для того, чтобы выражение стало равным T rue в том случае, если указан­ ный диапазон имеет хотя бы одну общую ячейку с диапазоном VRange. Таким образом, будет отображено окно сообщения. В противном случае ничего не происходит, и проце­ дура завершает свою работу.

В ы деление ф орм ул полуж ирны м ш риф том

В следующем примере выделяются полужирным шрифтом все формулы рабочего листа.

P r iv a t e

Sub

W o rksh ee t_ C h a n g e(B yV al T a rg e t As E x c e l.R a n g e )

Dim

c e l l

As Range

F o r

Each

c e l l In T a rg e t

c e l l . F o n t . B o ld = c e ll.H a s F o r m u la

N e x t

c e l l

 

End Sub

 

 

Поскольку

передаваемый процедуре W orksheet_Change объект может включать

диапазон, состоящий из ряда ячеек, процедура выполняет цикл по всем ячейкам в диапазо­ не T arg et. Если ячейка содержит формулу, эта формула выделяется полужирным шриф­ том. Если же формулы в ячейке нет, свойству Bold присваивается значение F alse .

Эта процедура работает, хотя и неидеально. Что произойдет, если пользователь уда­ лит строку или столбец?-В подобном случае диапазон T a rg e t будет состоять из боль­ шого количества ячеек. Проверка всех этих ячеек с помощью цикла For Each отнимет очень много времени, и в итоге требуемые формулы не будут найдены.

В приведенной ниже модифицированной процедуре эта проблема решается путем из­ менения диапазона T a rg e t таким образом, чтобы он представлял собой результат пере­ сечения диапазона T a rg e t и диапазона, используемого рабочим листом. Для того чтобы

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

619

не допустить возникновение ситуации, когда T a rg e t равен N othing, исключается слу­ чай, когда пустая строка или столбец находится за пределами используемого диапазона.

P riv a te Sub

W o rksh ee t_ C h a n g e(B yV al T a rg e t As E x c e l.R a n g e )

Dim

c e l l

As Range

 

 

S et T a rg e t = I n t e r s e c t ( T a r g e t , T a r g e t . P a re n t.U s e d R a n g e )

I f

N o t

T a rg e t Is

N o th in g Then

 

F o r

Each c e l l

In

T a rg e t

 

c e l l . F o n t . B o ld

= c e l l . H asForm ula

 

N e x t

 

c e l l

 

 

End

I f

 

 

 

 

End Sub

 

 

 

 

 

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

 

 

Этот пример находится на прилагаемом к книге компакт-диске в файле make

 

fo rm u la s b o ld .x ls m .

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

Использование процедур w o rks h e et_ c h a n g e ведет к отключению свойства отмены операций Excel. При вызове подобного макроса происходит разруше­ ние стека отмены операций. При использовании процедуры обработки собы­ тия W o rksh eet change вызывается макрос при каждом изменении рабоче­ го листа.

Проверка правильности введенны х данны х

Средство Excel проверки данных может оказаться очень ценным инструментом, но его применение может вызвать, следующую серьезную проблему. При вставке данных в ту ячей­ ку, в которой реализуется проверка данных, не только не проверяется значение, но и правила проверки, которые связаны с этой ячейкой, безвозвратно удаляются! Таким образом, инстру­ мент проверки данных становится практически бесполезным в собственных приложениях. В этом разделе продемонстрированы методы использования события Change объекта Worksheet для создания процедур проверки правильности введенных данных.

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

©На прилагаемом к книге компакт-диске находятся две версии этого

примера. В первом примере (под названием v a l id a t e e n t r y l.x ls m ) ис­ пользуется свойство E n a b le E v e n ts для предотвращения бесконечного цикла возникновения событий change; во втором (под названием v a lid a t e e n t r y 2 . xlsm ) используется статическая переменная (см. раздел “Отклю­ чение событий”).

Процедура W orksheet_C hange, код которой приведен ниже, вызывается в случае, когда пользователь изменяет ячейку. Проверка ограничена диапазоном In p u t Range. Вэтот диапазон разрешается вводить только целые значения от 1 до 12.

Private Sub W o rksh ee t_ C h a n g e(B yV al

T a rg e t

As Range)

Dim VRange

As

Range,

c e l l As

Range

 

Dim

Msg As

S t r in g

 

 

 

 

 

Dim

V a lid a te C o d e

As

V a r ia n t

 

 

 

Set

VRange

=

R a n g e ( " In p u tR a n g e " )

 

 

I f

In te r s e c t(V R a n g e ,

T a rg e t)

Is

N o th in g

Then E x it Sub

For

Each c e l l

In

In te r s e c t(V R a n g e , T a rg e t)

 

V a lid a te C o d e =

E n t r y l s V a l id ( c e ll )

 

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

621

'Целое?

 

I f

C l n t ( c e l l )

<>

c e l l

Then

 

 

 

E n t r y ls V a lid

=

"Введите

целое ч и с л о ."

 

 

E x it

F u n c tio n

 

 

 

 

End

I f

 

 

 

 

 

 

1

Диапазон?

 

 

 

 

 

 

I f

c e l l

< 1 O r

c e l l >

12 Then

 

 

E n t r y ls V a lid

=

"Значение

должно находиться в диапазоне _

 

 

между 1

и

1 2 ."

 

 

 

 

E x it

F u n c tio n

 

 

 

 

End

I f

 

 

 

 

 

 

1

Тест завершен

успешно

 

 

 

E n t r y ls V a lid

=

T ru e

 

 

End F u n c tio n

 

 

 

 

 

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

P riv a te

Sub

W o rksh ee t_ C h a n g e(B yV al T a rg e t As Range)

Dim

VT

As

Long

1 Все

ли

ячейки в диапазоне

'прошли процедуру проверки?

On

E r r o r Resume N e x t

VT

= R a n g e ( " In p u tR a n g e " ) . V a l i d a t i o n . Type

I f

E rr.N u m b e r <> 0

Then

 

App1 i с a t i o n . Undo

 

 

MsgBox "Отменена

последняя о п е р а ц и я ." & _

"Удалены правила проверки д а н н ы х .", v b C r it i c a l

End I f End Sub

Эта процедура обработки событий проверяет статус проверки данных диапазона (под именем InputR ange), в котором предположительно содержатся правила проверки вводимых данных. Если переменная VT содержит ошибку, значит, одна или более ячеек в диапазоне InputR ange больше не включают правил проверки вводимых данных. Подобное явление может быть результатом копирования данных в диапазон, который содержит правила проверки вводимых данных. В этом случае код вызывает метод Undo объекта A p p lic a tio n , отменяя тем самым действие, выполненное пользователем. При этом отображается окно сообщения, показанное на рис. 19.7.

П р и м еч ан и е

Благодаря использованию этой процедуры предотвращается разрушение стека отмены операций.

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

Рассматриваемый в этом разделе пример находится на прилагаемом к книге компакт-диске в файле v a l id a t e e n try 3 . xlsm .

624

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

Обратите внимание, что пользователь по-прежнему может получить доступ к контек­ стному меню, нажав комбинацию клавиш <Shift+F10>. Но далеко не все пользователи Excel об этом знают.

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

©Если вы интересуетесь способом перехвата комбинации клавиш <Shift+F10>, обратитесь к разделу “Событие ОпКеу”. В главе 23 описываются другие мето­ ды отключения контекстных меню.

Ниже представлен еще один пример, демонстрирующий использование события Веfo re R ig h tC lic k . Эта процедура проверяет наличие числового значения в ячейке, на которой выполнен щелчок правой кнопкой мыши. Если числовое значение обнаружено, отображается диалоговое окно Формат ячеек (Format Cells), открытое на вкладке Число (Number), а аргументу C ancel присваивается значение True (при этом стандартное контекстное меню не отображается). Если в ячейке не содержится числовое значение, ничего не происходит — отображается стандартное контекстное меню.

P r iv a t e Sub W o rk s h e e t_ B e fo re R ig h tC lic k

_

(B yV al 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 )

I f

Is N u m e r ic (T a r g e t) And N o t

Is E m p ty (T a rg e t) Then

 

A p p lic a tio n .D ia lo g s (x lD ia lo g F o r m a tN u m b e r ) .Show

 

C ancel = T ru e

 

 

End

I f

 

 

End Sub

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

События объекта c h a r t

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

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

©Дополнительные примеры управления событиями объекта C h a rt можно найти в главе 18. Здесь же приведено описание методов создания модуля класса, применяемого для управления событиями встроенных диаграмм.

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

Таблица 19 .3 . Собы тия, поддерж иваем ы е л и стам и д и агр ам м

Событие

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

 

A ct iv a te

Активизация листа диаграммы или встроенной диаграммы

 

B e fo re D o u b le C lic k

Двойной щелчок мышью на листе диаграммы или встроенной

диа­

 

грамме (событие происходит до обработки двойного щелчка,

при­

 

нятого по умолчанию)

 

626

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

чающей элемент управления UserForm . Это событие также поддерживается объектом

Excel C h a rt.

Обратите внимание на то, что список делится на три столбца: Library (Библиотека), Class (Класс) и Member (Элемент). Элемент, соответствующий критерию поиска, может оказаться в любом из этих столбцов. Это приводит к сложной проблеме, связанной с тем, что имя события или термина относится к двум библиотекам или классам, хотя не всегда представляет одинаковую функциональность. Поэтому следует щелкнуть на ка­ ждом из интересующих элементов, отображенных в окне Object Browser, и сравнить информацию, которая приводится под списком. Может оказаться, что отдельный класс или библиотека рассматривает события различным образом.

События объекта A p p lic a t io n

В предыдущих разделах были описаны события объектов Workbook и W orksheet. Эти события рассматривались по отношению к определенной рабочей книге или рабоче­ му листу. Если требуется проконтролировать возникновение событий для всех открытых рабочих книг или рабочих листов, рекомендуется обратиться к событиям уровня объекта

Ap p lic a tio n .

Пр им ечан ие

Создание процедуры обработки события для объекта A p p lic a t io n требует создания модуля класса и выполнения дополнительной работы по настрой­ ке среды.

В табл. 19.4 перечислены события объекта A p p lic a tio n с кратким описанием каж­ дого из них. В Excel 2010 появилось несколько новых событий, имеющих отношение к защищенному режиму окон и сводным таблицам. Дополнительные сведения по этой те­ ме можно найти в справочной системе.

Таблица 19 .4 . С обы тия, поддерж иваем ы е объ ектом A p p l i c a t i o n

Событие

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

A f t e r C a lc u la te

Завершение вычислений, отсутствие очереди на выполнение

 

вычислений

NewWorkbook

Sheet A c tiv a te

S h eetB ef o re D o u b le C lic k

S h e e tB e fo re R ig h tc lic k

Создание книги Активизация произвольного листа

Двойной щелчок на любом листе (событие происходит до об­ работки двойного щелчка, принятого по умолчанию)

Щелчок правой кнопкой мыши на любом листе (событие про­ исходит до обработки щелчка правой кнопкой мыши, принято­ го по умолчанию)

Sheet C a lc u la te

Sheetchange

S heetD eact iv a te

S h e e tF o llo w H y p e rlin k Sheet P i vo tT ab le U p d a te Sheet S electio n C h an g e

Вычисление (либо повторное вычисление) любого листа

Изменение пользователем либо внешней ссылкой ячеек в лю­ бом листе Деактивизация любого листа Щелчок на гиперссылке

Обновление любой сводной таблицы Изменение выделения на любом листе, кроме листа диаграммы