![](/user_photo/2706_HbeT2.jpg)
2 семестр / vba_2002
.pdf![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu611x1.jpg)
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 |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu612x1.jpg)
элементов второго и третьего уровня это название макроса, который будет выполняться при выборе данной опции меню. Если элемент второго уровня имеет один или несколько элементов третьего уровня, то с элементом второго уровня макрос связать нельзя.
•Разделитель. Введите ИСТИНА, если перед опцией меню или подменю должна располагаться разделительная полоса.
•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 |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu614x1.jpg)
в значение 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. Созданиепользовательскихменю |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu615x1.jpg)
его свойства 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 |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu616x1.jpg)
Хотя на контекстное меню можно ссылаться по значению свойства 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 |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu618x1.jpg)
После отключения всех контекстных меню полученное состояние интерфейса сохраняется между сеансами работы. Таким образом, необходимо восстановить доступ к контекстным меню перед закрытием 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. Создание пользовательских меню |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu619x1.jpg)
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 |
![](/html/2706/567/html_twYuAfu26A.FaQl/htmlconvd-KN3qbu620x1.jpg)
На Web-узле издательства содержится пример создания нового контекстного меню и отображения его вместо обычного контекстного меню Cell (Ячейки).
Резюме
Вэтой главе рассматривались методы создания новых меню, были приведены примеры, которые демонстрируют способы модификации существующих и методы создания новых меню и контекстных меню.
Вследующей главе также освещаются вопросы разработки приложений, описывается методика составления справочного руководства к приложению.
618 |
Глава 23. Создание пользовательских меню |