Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Sub ToggleGridlines()

If TypeName(ActiveSheet) = "Worksheet" Then

ActiveWindow.DisplayGridlines = _

Not ActiveWindow.DisplayGridlines

Call CheckGridlines

End If

End Sub

Эта процедура просто переключает состояние линий сетки в активном листе. Конструкция I f - T h e n используется для того, чтобы проверить принадлежность активного листа к рабочим листам.

Простой способ создания пользовательских меню

Когда появилась программа Excel 97, многих удивило то количество кода, которое необходимо было писать для создания пользовательских меню. В результате мне пришлось разработать собственную методику, которая упрощает этот процесс. Данная методика требует использования рабочего листа, который показан на рис. 23.6. Этот лист необходим для хранения информации о новом меню. Процедура VBA считывает данные из рабочего листа и создает меню, опции меню и опции подменю.

Puc. 23.6. Информация этого рабочего листа используетсядлясозданияменю

Рабочий лист состоит из таблицы, которая имеет пять столбцов.

Уровень. Это расположение определенной опции в иерархии системы меню. Допустимыми значениями данного столбца выступают целые числа 1, 2 и 3. Уровень 1 соответствует меню. Уровень 2 описывает опции меню. Уровень 3 предназначен для доступа к опциям подменю. Обычно создается один элемент первого уровня, а для него — несколько элементов второго уровня. Опции второго уровня могут иметь, а могут и не иметь элементы третьего уровня (опции подменю).

Подпись. Этот текст отображается в качестве подписи меню, опции меню или подменю. Чтобы подчеркнуть один из символов в названии, необходимо перед ним ввести символ амперсанта (&).

Позиция/Макрос. Для элементов первого уровня это значение должно представляться целым числом, которое обозначает расположение элемента в строке меню. Для

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

609

элементов второго и третьего уровня это название макроса, который будет выполняться при выборе данной опции меню. Если элемент второго уровня имеет один или несколько элементов третьего уровня, то с элементом второго уровня макрос связать нельзя.

Разделитель. Введите ИСТИНА, если перед опцией меню или подменю должна располагаться разделительная полоса.

FacelD. Этот необязательный параметр содержит код, который представляет встроенное графическое изображение, отображаемое возле опции меню.

На рис. 23.7 показано меню, которое создано с помощью данных, сохраненных на рабочем листе.

Рис.23.7.Меню,созданноенаосноведанных,которыехранилисьнарабочемлисте

Рабочая книга, демонстрирующая эту методику, доступна на Web-узле издательства. Эта рабочая книга содержит процедуру VBA, которая считывает данные с рабочего листа и создает меню. Для того чтобы использовать эту методику в собственной рабочей книге или в надстройке, необходимо следовать инструкциям, приведенным ниже.

1.Откройте пример рабочей книги, который находится на Web-узле.

2.Скопируйте весь код из модуля Modulel в модуль собственного проекта.

3.Добавьте процедуры, которые приведены ниже, к модулю кода объекта ЭтаКнига.

P r i v a t e

Sub Workbook_Open(}

 

Call CreateMenu

End

Sub

 

Private

Sub Workbook_BeforeClose(Cancel As Boolean)

 

Call DeleteMenu

End

Sub

 

4.Вставьте новый рабочий лист и назовите его ЛистМеню. Еще более удачным вариантом будет копирование рабочего листа ЛистМеню из примера рабочей книги.

5.Внесите изменения в рабочий лист ЛистМеню, чтобы он соответствовал пользовательскому меню.

Впримере рабочей книги не реализована обработка сообщений об ошибках, поэтому на разработчика возлагается задача проверки правильности создания меню.

610

Глава 23. Создание пользовательских меню

Замена строки меню листа

В некоторых случаях может возникнуть необходимость скрыть строку меню листа Excel и заменить ее полностью новой строкой меню.

Процедура MakeMenuBar из листинга 23.6 создает новую строку меню, которая называется Коя с т р о к а меню. Эта строка состоит из двух меню. Первое меню повторяет стандартное меню Файл (оно скопировано со строки меню листа). Второе меню содержит две опции: Восстановить обычное меню и Справка (?).

Листинг23.6. Замена встроенного менюExcel

Sub MakeMenuBar(}

Dim NewMenuBar As CommandBar

Dim NewMenu As СommandBarControl

Dim Newltem As CommandBarControl

1Удаление строки меню, если она существует Call DeleteMenuBar

'Добавление строки меню

Set NewMenuBar = CoimandBars . AddfMenuBar: =True)

With NewMenuBar

.Name = "Моя строка меню"

.Visible = True"

End With

1Копирование меню File (ID=30002) со строки меню листа CommandBars<"Worksheet Menu Bar").FindControl(ID:=30002).Copy _

Bar:=CommandBars("Моя строка меню")

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

Set NewMenu = NewMenuBar.Controls.Add _

(Type:=msoControlPopup)

NewKenu.Caption = "^Команды"

'Добавление новой опции меню

Set Newltem

=

NewMenu.Controls.Add(Type:=msoControlButton)

 

With Newltem

 

 

 

 

.Caption = "&Босстановить обычную строку меню"

 

.OnAction =

"DeleteMenuBar"

 

End With

 

 

 

 

Добавление новой

опции меню

 

Set Newltem

=

NewMenu.Controls.Add(Type:=msoControlButton)

 

With Newltem

 

 

 

 

.Caption

=

"^Справка"

 

.OnAction

=

"ShowHelp"

 

End With

 

 

 

 

End Sub

 

 

 

 

На рис. 23.8 показана новая строка меню.

 

Обратите внимание, что в этой процедуре отсутствует код, который скрывает строку ме-

 

ню листа. Оператор S e t NewMenuBar = CommandBars.Add(MenuBar:=True) добавляет

 

новую командную панель. Когда свойство V i s i b l e этой командной панели устанавливается

 

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

611

в значение True, она заменяет собой строку меню рабочего листа. 6 определенный момент времени может быть активной только одна строка меню.

Стандартная панель инструментов {как отмечалось в главе 22} имеет свойство туре, по умолчанию установленное в значение nisoBarTypeWormai. Строка меню, которая создавалась в предыдущем примере, имеет свойство туре, установленное В значение msoBarTypeMenuBar.

Удаление пользовательской строки меню приводит к отображению строки меню листа и делает эту строку активной. Следующая процедура (DeleteMenuBar) возвращает строку меню в исходное состояние.

Sub DeleteMenuBar()

On Error Resume Next

CommandBars("Моя строка меню"}.Delete On Error GoTo 0

End Sub

Следующий код предназначен для нахождения элемента управления Файл командной панели с помощью метода F i n d C o n t r o l . Это меню копируется из строки меню листа на новую строку меню с помощью метода Сору.

CommandBars("Worksheet Menu Bar").FindControl(ID:=30002).Copy

Когда выполняется этот оператор, меню Файл {вместе со всеми опциями и подменю) отображается в новой строке меню. Следует отметить, что опции меню Файл и его подменю не являются точными копиями оригиналов в строке меню листа. Например, измените свойство C a p t i o n опции Создать в строке MyMenuBar (замените название с New (Создать} на New Workbook (Создать рабочую книгу)). Это приведет также к изменению опции Создать в строке меню листа. В результате после восстановления строки меню листа в меню Файл будет отображена опция с измененным названием.

Рис.23.8.Созданнаястрокименюзаменяетстандартнуюстрокуменюлисте

Работа с контекстными меню

Контекстное меню является всплывающим меню, которое отображается при щелчке правой кнопкой мыши на практически каждом объекте в Excel. Диалоговое окно Excel Настройка не предоставляет возможностей по редактированию или удалению контекстных меню. Единственным способом внесения модификаций в контекстные меню является использование VBA.

Excel 2002 имеет 59 контекстных меню (на семь больше, чем в Excel 2000). Контекстное меню представлено командной панелью, свойство Туре которой установлено в значение msoBa rType Popup. Для того чтобы управлять контекстным меню, необходимо знать значение

612

Глава23. Созданиепользовательскихменю

его свойства I n d e x или Name. Представленную ниже процедуру можно использовать для создания списка всех контекстных меню. Этот список отображает информацию о каждом контекстном меню на рабочем листе. При этом в столбцах представлена информация о значениях свойств Index, Name меню, а также список всех опций этого меню.

Sub LisCShortCutMenus()

Dim Row As Long, Col As Integer Dim cbar As CommandBar

Cells.Clear Application.ScreenUpdating = False Row = 1

For Each cbar In ConmandBars

If cbar.Type = rnsoBarTypePopup Then Cells(Row, 1) = cbar.Index Cells(Row, 2) = cbar.Name

For Col s i To cbar.Controls.Count Cells(Row, Col + 2) =

cbar.Controls{Col).Caption Next Col

Row = ROW + 1 End If

Next cbar

Cells.EntireColumn.AutoFit End Sub

На рис. 23.9 показан фрагмент результата выполнения этой процедуры. Процедура помогает определить имена различных контекстных меню. Например, кто может догадаться, что контекстное меню, которое отображается при щелчке правой кнопкой мыши на ярлыке рабочего листа, называется Plv?

^wc. 2.?.9. Список всех контекстных меню, а также список всех опций, которые входят в эти контекстныеменю

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

613

Хотя на контекстное меню можно ссылаться по значению свойства index, этот метод использовать не рекомендуется. По определенным причинам значения свойства index не одинаковы в разных версиях Excel. Вместо этого для создания ссылки на контекстное меню необходимоиспользоватьзначение свойства Name.

Добавление опций в контекстное меню

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

Sub AddltemToShortcutO

Set Newltem = CommandBars("Cell").Controls.Add With Newltem

.Caption = "Перенос слов"

.OnAction = "ToggleWordWrap"

.BeginGroup = True End With

End Sub

Выбор новой опции меню приводит к вызову процедуры ToggleWordWrap. На рис. 23.10 показано обновленное контекстное меню.

Рис. 23.10. Это контекстное меню содержитновуюопцию

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

Sub AddltemToShortcutO

Set Newltem = CommandBara("Document").Controls.Add(ID:=865} Newltem.Caption = "Скрыть окно"

End Sub

Выбор этой опции контекстного меню эквивалентен выбору команды Окно=>Скрыть. Указанная команда имеет свойство ID, установленное в значение 865, что выясняется после выполнения следующего оператора:

MsgBcx CommandBars("Worksheet Menu Bar") _

.Controls{"Окно").Controls("Скрыть").ID

614

Глава 23. Создание пользовательских меню

Удаление опций из контекстного меню

Представленная ниже процедура использует метол D e l e t e для удаления опции, добавленной с помощью процедуры предыдущего раздела.

Sub RemovelcemFromShortcut{}

On Error Resume Next CommandBars("Cell").Controls("Перенос слов").Delete

End Sub

Оператор On E r r o r Resume Next приводит к игнорированию сообщения об ошибке, которое генерируется в том случае, если опции меню не существует.

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

Sub RemoveHideMenuItemsО

CommandBars("Column").Controls{"Скрыть").Delete CommandBars{"Row"}.Controls("Скрыть").Delete

End Sub

Отключение опций контекстного меню

В качестве альтернативы удалению опций меню можно предложить отключить одну или несколько опции контекстного меню, пока приложение выполняет свою задачу. Когда опция меню отключена, она отображается на экране светло-серым цветом, и щелчок на ней не приводит к выполнению назначенного действия. Приведенная далее процедура отключает опцию Скрыть в контекстных меню Row (Строка) и Column (Столбец).

Sub DisableHideMenuItems() CommandBars("Column").Controls{"Скрыть").Enabled = False CommandBars("Row").Controls("Скрыть").Enabled = False

End Sub

Отключение контекстных меню

Вы также можете отключать целые контекстные меню. Например, при необходимости можно ограничить доступ пользователя к командам, которые обычно отображаются при щелчке правой кнопкой мыши на ячейке. Следующая процедура D i s a b l e C e l l отключает контекстное меню Cell (Ячейка). После выполнения процедуры щелчок на ячейке правой кнопкой мыши не приведет к отображению контекстного меню.

Sub

D i s a b l e C e l l U

 

CommandBars("Cell").Enabled = False

End

Sub

Если необходимо отключить все контекстные меню, воспользуйтесь следующей процедурой.

Sub DisableAllShortcutMenus() Dim cb As CommandBar

For Each cb In CommandBars

If cb.Type = msoBarTypePopup Then _ cb.Enabled = False

Next cb End Sub

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

B1S

После отключения всех контекстных меню полученное состояние интерфейса сохраняется между сеансами работы. Таким образом, необходимо восстановить доступ к контекстным меню перед закрытием Excel. Для этого измените предыдущую процедуру, чтобы она устанавливала свойство Enabled в значение True.

Сброс контекстных меню

Метод R e s e t восстанавливает первоначальное состояние контекстного меню (состояние по умолчанию). Если приложение добавляет опции в контекстное меню, то лучше удалять их по отдельности перел закрытием приложения. В противном слэ'чае следует удалить изменения в меню, которые внесеныдругими приложениями.

СледующаяпроцедуравосстанавливаетконтекстноеменюCell(Ячейка)висходноесостояние.

Sub ResetCellMenuO CommandBars("Cell">.Reset

End Sub

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

Существует возможность создания полностью нового контекстного меню. При выполнении кода листинга 23.7 создается контекстное меню, которое называется MyShortcu t и содержит шесть опций. Для этих опций своИспю OnAction настроено так, что они приводят к запуску простой процедуры, отображающей одну из вкладок диалогового окна Формат ячеек.Например,процедураShowNumberFormatвыглядитследующимобразом.

Листинг 23.7. Создание полностью нового контекстного меню

Sub CreateShortcut()

Dim myBar As CommandBar

Dim myltem As CommandBarControl

Delet©Shortcut

Set myBar = CommandBars.Add _

(Name:="MyShortcut", Position:=msoBarPopup, Temporary:=True}

Set

myltem =

myBar.Controls.Add(Type:=msoControlButton)

With myltem

 

 

.Caption = "^Числовой формат..,"

 

. OnAction = " ShowFormatNurrber"

 

.Paceld =

1554

End With

 

Set

myltem =

myBar.Controls.AddfType:=msoControlButton)

With

myltem

 

 

.Caption = "&Выравнивание..."

 

.OnAction

= "ShowFormatAlignment"

 

.Facelct =

217

End With

 

Set myltem = myBar .Controls .Acld(Type: =msoControlButton)

With myltem

 

 

-Caption = "ЬШрифт..."

 

.OnAction

= "ShowFormatFont"

 

.Paceld =

291

End With

 

616

 

Глава 23. Создание пользовательских меню

Set

myltem =

myBar.Controls.Add(Type:=msoControlButton)

With

myltem

 

 

-Caption = "&Границы..."

 

.OnAction

= "ShowFormatBorder"

 

.Faceld =

149

 

.BeginGroup = True

End With

 

Set

myltem =

myBar.Controls.Add(Type:=msoControlButton)

With myltem

 

 

.Caption = "&Узор..."

 

.OnAction

= "ShowFormatPatterns"

 

.Faceld -

1550

End With

 

Set

myltem =

myBar.Controls.Add(Type:=msoControlButton)

With myltem

 

 

.Caption = "&3ащита..."

 

.OnAction

= "ShowFormatProtection"

 

.Faceld =

2654

End With

 

End Sub

На рис. 23.11 показано созданное кодом контекстное меню.

Рис. 23.]I. Это контекстное меню создано с помощьюкода VBA

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

Private Sub Worksheet_BeforeRightClick(ByVal Target _ As Excel.Range, Cancel As Boolean)

If Union(Target.Range{"Al"}, Range("data"))-Address = _ Range("data").Address Then

CommandBars{"MyShortcut").ShowPopup Cancel = True

End If End Sub

Если ячейка, на которой пользователь щелкнул правой кнопкой мыши, находится в пределах именованного диапазона данных, появляется контекстное меню MyShortcut . Установка аргумента C a n c e l в значение True позволяет удостовериться, что обычно контекстное меню не будет отображаться.

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

617

На Web-узле издательства содержится пример создания нового контекстного меню и отображения его вместо обычного контекстного меню Cell (Ячейки).

Резюме

Вэтой главе рассматривались методы создания новых меню, были приведены примеры, которые демонстрируют способы модификации существующих и методы создания новых меню и контекстных меню.

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

618

Глава 23. Создание пользовательских меню

Соседние файлы в папке 2 семестр