Вторая проблема решается также довольно просто. Но здесь есть одна тонкость, которую следует понимать. Реально создаются два объекта, мы называем их двойниками. Один из них это обычный объект 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.