События, связанные с рабочей книгой
В нижеследующей таблице 1 дана сводка всех событий, которые возникают при работе с рабочими книгами - объектами Workbook, и которые могут быть обработаны объектом Application.
NewWorkbook(Wb As Workbook) | При создании новой книги. Единственное событие этой группы, которое может обработать только объект Application. | Обработчику события передается объект Wb, представляющий вновь созданную книгу. |
WorkbookActivate(Wb As Workbook) | Книга становится активной. | Вновь активированная книга передается обработчику события в качестве параметра. |
WorkbookAddinInstall(Wb As Workbook) | При установке рабочей книги в качестве AddIn. | Рабочая книга, представляющая AddIn. |
WorkbookAddinUninstall(Wb As Workbook) | Отменяется установка рабочей книги в качестве AddIn. Закрытие книги при этом не происходит. | Рабочая книга, представляющая AddIn. |
WorkbookBeforeClose(Wb As Workbook, Cancel As Boolean) | При попытке закрыть рабочую книгу, но до того, как она будет закрыта. | Параметр Wb задает закрываемую книгу. Параметр Cancel позволяет отменить закрытие, если в обработчике события его значение будет установлено как True. |
WorkbookBeforePrint(Wb As Workbook, Cancel As Boolean) | При попытке распечатать содержимое рабочей книги, но до того, как произойдет печать. | Параметр Wb задает печатаемую книгу. Параметр Cancel позволяет отменить печать, если в обработчике события его значение будет установлено как True. |
WorkbookBeforeSave(Wb As Workbook, SaveAsUI As Boolean, Cancel As Boolean) | При попытке сохранить содержимое рабочей книги, но до того, как произойдет сохранение. | Параметр Wb задает сохраняемую книгу. Параметр Cancel позволяет отменить сохранение, если в обработчике события его значение будет установлено как True. Параметр SaveAsUI показывает, как идет сохранение, его значение равно true, если при сохранении открывается диалоговое окно "Сохранить как ". |
WorkbookDeactivate(Wb As Workbook) | Книга перестает быть активной, поскольку активной становится другая книга. | Деактивированная книга передается обработчику события в качестве параметра. |
WorkbookNewSheet(Wb As Workbook, Sh As Object) | При добавлении новой страницы в рабочую книгу. | Объект Wb задает книгу, а Sh - страницу, добавленную в эту книгу. |
WorkbookOpen(Wb As Workbook) | При открытии уже существующей рабочей книги. | Обработчику события передается объект Wb, представляющий вновь открытую книгу. |
Практически все события, происходящие с объектом Workbook, могут быть обработаны на двух уровнях - объектом Application и самим объектом Workbook. Разница лишь состоит в том, что если у объекта Application есть, например, событие WorkbookOpen, то у объекта Workbook есть событие Open. При возникновении данного события операционная система посылает соответствующее сообщение двум объектам - Application и Workbook. Обработчику сообщения WorkbookOpen передается параметр Wb, задающий открываемую книгу. Понятно, что при посылке аналогичного сообщения объекту Workbook передавать этот параметр не имеет смысла, поскольку он и так знает сам себя, так что обработчик события Open объекта Workbook параметров не имеет.
Возникает естественный вопрос, в каких случаях следует вести обработку события, происходящего с объектом Workbook, на уровне объекта Application. Ответ понятен - в тех случаях, когда обработчик события выполняет действия, общие для всех рабочих книг. В тех же случаях, когда предполагается специфическая обработка события, характерная только для данной конкретной книги, обработчик события связывается с объектом Workbook. Что происходит, если обработка одного и того же события предусмотрена на двух уровнях? В этом случае вначале выполнится обработчик события, связанный с объектом Workbook, - он выполнит специфическую для данной книги обработку, а потом начнет работать обработчик этого же события, связанный с объектом Application, выполняющий ту часть работы, которая является общей для всех рабочих книг.
Приведу пример, в котором предусмотрена общая для всех рабочих книг обработка события BeforeSave:
Private Sub ExApp_WorkbookBeforeSave(ByVal Wb As Workbook, _ ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim YesNo As Variant YesNo = MsgBox("Вы действительно хотите сохранить этот документ?", vbYesNo) If YesNo = vbNo Then Cancel = True End Sub
Предупреждающее сообщение будет появляться для всех рабочих книг. Рассмотрим теперь пример, когда обработка события BeforePrint предусмотрена на двух уровнях:
Private Sub Workbook_BeforePrint(Cancel As Boolean) 'Обработка события - печать содержимого книги. MsgBox ("Эту книгу - " & ThisWorkbook.Name _ & " печатать запрещено!") Cancel = True End Sub
Private Sub ExApp_WorkbookBeforePrint( ByVal Wb As Workbook, Cancel As Boolean) 'Обработка события - печать содержимого книги. If Wb.ActiveSheet.Name = "Лист1" Then MsgBox ("Эту страницу книги - " & Wb.Name _ & " печатать запрещено!") Cancel = True End If End Sub
Специальный обработчик события объекта Workbook книги BookOne запрещает печать только этой книги, а общий для всех книг обработчик того же события, но находящийся в объекте Application, запрещает печать только первого листа, но для всех рабочих книг. Вот как выглядит сообщение, выданное для книги BookOne общим обработчиком при попытке распечатать содержимое первого листа книги:
увеличить изображение
Рис. 3.3. Сообщение, выданное обработчиком события WorkbookBeforePrint