Мир объектов Excel 2000


Пример обработки события Change


В качестве примера рассмотрим построение обработчиков события Change. Я рассмотрю обработку этого события на двух уровнях - уровне объекта Application, на нижнем уровне - объектом WorkSheet. Рассмотрение этого события представляет практический интерес, поскольку довольно часто в различных задачах приходится следить за изменениями, происходящими с рабочими страницами. С другой стороны, есть несколько важных нюансов, которые следует учитывать в процессе работы с этим событием.

В моем примере обработчик события Change объекта Application будет следить за всеми изменениями, которые пользователь выполняет на рабочих страницах различных документов Excel. Информация об изменениях будет регистрироваться в журнале изменений, заданным специально спроектированной формой. Как выглядит сама форма, увидим чуть позже, а сейчас замечу, что устроена она очень просто и содержит один список из пяти столбцов, в каждом из которых будут храниться данные о документе, в котором произошли изменения, странице, дате, адресе области изменения и новом значении, записанном в эту область. Вот текст обработчика события, возникающего при инициализации формы:

Private Sub UserForm_Initialize() 'Задание заголовков столбцов журнала изменений. With Me.ListBox1 .ColumnCount = 5 .AddItem "Книга" .Column(1, .ListIndex + 1) = "Страница" .Column(2, .ListIndex + 1) = "Дата" .Column(3, .ListIndex + 1) = "Адрес" .Column(4, .ListIndex + 1) = "Значение" End With End Sub

Приведу теперь текст обработчика события Change для объекта Application:

Private Sub ExApp_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'Запись в журнал всех изменений, проводимых пользователем. Dim RowIndex As Integer MsgBox ("Запись в журнал изменений!") RowIndex = JournalForm.ListBox1.ListCount With JournalForm.ListBox1 .AddItem Sh.Parent.Name .Column(1, RowIndex) = Sh.Name .Column(2, RowIndex) = Now .Column(3, RowIndex) = Target.Address .Column(4, RowIndex) = Target.Cells(1).Value End With End Sub


При каждом изменении на страницах любой из открытых рабочих книг, с которыми работает пользователь, соответствующая запись будет добавлена в список формы JournalForm. Заметьте, параметры Sh и Target, переданные обработчику события Change, позволяют однозначно задать всю информацию, требуемую для журнала. Взгляните, как выглядит наш журнал в процессе работы с ним:

Рис. 3.4.  Журнал изменений, созданный обработчиком события Change
В журнале нашли отражение почти все изменения, происшедшие со страницами рабочих книг - с разными ячейками, разными страницами, разными рабочими книгами. Почему не все изменения были зафиксированы в журнале, я скажу чуть позже, специально остановившись более подробно на объяснении этой ситуации. А сейчас давайте рассмотрим специальный обработчик этого же события, предусмотренный для страницы с именем "Лист1" книги BookThree. Вот его текст:
Private Sub Worksheet_Change(ByVal Target As Range) Static NumChange As Integer Dim Myr As Range NumChange = NumChange + 1 MsgBox ("Пишу Изменения!") Set Myr = ThisWorkbook.Worksheets("Лист2").Range("A1") Myr.Offset(NumChange, 0) = Target End Sub
Изменения, происходящие с ячейками этой страницы, будут фиксироваться не только в общем журнале изменений, но и заноситься на следующий лист этой же книги. Этот лист, по существу, является журналом изменений данной конкретной страницы. Такова общая схема работы с событием Change. А теперь давайте поговорим о нюансах.

Содержание раздела