Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
97
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

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

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

События, представленные в этом разделе, относятся только к рабочим листам. Не существует подобных событий для диалоговых листов и листов макросов XLM

вExcel 5/95.

!Таблица 19.2. События объектаWorksheet

Событие

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

Activate

Активизация рабочего листа

BeforeDoubleClick

Двойной щелчок на рабочем листе

B e f o r e R i g h t C l i c k Щелчок правой кнопкой мыши на рабочем листе

C a l c u l a t e

Расчет {или перерасчет) значений рабочего листа

change

Значение ячейки рабочего листа изменено пользователем или внешней ссылкой

D e a c t i v a t e

Деактивизация рабочего листа

FollowHyperlink

Щелчок на гиперссылке в рабочем листе

PivotTableUpdate* Обновление сводной таблицы на рабочем листе

SeleclionChange

Перемещение курсора на рабочем листе

Этособытиепроисходит тольковExcel2002 инеподдерживаетсявпредыдущихверсиях.

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

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

Событие Change

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

При вызове процедуры Worksheet _ Change в качестве аргумента T a r g e t ей передается объект Range. Этот объект представляет изменившуюся ячейку или диапазон, которые привели к возникновению события. Следующий пример отображает окно сообщения, которое выводит адрес диапазона, указанного в параметре T a r g e t .

P r i v a t e Sub Worksheet_Change(ByVal T a r g e t As Excel . Range) MsgBox "Диапазон " & Target - Address & " изменился . "

End Sub

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

ЧастьV.Совершенныеметодыпрограммирования

509

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

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

Изменение (]юрматнрования ячейки не приводит к возникновению события Change, а использование команды Правка^ОчиститьоФорматы, наоборот, вызывает это событие.

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

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

Ячейки, которые изменяются с помощью команд Excel, могут генерировать, а могут и не генерировать событие change . Например, команды Данные^Форма и Данные1 * Сортировка не содействуют возникновению события Change. Зато команды Сервис* Орфография и Правка^Заменить приводят к генерированию этого события.

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

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

Кроме перечисленных выше особенностей, возникновение события change в ответ на определенные действия зависит и от версии Excel. 60 всех версиях Excel до 2002 заполнение диапазона с помощью команды Правка^Заполнить не приводило к возникновению события change. Подобным образом вела себя команда Правка^Удалить, которая удаляла содержимое выделенного диапазона.

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

Событие Change возникает при внесении изменении в любую из ячеек рабочего листа. Но в большинстве случаев важно отслеживать изменения, которые вносятся в определенную ячейку или диапазон. Когда вызывается процедура обработки события Worksheet_Change, она получает в качестве параметра объект Range. Этот объект представляет диапазон ячеек или ячейку, которая после изменения приводит к возникновению события Change. Предположим, что на рабочем листе определен диапазон InputRange, и вам необходимо отслеживать только тс изменения, которые внесены в этом диапазоне. Не существует события Change для отдельного объекта Range, но можно выполнить необходимую проверку в начале процедуры Worksheet_Change:

Private Sub Worksheet__Change (ByVal Target As Excel.Range) Dim VRange As Range

Set VRange = Range("InputRange")

If Not IntersectfTarget, VRange) Is Nothing Then _ MsgBox "Изменена ячейка тбкущего диапазона."

End Sub

В данном примере используется объект Range, который называется VRange. Он представляет диапазон ячеек на рабочем листе, который необходимо проверять на предмет внесения изменений. Процедура использует функцию VBA I n t e r s e c t , чтобы определить располо-

жение диапазона T a r g e t (полученного в качестве атрибута

процедуры) в диапазоне VRange.

510

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

Функция Intersect возвращает объект, который состоит из всех ячеек, содержащихся в обоях аргументах. Если функция I n t e r s e c t возвращает значение Nothing, то у этих диапазонов нет общих ячеек. Оператор отрицания Not используется для того, чтобы выражение стало равным True в том случае, если указанный диапазон имеет хотя бы одну общую ячейку с диапазоном VRange. Таким образом будет отображено окно сообщения. В противном случае ничего не происходит, и процедура завершает свою работу.

Внесениезаписей об изменениях в комментарии ячеек

В следующем примере представлено, как добавлять заметки к комментарию в ячейке при внесении в нее изменений (что определяется событием Change). Значение элемента управления CheckBox, добавленного на лист, определяет необходимость внесения заметок в комментарий ячейки. На рис. 19.5 показан пример комментария ячейки, в которую несколько раз вносились изменения.

Рис. 19.5. Процедура Worksheet_Change добавляет заметкиобизмененияхвкомментарийячейки

ЭтотпримерсодержитсянаWeb-узлеиздательства.

Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim cell As Range

Dim OldText As String, NewText As String

If CheckBoxl Then

For Each cell In Target With cell

On Error Resume Next OldText = .Comment.Text

If Err <> 0 Then .AddComment

NewText = OldText & "Изменено на " & cell.Text & _

". " & Application.UserName & ",

" & Now & vbLf

.Comment.Text NewText

 

.Comment.Visible = True

 

.Comment.Shape.Select

 

Часть V. Совершенные методы программирования

511

Selection.AutoSize = True

.Comment.Visible = False End with

Next cell End If

End Sub

Так как объект, который передан в процедуру Worksheet_Change, может состоять из многоячеечного диапазона, процедура циклически просматривает все ячейки диапазона Target . Если ячейка еще не содержит комментария, то он добавляется. Новый текст будет добавлен в конец уже существующего комментария {если такой существует).

Данный пример является обучающим. Если вам действительно необходимо отслеживать изменения в рабочем листе, воспользуйтесь командой Excel Сервис^Исправления. Эта команда может предоставить намного больше возможностей, чем приведенный выше пример.

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

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

На Web-узле издательства содержится две версии этого примера. В одной из них используется свойство EnableEvents для предотвращения бесконечного цикла возникновения событий Change. Во второй версии применена статическая булева переменная (дополнительная информация об отключении событий приводится в разделе "Отключение событий" ранее в этой главе).

Листинг 19.1 содержит процедуру, которая выполняется каждый раз при внесении изменений в ячейку со стороны пользователя. Проверка ограничена диапазоном, называющимся I n p u t R a n g e . В этот диапазон разрешается вводить только целые значения от 1 до 12.

Листинг19.1.Определениеправильностивведенныхданных

Private Sub Worksheet_Change{ByVal Target As Excel.Range) Dim VRange As Range, cell As Range

Dim Msg As String

Dim ValidateCode As Variant

Set VRange = Range("InputRange") For Each cell In Target

If Union{cell, VRange).Address = VRange.Address Then ValidateCode = EntrylsValid(cell)

If ValidateCode = True Then Exit Sub

Else

Msg = "Ячейка " & cell.Address(False, False) & " : " Msg = Msg & vbCrLf & vbCrLf & ValidateCode

MsgBox Msgr

vbCritical,

"Неправильное значение"

Application.EnableEvents

= False

cell.ClearContents

 

cell.Activate

 

Application.EnableEvents

= True

572

 

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

End If

End If

Next cell

End Sub

Процедура Worksheet _ Change создает объект Range. Он называется VRange и представляет проверяемый диапазон на рабочем листе. В результате циклически просматриваются вес ячейки аргумента T a r g e t , представляющего диапазон изменившихся ячеек. В коде определяется, наход*ггся ли изменившаяся ячейка в проверяемом диапазоне, и если это так, передает ячейку в качестве аргумента другой функции ( E n t r y l s V a l i d ) , возвращающей значение T r u e для действительного значения ячейки.

Если значение ячейки выходит за пределы набора допустимых значений, то функция E n t r y l s V a l i d возвращает строку, которая описывает проблему. Затем выводится окно сообщения (рис. 19.6). После закрытия окна сообщения неправильное значение ячейки удаляется, и ячейка активизируется. Обратите внимание, что перед удалением значения ячейки события отключаются. Если события не отключить, то ячейка создаст событие Change и введет процедуру в бесконечный цикл.

Рис. 19.6- Это окно сообщения описывает проблему,возникающуюпривведениемнользователе.»недопустимыхданных

Ниже приведен листинг процедуры EntrylsValid.

Листинг 19.2. Проверка принадлежности значения диапазону

Private Function EntrylsValid(cell) As Variant

'Возвращает True, если в ячейку вводится целое число в диапазоне от 1

1до 12. В противном случае возвращается строка, описывающая проблему

'Число

If Not WorksheetFunction.IsNumber(cell) Then EntrylsValid = "Нечисловое значение."

Exit Function

End If

1Целое?

If Clnt(cell) <> cell Then

EntrylsValid = "Введите целое число." Exit Function

End If

'диапазон?

If cell < 1 Or cell > 12 Then

EntrylsValid = "Значение должно быть в диапазоне от 1 до 12." Exit Function

End If

'Тест завершен успешно

EntrylsValid = True

End Function

ЧастьV.Совершенныеметодыпрограммирования

51Л

Событие SelectionChange

Следующая процедура демонстрирует использование события S e l e c t i o n C h a n g e . Она выполняется каждый раз, когда пользователь создает новое выделение на рабочем листе.

Private Sub Worksheet_SelectionChange(ByVal Target _ As Excel.Range)

Cells.Interior.Colorlndex = xlNone With Activecell

.EntireRow.Interior.Colorlndex = 27

.EntireColumn.Interior.ColorIndex = 27 End With

End Sub

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

•.с.19.7.Щелчокнаячейкеприводитквыделениюеестрокиистолбца

Этот пример доступен на Web-узле издательства.

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

514

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

Событие BeforeRightClick

Когда пользователь щелкает правой кнопкой мыши на рабочем листе, Excel отображает контекстное меню. Если по определенной причине необходимо отключить появление контекстного меню на одном из рабочих листов, то можно перехватить событие BeforeRightClick. Следующая процедура устанавливает значение аргумента Cancel равным True, что приводит к отмене обработки события BeforeRightClick. Таким образом, можно отключить появление контекстного меню в конкретном рабочем листе.

Private Sub Worksheet__BeforeRightClick _

{ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True

MsgBox "Контекстное меню не доступно." End Sub

В главе 24 описываются другие методы отключения контекстного меню.

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

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

Обратитесь к главе 18 за примерами управления событиями объекта chart. Кроме того, в главе 18 описывается создание модуля класса для поддержки событий встроенных диаграмм.

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

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

Событие

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

Activate

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

Befo r e D o u b i e C l i c k Двойной щелчок на листе диаграммы или на встроенной диаграмме. Это событие происходит до обработки двойного щелчка, принятого по умолчанию

B e f o r e R i g h t C l i c k Щелчок правой кнопкой мыши на листе диаграммы или на встроенной диаграмме. Это событие происходит до обработки такого щелчка правой кнопкой мыши, который принят по умолчанию

calculate

На диаграмме отображаются новые или обновленные данные

 

D e a c t i v a t e

Деактивизация диаграммы

 

DragOver

Диапазон ячеек перетаскивается через диаграмму

 

D r a g p o i n t

Диапазон ячеек перетаскивается и отпускается на диаграмму

 

MouseDown

Кнопка мыши нажимается в тот момент, когда указатель располагается над

 

диаграммой

 

MouseMove

Указатель мыши перемещается над диаграммой

 

Mouseup

Кнопка мыши отпускается в тот момент, когда указатель располагается над

 

диаграммой

 

Часть V. Совершенные методы программирования

515

 

Окончаниетабл.19.3

Событие

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

R e s i ze

Изменились размеры диаграммы

select

Выделен один из элементов диаграммы

S e r i e s c h a n g e

Изменилось значение точки данных в одной из последовательностей диаграммы

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

В предыдущих разделах были описаны события объектов Workbook и Worksheet . Эти события рассматривались по отношению к определенной рабочей книге или рабочему листу. Если требуется проконтролировать возникновение событий для всех открытых рабочих книг или рабочих листов, то рекомендую обратиться к событиям уровня объекта A p p l i c a t i o n .

Использование браузераобъектовдля поиска событий

Окно Object Browser является полезным инструментом, который поможет получить информацию об объектах, их свойствах и методах. Кроме того, окно Object Browser предоставляет возможность определить, какие объекты поддерживают определенное событие. Предположим, что необходимо найти объекты, которые поддерживают событие MouseMove. Активизируйте редактор VBE и нажмите клавишу <F2>, чтобы отобразить окно Object Browser. Удостоверьтесь, что выбран пункт <AII Libraries>, после чего введите MouseMove и щелкните на кнопке с изображением бинокля.

ОКНО Object Browser отобразит список ПОДХОДЯЩИХ объектов. События обозначаются с помощью небольшой желтой молнии, На основании этого списка можно определить, какие объекты поддерживают событие MouseMove. Многие объекты, которые будут найдены, являются элементами управления, находящимися в библиотеке MSForms. Элемент управления

516

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

UserForm также находится в этой библиотеке, а событие MouseMove поддерживается даже объектом chart.

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

Создание процедуры обработки события для объекта Application требует создания модуля класса и дополнительных действий по настройке среды.

В табл. 19.4 перечислены события объекта Application с кратким описанием каждого

из них.

{Таблица 19.4. События, поддерживаемые объектомApplication

Событие

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

 

 

события

 

Newworkbook

Создана новая рабочая книга

 

SheetActivate

Активизирован любой лист

 

sheetBeforeDoubleclick

Двойной щелчок на любом из листов. Это событие

 

 

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

 

 

по умолчанию

 

sheetBeforeRightciick

Щелчок правой кнопкой мыши на любом из листов. Это

 

 

событие происходитдо обработки щелчка правой кноп-

 

 

коймыши, принятого поумолчанию

 

sheetcaicuiate

Рассчитывается (или перерассчитывается) любой лист

 

sheetchange

Ячейки в любом листе были изменены пользователем

 

 

или со стороны внешней ссылки

 

sheetDeactivate

Деактивизирован любой лист

 

sheetFollowHyperlink

Щелчок на гиперссылке

 

SheetPivotTableUpdate

Обновление сводной таблицы

 

SheetSelectionChange

Изменилось выделение на любом листе, кроме листа

 

 

диаграммы

 

windowActivate

Активизировано окно любой рабочей книги

 

windowDeactivate

Деактивизировано окно любой рабочей книги

 

windowResize

Изменены размеры окна любой рабочей книги

 

workbookActivate

Активизирована рабочая книга

 

workbookAddininstaii

Рабочая книга установлена в качестве надстройки

 

workbookAddinUninstall

Удалена надстройка

 

workbookBef oreciose

Закрыта любая открытая рабочая книга

 

workbookBeforeprint

Напечатана любая рабочая книга

 

WorkbookBef oreSave

Сохранена любая рабочая книга

 

Часть V. Совершенные методы программирования

517

 

Окончание табл. 19.4

Событие

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

 

события

workbookDeactivate

Деактивиэироеана любая открытая рабочая книга

WorkbookNewSheet

Новый лист создан в любой открытой рабочей книге

workbookopen

Открыта рабочая книга

workBookPivotTablecloseconnection* Закрыто соединение с внешним источником данных сводной таблицы

WorkbookPivotTableOpenConnection* Открыто соединение с внешним источником данных сводной таблицы

ЭтособытиепроисходиттольковExcel2002инеподдерживаетсявпредыдущихверсиях.

Включение событий уровня объекта Application

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

1.Создайте новый модуль класса.

2.Присвойте имя этому модулю класса в окне Properties. По умолчанию VBA присваивает каждому новому модулю класса такие имена, как Classl, Class2 и т.д. Рекомендуется использовать более описательное имя.

3.В модуле класса объявите глобальный объект Application, используя ключевое слово WithEvents. Например:

Public WithEvents XL As Application

4.Создайте переменную, которая будет использоваться в качестве ссылки на объект Application в модуле класса. Это должна быть переменная уровня модуля, объявленная в обычном модуле VBA (а не в модуле класса). Например:

Dim X As New Classl

5.Свяжите объявленную переменную с объектом Application. Обычно эта операция выполняется в процедуре Workbook_Open.

Set X.XL = Application

6.Создайте процедуры обработки событий и поместите их в модуль класса.

Эти действия практически идентичны выполняемым при обработке событий на уровне объекта встроенной диаграммы. Дополнительная информация по обработке событий встроенной диаграммы приводится в главе 18.

Определение факта открытия рабочей книги

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

518

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

Соседние файлы в папке 2 семестр