Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

610

Часть V. Профессиональные методы программирования

С о в е т

Событие B e fo r e P r in t также возникает перед предварительным просмотром рабочей книги.

События уровня объекта Workbook

События объекта Workbook происходят в пределах определенной рабочей книги. В табл. 19.1 перечислены события рабочей книги, а также приведено краткое описание каждого из них. Процедуры обработки событий объекта Workbook хранятся в модуле кода объекта ThisW orkbook (ЭтаКнига).

Таблица 19 .1 . Собы тия объекта w orkbook

Событие

Действие, приводящее к возникновению события

A c tiv a te

Активизация рабочей книги

A d d in ln s ta ll

Установка рабочей книги в качестве надстройки

A d d in U n in s ta ll

Удаление рабочей книги, используемой в качестве надстройки

A f t e r Save

Сохранение рабочей книги

B efo reC lo se

Закрытие рабочей книги

B e fo re P rin t

Вывод на печать либо предварительный просмотр рабочей

 

книги (вместе со всеми объектами)

B eforeS ave

Сохранение рабочей книги

D e a c tiv a te

Деактивизация рабочей книги

NewChart

Создание диаграммы

NewSheet

Создание нового листа в рабочей книге

Open

Открытие рабочей книги

S h e e tA c tiv a te

Активизация любого листа

S h e e tB e fo re D o u b le C lic k

Двойной щелчок на любом рабочем листе (это событие проис­

 

ходит до принятого по умолчанию двойного щелчка)

S h e e tB e fo re R ig h tC lic k

Щелчок правой кнопкой мыши на любом листе (это событие

 

происходит до принятого по умолчанию щелчка правой кноп­

 

кой мыши)

S h e e tC a lc u la te

Вычисление (или повторное вычисление) значений в любом

 

рабочем листе

SheetChange

Изменение любого листа пользователем или внешней ссылкой

S h e e tD e a c tiv a te

Деактивизация любого листа

S h e e tF o llo w H y p e rlin k

Щелчок на гиперссылке в листе

S h e e tP iv o tT a b le U p d a te

Пополнение сводной таблицы новыми данными

S h ee tS electio n C h a n g e

Изменение выделения на любом листе

W in d ow A ctivate

Активизация любого окна рабочей книги

W in d ow D eactivate

Деактивизация любого окна рабочей книги

W indowResize

Изменение размера любого окна рабочей книги

П ерекрестная ссы лка

Если нужно проследить за событиями, возникающими для всех рабочих книг, придется работать на уровне объекта A p p lic a tio n (см. раздел “События объекта A p p lic a t io n ”). Далее представлены примеры использования собы-

Глава 19. Концепция событий Excel

611

тий объекта W orkbook. Все примеры процедур, представленных ниже, следу­ ет размещать в модуле кода объекта Э таКнига (ThisWorkbook). Если же раз­ местить их в модуле кода другого типа, они не будут работать.

Событие Open

Одним из наиболее часто используемых является событие Open объекта WorkBook. Оно возникает при открытии рабочей книги (или надстройки). При этом выполняется процедура Workbook_Open. Эта процедура может выполнять любые действия, но чаще всего она используется для решения следующих задач:

отображение приветственных сообщений;

открытие других рабочих книг;

настройка контекстных меню;

активизация определенного листа или ячейки;

проверка определенных условий (например, рабочая книга может требовать нали­ чия определенной надстройки);

установка определенных автоматических средств (например, можно определять комбинации клавиш; см. раздел “Событие ОпКеу”);

настройка свойства Sc го 11A rea рабочего листа (которое не хранится в рабочей книге);

• настройка защиты U s e rIn te rfa c e O n ly для рабочего листа, что позволяет управлять защищенными листами в коде (этот параметр является аргументом ме­ тода P r o te c t и не хранится в пределах рабочей книги).

П р и м еч ан и е

Если пользователь удерживает нажатой клавишу <Shift> при открытии рабо­ чей книги, процедура рабочей книги w orkbook Open не вызывается. Естест­ венно, процедура также не вызывается, если открыта рабочая книга с от­ ключенными макросами.

Ниже приводится простой пример процедуры Workbook_Open. Эта процедура ис­ пользует функцию Weekday для определения дня недели. Если текущий день недели — пятница, то отображается окно сообщения, которое напоминает пользователю о необхо­ димости проведения еженедельного резервного копирования файлов. Если текущий день недели — не пятница, то ничего не происходит.

P riv ate Sub

W orkbook_Open ()

 

I f W eekday(Now)

= v b F rid a y

Then

Msg =

"Сегодня п ятн и ц а .

Ты уже создал"

Msg = Msg & "новую резервную копию !"

MsgBox

Msg,

v b ln fo r m a tio n

End I f

 

 

 

End Sub

 

 

 

Событие Activate

Следующая процедура выполняется при каждой активизации рабочей книги. Эта процедура разворачивает активное окно.

612

Часть V. Профессиональные методы программирования

P r iv a t e

Sub W o rk b o o k _ A c tiv a te ()

A c tiv e W in d o w . W in d ow S tate = x lM a x im iz e d

End Sub

Событие SheetActivate

Представленная далее процедура выполняется каждый раз, когда пользователь акти­ визирует один из листов рабочей книги. Если этот лист является рабочим, то выделяется ячейка А1. Если он не является рабочим листом, то ничего не происходит. Данная про­ цедура использует функцию VBA TypeName для того, чтобы удостовериться, что ак­ тивный лист является рабочим листом (не представлен листом диаграммы).

P r iv a t e Sub W o rk b o o k _ S h e e tA c tiv a te (B y V a l Sh As O b je c t) I f TypeNam e(Sh) = "W orksheet" Then _

R a n g e ( " A l" ) . S e le c t End Sub

Существует и другой метод избежать ошибки при выделении ячейки на листе диа­ граммы — просто игнорируйте такую ошибку.

P r iv a t e Sub

W o rk b o o k _ S h e e tA c tiv a te (B y V a l Sh As O b je c t)

On E r r o r

Resume N e x t

R a n g e (" A l " ) . S e le c t

End Sub

Событие NewSheet

Рассматриваемая процедура выполняется каждый раз, когда к рабочей книге добавля­ ется лист. В этом случае лист передается в процедуру в качестве аргумента. Поскольку новый лист может выступать как рабочим листом, так и листом диаграммы, эта процеду­ ра обязательно определяет тип листа. Если вставляется рабочий лист, то код создает за­ пись о дате и времени добавления листа в ячейку А1.

P r iv a t e Sub W orkbook_ N ew S heet(B yV al Sh

As O b je c t)

I f

TypeNam e(Sh) =

"W orksheet" Then

 

 

Sh. C e l l s . C olum nW idth =

3 5

 

 

S h .R a n g e ( " A l" )

= "Лист

добавлен

" & Now()

End

I f

 

 

 

End Sub

Событие Be£oreSave

Событие B eforeSave возникает перед фактическим сохранением рабочей юшги. Как известно, использование команды Файхт^Сохранить (File^Save) приводит к появлению диалогового окна Сохранение документа (Save As). Это происходит в том случае, если рабочая книга еще ни разу не сохранялась и не открывалась в режиме “только чтение”.

При выполнении процедуры Workbook_Be f o re Save ей передается аргумент (SaveAsUI), который позволяет предвосхитить появление диалогового окна Сохране­ ние документа. Следующий пример демонстрирует использование этого события.

P r iv a t e Sub

W orkb oo k _ B efo reS ave

_

 

(B yV al SaveA sU I As B o o le a n ,

C a n c el As

B o o le an )

I f

S aveA sU I Then

 

 

 

 

 

MsgBox

"Убедитесь

в

том,

что э то т

файл будет _

End

I f

сохранен

на

диске J . "

 

 

 

 

 

 

End Sub

 

 

 

 

 

Глава 19. Концепция событий Excel

613

Когда пользователь сохраняет рабочую книгу, выполняется процедура Workbook_ Befo re Save. Если операция сохранения приводит к появлению диалогового окна Со­ хранение документа, то переменной SaveAsUI присваивается значение True. Проце­ дура проверяет переменную SaveAsUI, в результате чего сообщение отображается лишь в том случае, если на экране появляется окно сохранения документа. В случае при­ своения процедурой аргументу C ancel значения True файл сохранен не будет.

Событие Deactivate

Предлагаемый пример демонстрирует использование события D e a c tiv a te . Эта процедура выполняется каждый раз при деактивизации (отмене выбора) рабочей книги. Она не позволяет пользователю деактивизировать рабочую книгу. При возникновении события D e a c tiv a te код выполняет повторную активизацию рабочей книги и выводит наэкран соответствующее сообщение.

P rivate Sub W o rk b o o k _ D e a c tiv a te ()

M e .A c tiv a te

MsgBox "Мне жаль, но вы не п оки нете э ту к н и г у .. . "

End Sub

П р и м е ч а н и е

Пользоваться подобными процедурами, которые “берут на себя” функции Excel, не рекомендуется. Это может привести пользователя в замешатель­ ство. Пользователи должны уметь правильно работать с приложением.

Приведенный пример иллюстрирует важность обработки событий в необходимой по­ следовательности. Запустив эту процедуру, вы убедитесь, что она работает правильно только в тех случаях, когда пользователь активизирует другую рабочую книгу. Событие D eactivate для рабочей книги возникает и в ряде других случаев:

при закрытии рабочей книги;

при открытии новой рабочей книги;

при сворачивании окна рабочей книги.

Таким образом, данная процедура не будет работать точно так, как задумывалось из­ начально. Она будет предотвращать попытки пользователя непосредственно активизиро­ вать другую рабочую книгу, но не сможет препятствовать закрытию рабочей книги, от­ крытию новой рабочей книги или сворачиванию окна рабочей книги. Окно сообщения будетотображаться, но действия все же будут возможны.

Событие BeforePrint

Событие B e fo re P rin t происходит, когда пользователь запрашивает печать или предварительный просмотр печати, но фактической печати или предварительного про­ смотра не происходит. Событие использует аргумент C ancel, поэтому использующий это событие код может отменять печать или предварительный просмотр документа пу­ тем присвоения переменной C ancel значения True. К сожалению, определить, вызвано событие B e fo re P rin t запросом на печать или запросом на предварительный про­ смотр, невозможно.

614 Часть V. Профессиональные методы программирования

О бновление верхнего или нижнего колонтитула

Несмотря на то что параметры верхних и нижних колонтитулов Excel настраиваются в широких пределах, не существует способа печатать содержимое указанной ячейки верхнего или нижнего колонтитула непосредственно из Excel. С помощью события W orkbook _ B eforeP rint можно отобразить содержимое текущей ячейки верхнего либо нижнего колонтитула в процессе печати рабочей книги. Приведенный ниже код об­ новляет левые нижние колонтитулы страниц при печати либо предварительном просмот­ ре рабочей книги, а именно — вставляет содержимое ячейки А1 на лист Лист1.

P r iv a t e

Sub

W o rk b o o k _ B e fo re P rin t(C a n c e l As B o o le an )

Dim

s h t

As O b je c t

F o r

Each

s h t In T h is W o rk b o o k . S h ee ts

s h t . P a g e S e tu p . L e f t F o o t e r = _

 

W o rk s h e e ts (" Л и с т1 " ) . R a n g e (" A l ")

N e x t

s h t

 

End Sub

 

 

Эта процедура циклически обходит каждый лист в рабочей книге, а также устанавливает свойство L e ftF o o te r объекта PageSetup равным значению в ячейке А1 на листе Лист1.

Сокры ти е столбцов п ер ед печатью

Вследующем примере используется процедура Workbook_Be fo re P r in t для со­ крытия столбцов B:D на листе Лист1 перед печатью или предварительным просмотром.

P r iv a t e Sub

W o rk b o o k _ B e fo re P rin t(C a n c e l

As B o o le an )

1

Сокрытие

столбцов B:D на листе Лист1

перед печатью

 

W o rk s h e e ts ( "Л и ст1" ) . R a n g e ( "В :D " ) . E n tire C o lu m n . H id d e n = T ru e

End

Sub

 

 

В идеальном случае следует отобразить скрытые ранее столбцы после завершения печати. Было бы неплохо, если бы в Excel существовало событие A f te r P r in t, выпол­ няющее подобную операцию, но увы... об этом можно только мечтать. Не расстраивай­ тесь раньше времени: способ автоматического отображения ранее скрытых столбцов все же существует. Приведенная ниже процедура использует событие OnTime, с помощью которого вызывает процедуру UnhideColum ns через пять секунд после завершения печати или предварительного просмотра.

P r iv a t e Sub

W o rk b o o k _ B e fo re P rin t(C a n c e l

As B o o le an )

'

Скрывает

столбцы B:D на ли сте Лист1

перед печатью

 

W o rk s h e e ts (" Л и с т 1 " ) .R a n g e (" В :D " ).E n tir e C o lu m n .H id d e n = T ru e

 

A p p lic a tio n .O n T im e Now + T im e V a lu e ( " 0 :0 0 :0 5 " ) , "U nhideC olum ns"

End

Sub

 

 

Процедура UnhideColumns находится в стандартном модуле VBA.

Sub

U n h id eC o lu m n s()

 

W o rk s h e e ts (" Л и с т 1 " ) .R a n g e (" В :D " ).E n tir e C o lu m n .H id d e n = F a ls e

End

Sub

К ом пакт-диск

Этот пример находится на прилагаемом к книге компакт-диске в файле hide

colum ns b e fo re p r in t in g .x ls m .

aft-

П ерекрестная ссы лка

©Для получения дополнительных сведений о событиях OnTime обратитесь к разделу “Событие OnTim e”.

616

 

Часть V. Профессиональные методы программирования

Case

vbYes

 

M e. Save

Case

vb C a n c el

 

C a n c el = T ru e

 

E x it Sub

End

S e le c t

End

I f

 

C a ll

D e le te S h o rtc u tM e n u Ite m s

M e . Saved = T ru e

End Sub

Данная процедура проверяет значение свойства Saved объекта Workbook с целью определить наличие в рабочей книге несохраненных данных. Если они существуют, то выполняется процедура D eleteS h o rtcu tM en u Item s, и рабочая книга закрывается. Однако в рабочей книге могут оставаться несохраненные данные. Тогда процедура ото­ бражает окно сообщения, которое дублирует исходное окно сообщения Excel. В этом ок­ не находятся следующие три кнопки.

Да. Рабочая книга сохраняется, элемент меню удаляется, а рабочая книга закрывается.

Нет. Этот код присваивает свойству Saved объекта Workbook значение True (при

этом файл фактически не сохраняется), удаляет элемент меню и закрывает файл.

• Отмена. Событие Be f o r e c lo s e отменяется, и процедура завершается без уда­ ления элементов контекстного меню.

Ком пакт-диск

Рабочая книга, содержащая этот пример, находится на прилагаемом ком-

пакт-диске в файле w o rkb o o k _ b e f o re c lo s e w o rk a ro u n d . xlsm .

События объекта W orksheet

События объекта W orksheet — наиболее полезные и часто используемые. Контроль над ними может заставить приложение выполнять функции, которые в другой ситуации считались бы невозможными.

В табл. 19.2 перечислены события рабочего листа, сопровождаемые краткими описа­ ниями.

Таблица 19 .2 . Собы тия объекта w o rk sh e e t

Событие

Ac tiv a te

Be fo re D o u b le C lic k

Be fo re R ig h tC lic k C a lc u la te

Change

D e a c tiv a te

F o llo w H y p e rlin k P iv o tT a b le U p d a te S electio n C h an g e

Действие, приводящее к возникновению события

Активизация рабочего листа Двойной щелчок на рабочем листе

Щелчок правой кнопкой мыши на рабочем листе Вычисление (или повторное вычисление) значений рабочего листа

Изменение пользователем или внешней ссылкой значения ячейки рабочего листа

Деактивизация рабочего листа Щелчок на гиперссылке в рабочем листе

Обновление сводной таблицы на рабочем листе Изменение либо обновление выделенной области на рабочем листе