Основы офисного программирования и язык VBA

         

Объект WithEvents


Вторая проблема решается также довольно просто. Но здесь есть одна тонкость, которую следует понимать. Реально создаются два объекта, мы называем их двойниками. Один из них это обычный объект Excel.Application, другой - объект Excel.ApplicationWithEvents из класса ExcelWithEvents. Эти два объекта должны быть связаны одной ссылкой. Вот процедура, которая в нашем примере вызывается в документе Word в тот момент, когда пользователь решит начать работу с книгами Excel:

Public Sub CreateExApp() Const PathToMyDir = "e:\O2000\CD2000\Ch4\" 'Чистый Excel Dim MyEx As New Excel.Application 'Excel With Events Dim MyExWithEv As New ExcelWithEvents 'Связывание Set MyExWithEv.xlApp = MyEx 'Добавляем новую книгу и открываем существующую 'Обработчики событий New и Open работают! With MyEx .Visible = True .Workbooks.Add 1 .Workbooks.Add PathToMyDir & "BookOne" End With End Sub

Поверьте, обработчики событий действительно вызывались, как при создании новой книги, так и открытии книги, основанной на существующем шаблоне. Осталось сказать несколько слов о том, как это все могло выглядеть, если всю эту процедуру осуществлять в самом Excel. Обратите внимание, в нашем примере Excel Application с событиями появляется до того, как открыта какая либо из его книг. Если же работать в Excel, то описание объекта с событиями и связывание необходимо поместить в первую из открываемых книг. Мы проделали эту работу и в проекте книги BookOne создали класс ExcelWithEvents, а в одном из стандартных модулей создали процедуру:

Public Sub ConnectingWithEvents() Const PathToMyDir = "e:\O2000\CD2000\Ch4\" 'Excel With Events Dim MyExWithEv As New ExcelWithEvents 'Связывание Set MyExWithEv.xlApp = Excel.Application 'Добавляем новую книгу и открываем существующую 'Обработчики событий New и Open работают! With Application .Visible = True .Workbooks.Add 1 .Workbooks.Add PathToMyDir & "BookTwo" End With

End Sub

Как видите, эта процедура отличается от процедуры CreateExApp лишь незначительными деталями. Возникает вопрос, как и когда запускать эту процедуру. Можно это делать по-разному, например, вызывать ее в обработчике события Click командной кнопки, можно вызывать ее в обработчике события OpenDocument. В последнем случае, обработчики событий объекта Application будут выполняться для всех книг, сразу после открытия книги BookOne.



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