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

732

Часть VI. Разработка приложений

Автоматическое добавление и удаление меню

Если нужно изменить контекстное меню, которое появляется в момент открытия ра­ бочей книги, используется событие Workbook_Open. Ниже представлен код, который находится в модуле кода для объекта ThisW orkbook (ЭтаКнига) и вызывает процедуру Modi fy S h o rtc u t (код этой процедуры здесь не показан).

P riv a te

Sub Workbook_Open()

C a ll

M o d ify S h o rtc u t

End Sub

 

Для возврата исходного состояния контекстного меню (до выполнения изменения) воспользуйтесь приведенной ниже процедурой. Эта процедура выполняется перед за­ крытием рабочей книги и вызывает процедуру R e s to re S h o rtc u t (код этой процедуры здесь не приводится).

P riv a te

Sub W orkbook_B eforeC lose(C ancel As Boolean)

C a ll

R e s to re S h o rtc u t

End Sub

 

Если рабочая книга не была сохранена и пользователь пытается закрыть ее, возникает проблема. Программа Excel отображает сообщение “Сохранить изменения?” (“Do you want to save the changes?”) после запуска на выполнение обработчика событий Workbook_Bef o reC lo se . Если щелкнуть на кнопке Отмена (Cancel), рабочая книга оста­ нется открытой, но ваше настраиваемое меню будет безвозвратно утеряно!

Одно из решений этой проблемы заключается в том, чтобы обойти отображение за­ проса Excel, создав собственный код (в составе процедуры W orkbook_B eforeclose), который отображает запрос о сохранении рабочей книги. Этот код показан ниже.

P riv a te

Sub W orkbook_B eforeC lose(C ancel As Boolean)

I f Not

Me.Saved Then

Msg = "Хотите сохранить изменения в "

Msg

= Msg & Me.Name & "? "

Ans

= MsgBox(Msg/ vb Q u e stio n + vbYesNoCancel)

S e le c t

Case Ans

Case

vbYes

 

Me. Save

Case

vbNo

 

Me. Saved = True

Case

vbCancel

 

Cancel = True

 

E x it Sub

End

S e le c t

End

I f

 

C a ll

R e s to re S h o rtc u t

End Sub

 

 

Эта процедура определяет, была ли сохранена рабочая книга. Если рабочая книга бы­ ла сохранена, проблем не возникает. Вызывается процедура R e s to re S h o rtc u t, и ра­ бочая книга закрывается. Но если рабочая книга не сохранялась, отображается окно со­ общения, которое дублирует одно из окон, обычно отображаемых Excel. Как только пользователь щелкнет на кнопке Да (Yes), рабочая книга сохраняется, меню удаляется и рабочая книга закрывается. Если щелкнуть на кнопке Нет (No), свойству Saved объекта Workbook присваивается значение True (файл фактически не сохраняется), а меню удаляется. Если щелкнуть на кнопке Отмена (Cancel), событие Bef o reC lo se отменя­ ется, а процедура завершает свою работу без восстановления контекстного меню.

Глава 23. Работа с контекстными меню

733

Отключение или сокрытие элементов

контекстного меню

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

Например, следующий код отключает элемент контекстного меню Изменить ре­ гистр (Change Case). Этот элемент добавляется в контекстное меню ячейки при активи­ зации листа Лист2. Соответствующая процедура находится в модуле кода листа Лист2.

P riva te Sub W o rk s h e e t_ A c tiv a te ()

 

CommandBars( " C e ll" ) . C o n tr o ls (

_

"И зменить р е г и с т р " ) . Enabled

= F alse

End Sub

 

Для активизации элемента меню при выделении листа Лист2 добавьте следующую процедуру. В результате применения этой процедуры элемент меню Изменить регистр (Change Case) будет доступен все время, за исключением активизации листа Лист2.

P riva te Sub W o rk s h e e t_ D e a c tiv a te ()

CommandBars( " C e ll" ) . C o n tr o ls (

_

"Изменить р е г и с т р " ) . Enabled

= True

End Sub

 

Чтобы скрыть элемент меню, используйте свойство V i s i b l e (вместо свойства

Enabled).

Создание нового контекстного меню

Можно создать полностью новое контекстное меню, которое будет отображаться в ответ на определенное событие. Представленный ниже код создает контекстное меню M yS h o rtcu t, которое включает шесть опций. Элементы этого меню обладают собст­ венными свойствами O n A c tio n , значения которых настроены таким образом, что вы­ зывается простая процедура, отображающая одну из вкладок диалогового окна Формат ячеек (Format Cells), как показано на рис. 23.6.

Sub C re a te S h o rtc u t()

Set myBar = CommandBars.Add _

(Name:= "M y S h o rtc u t", P o s itio n : =msoBarPopup, _ T em porary: =T rue)

'Добавление элемента меню

Set

m yltem

=

m yBar. C o n tro ls .A d d (T y p e : = m soC ontrolB utton)

W ith

m yltem

 

 

 

.C a p tio n

 

=

"&Числовой ф о р м а т ..."

.O n A ctio n

=

"ShowFormatNumber"

.F a c e ld

=

1554

End

W ith

 

 

 

'Добавление элемента меню

Set

m yltem

= m yBar. C o n tro ls .A d d (T y p e : = m soC ontrolB utton)

W ith

m yltem

 

.C a p tio n

= " бсВыравнивание . . . "

кГлава 23. Работа с контекстными меню

735

После завершения создания контекстного меню можно его отобразить с помощью метода ShowPopup. Следующая процедура, находящаяся в модуле кода для объекта

W o rksh e e t

(Л ист), вызывается после щелчка на ячейке правой кнопкой мыши.

P riv a te Sub

W o rk s h e e t_ B e fo re R ig h tC lic k

_

(ByVal T a rg e t As E xcel.R ange,

Cancel

As Boolean)

I f

U n io n (T a rg e t. Range( " A l" ),

Range( " d a ta " ) ) .A ddress = _

 

Range( " d a ta " ) .A ddress Then

 

 

 

CommandBars( "M y S h o rtc u t" ) . ShowPopup

 

Cancel = True

 

 

End

I f

 

 

 

End Sub

 

 

 

Если активная ячейка находится в диапазоне d a ta и пользователь щелкает правой кнопкой мыши, отображается меню M y S h o rtc u t. Если аргументу C a n c e l присваива­ ется значение T ru e , стандартное контекстное меню не отображается. Обратите внима­ ние: мини-панель также не отображается.

Это контекстное меню можно также отобразить без помощи мыши. Создайте про­ стую процедуру, а затем назначьте клавиши быстрого доступа с помощью поля Сочета­ ние клавиш, которое находится в диалоговом окне Макрос (Macro).

Sub ShowM yShortcutM enu()

Сочетание

клавиш < C trl+ S h ift+ M >

 

CommandBars( "M y S h o rtc u t") . ShowPopup

End

Sub

 

 

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

 

На прилагаемом к книге компакт-диске находится пример (c o n te x t- s e n s i­

 

t iv e

s h o rtc u t menu.xlsm), в котором создается новое контекстное ме­

ню, отображаемое вместо стандартного контекстного меню ячейки.