ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.06.2025
Просмотров: 8996
Скачиваний: 0
События объекта 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Л |