Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
59
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Классы, объекты With Events и обработчики событий

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

  • Создать модуль, в котором можно строить обработчики событий:

  • Создать сам объект Excel.Application With Events и связать его с текущим Excel приложением.

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

Модуль класса с объектом WithEvents

Модуль, в котором будут появляться обработчики событий объекта Excel.Application, синтаксически является модулем класса, который нужно создать. Этот класс очень прост по своей структуре и при создании он содержит единственное закрытое свойство - соответствующий объект Application, объявленный со спецификатором WithEvents. Так что в нашем примере все описание создаваемого класса, который назовем, например, ExcelWithEvents сводится к одной содержательной строке:

Option Explicit

'Класс ExcelWithEvents

Private WithEvents xlApp As Excel.Application

Как только такое свойство определено в классе, в окне кода этого модуля появляется объект xlApp, обладающий событиями, тут же можно выбрать из списка соответствующее событие, создать заготовку и затем наполнить ее содержанием. Взгляните на соответствующий рисунок:

увеличить изображение Рис. 4.4.  Класс с объектом Excel.Application WithEvents

Мы ограничились созданием двух обработчиков события NewWorkbook и OpenWorkbook. Вот их текст:

Private Sub xlApp_NewWorkbook(ByVal Wb As Excel.Workbook)

MsgBox("Рад, что вы открыли книгу " & Wb.Name)

End Sub

Private Sub xlApp_WorkbookOpen(ByVal Wb As Excel.Workbook)

MsgBox ("Рад, что вы открыли книгу " & Wb.Name)

End Sub

Как видите, первая проблема решается достаточно просто и не требует введения новых средств. Но, обратите внимание, остается непонятным, что характеризует наш единственный объект xlApp, - конкретный экземпляр приложения, для которого создаются обработчики событий, или эти обработчики распространяются на множество экземпляров объектов класса ExcelWithEvents Но, поскольку объекты Application присутствуют в одном экземпляре, то не будем сейчас вдаваться в эти тонкости, позже мы еще вернемся к этому вопросу.

Объект 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.