
2 семестр / vba_2002
.pdfназваниями каждого из месяцев. Кроме того, определяется свойство OnAction, которое приводит к вызову (в момент щелчка на кнопке) процедуры, вставляющей название месяца. Панель инструментов, которая получена в результате ее выполнения, показана на рис. 22. L4.
Листинг 22.4. Добавление выпадающего списка на командную панель
Sub |
MonthListO |
|
|
||
|
Dim |
TBar |
As |
CommandBar |
|
|
Dim NewDD As |
CommandBarControl |
|||
' |
Удаление |
существующей панели инструментов |
|||
|
On Error Resume |
Next |
|||
|
CommandBars("Список месяцев").Delete |
||||
|
On Error GoTo 0 |
|
|||
1 |
Создание |
новой |
панели инструментов |
||
|
Set |
TBar |
= CommandBars.Add |
||
|
With |
TBar |
|
|
|
|
|
.Name |
= |
"Список месяцев" |
|
|
|
.Visible = True |
|||
|
End With |
|
|
|
|
|
Добавление элемента управления DropDown |
||||
|
Set NewDD = CommandBars("Список месяцев").Controls.Add _ |
||||
|
(Type:=msoControlDropdown) |
||||
|
With |
NewDD |
|
|
|
|
|
.Caption |
= |
"DateDD" |
|
|
|
.OnAction = |
"PasteMonth" |
||
|
|
.Style = msoButtonAutomatic |
|||
1 |
|
Заполнение |
элемента управления названиями месяиев |
||
|
|
For i = 1 То 12 |
|||
|
|
.Addltem Format(DateSerial(1, i, 1) , "mmrnrn") |
|||
|
|
Next |
i |
|
|
|
|
-Listlndex = 1 |
|||
|
End With |
|
|
|
|
End Sub |
|
|
|
|
|
Ниже приведена процедура PasteMonth. |
|||||
Sub PasteMonth() |
|
|
|||
|
Вставляет название выделенного месяца в активную ячейку |
||||
|
On Error |
Resume Next |
|||
|
With |
CommandBars("Список месяцев").Controls("DateDD") |
ActiveCell.Value = .List(.Listlndex) End With
End Sub
Данная рабочая книга имеет дополнительную особенность: в ней используется процедура обработки события, которая называется Worksheet_SelectionCh,ange. Эта процедура, которая приводится ниже, выполняется каждый раз, когда пользователь изменяет текущее выделение на рабочем листе. Процедура онределяет, не содержит ли активная ячейка название месяца. Если это так, то устанавливается свойство Listlndex выпадающего списка на панели инструментов.
Private Sub Worksheet_SelectionChange(ByVal |
Target _ |
As Excel.Range) |
|
ЧастьVI.Разработкщрриложений |
589 |
For i = 1 To 12
Set ActCell = Target.RangeV'Al")
If ActCell.Value = Format(DateSerial(1, i, 1), _
"iminm") Then
CommandBars("Список месяцев")-Controls("DateDD") _,
.Listlndex = i
Exit Sub
End If
Next i
End Sub
Резюме
Вэтой главе рассматривались вопросы использования встроенных панелей инструментов Excel и методы внесения изменений в стандартные панели инструментов.
Вследующей главе речь пойдет о двух других типа командных панелей: меню и контекстных меню.
590 |
Глава 22. Создание собственных панелей инструментов |

Создание
пользовательских
меню
Практически каждая программа Windows имеет систему меню, которая служит основным компонентом пользовательского интерфейса программы. Стандарт Windows требует расположения строки меню непосредственно под заголовком окна приложения. Кроме того, некоторые программы предоставляют и другой тип меню: контекстное меню. Обычно щелчок правой кнопкой мыши приводит к отображению контекстного меню, которое содержит часто ис-
пользуемые команды.
Excel использует оба типа меню, что предоставляет разработчикам практически полный контроль над системой меню приложения, включая контекстные меню. Данная глава содержит информацию, необходимую для управления меню в Excel.
Несколько слов о строке меню Excel
Если вы ознакомились с главой 22, то должны знать, что строка меню (как и панель инструментов) является объектом CommandBar, а методы, рассмотренные в главе 22, в равной степени относятся и к строке меню.
Чем отличается строка меню от панели инструментов? Строка меню отображается в верхней части диалогового окна приложения Excel, непосредственно под строкой заголовка. При щелчке на строке меню элемент управления верхнего уровня отображает выпадающий список элементов второго уровня. Строка меню может содержать три кнопки управления окном (Свернуть окно, Восстановить окно и Закрыть окно), которые отображаются только в том случае, когда окно рабочей книги развернуто.
Панели инструментов обычно состоят из графических значков и не содержат командные кнопки. Однако перечисленные

правила не являются обязательными. Если необходимо, можно добавить традиционные кнопки управления с панелей инструментов в обычное меню или добавить опции меню на обычную панель инструментов. Можно даже переместить строку меню со стандартного места и сделать ее плавающей.
Операции с меню Excel
Обычным пользователям Excel вполне хватает стандартных меню. Тот факт, что вы читаете эту книгу, говорит о вашей необычности. Иногда возникает необходимость внести модификации в существующие меню для облегчения выполнения собственной работы. Вы также можете редактировать меню, чтобы облегчить работу тех, кто будет использовать разрабатываемое приложение.
В число изменений, которые вносятся в меню Excel, входят удаление, добавление и изменение элементов. Кроме того, можно временно заменить стандартную строку меню Excel на пользовательскую строку меню. Изменения в меню Excel выполняются двумя способами: вручную и с помощью VBA.
При закрытии Excel сохраняются все изменения, которые внесены в систему меню. Эти изменения отображаются при следующем запуске Excel. Информация об изменениях, внесенных в меню, хранится в файле XLB, который обычно располагается в папке Windows.
Дополнительная информация о файле XLB приводится в главе 22.
В большинстве случаев не возникает необходимости в сохранении изменений, внесенных в меню. Как правило, требуется создать код VBA, который будет на время вносить изменения в меню, пока открыта определенная рабочая книга, после чего {при закрытии книги) система меню восстанавливается. Таким образом, вам потребуется не только код VBA, который будет модифицировать меню при открытии рабочей книги, но также код VBA, который восстанавливает систему меню при закрытии этой рабочей книги.
Терминология
Советуем вам ознакомиться с терминологией, которая используется при управлении меню.
•Командная панель. Объект, который может функционировать в качестве строки меню, контекстного меню или панели инструментов. Представляется объектом CommandBar из библиотеки объектов Microsoft Office.
•Строка меню. Строка опций, которая отображается непосредственно под строкой заголовка приложения. Excel имеет две строки меню: одна отображается, когда активен рабочий лист, а вторая — когда активен лист диаграммы или встроенная диаграмма.
•Меню. Один элемент верхнего уровня в строке меню. Например, обе строки меню Excel имеют меню Файл.
•Опция меню. Элемент, который отображается в выпадающем списке, когда выбирается определенное меню. Например, первая опция меню Файл называется Создать. Опции меню также отображаются в подменю и контекстных меню.
•Разделительная полоса. Горизонтальная линия, которая представлена между двумя пунктами меню. Разделительная полоса используется для группирования близких по смыслу опций меню.
592 |
Глава 23. Создание пользовательских меню |

Подменю. Меню второго уровня, которое находится в определенном меню. Например, меню Правка имеет подменю Очистить.
Опция подменю. Опция меню, которая отображается в списке после выбора подменю. Например, подменю Правка^Очистить содержит следующие опции подменю: Все, Форматы, Содержимое и Примечания.
Контекстное меню. Плавающий список опций меню, который отображается при щелчке правой кнопкой мыши на выделении или объекте. Вид и содержимое контекстного меню зависит от выделенного объекта.
Активная опция. Опция меню, которую можно использовать. Если опция меню неактивна, то ее название имеет серый цвет. Такие опции меню применить нельзя. Установленная. Состояние опции меню, которое обозначает включение или выключение параметра, Установка опции меню отображается специальным флажком, который также может быть сброшен.
Изображение. Небольшой графический значок, который отображается возле некоторых опций меню. В терминах VBA с каждым значком связан код, определяемый оператором FacelD .
Комбинация клавши для опции меню. Комбинация клавиш, которая является альтернативным методом выбора опции меню. Комбинация клавиш для опции показана справа от самого элемента меню. Например, комбинация <Ctrl+S> используется для открытия диалогового окна, которое вызывается по команде Файл^Сохранить.
Удаление элементов меню
Можно удалить любой фрагмент системы меню Excel: меню, опции меню и даже целые панели меню. Например, если требуется запретить конечным пользователям получать доступ к параметрам отображения, то следует удалить меню Вид со строки меню листа. Кроме того, можно удалить одну или несколько опций меню. Если удалить опцию Соэдэть из меню Файл, то пользователи не смогут использовать меню для создания новых рабочих книг. Наконец, можно удалить строку меню Excel и заменить ее на собственную строку меню. Таким образом вы позволите контролировать приложение только с помощью созданного макроса.
Важно помнить, что простое удаление строки меню, меню или опций меню никак не повлияет на альтернативные методы выполнения определенных действий. Особенно, если для них представлены комбинации клавиш, кнопки на панелях инструментов, а также команды контекстного меню, которые выполняют те же действия, что и удаленная опция меню. Например, если удалить опцию Создать 8 меню Файл, то всегда можно использовать кнопку Создать на панели инструментов, комбинацию клавиш <Ctrl+N>, область задач (в Excel 2002) или контекстное меню рабочего стола для создания новой рабочей книги.
Переход от Excel 5/95
Если меню изменялись в Excel 5 или Excel 95, то можете забыть обо всех выученных методах создания таких меню. Начиная с Excel 97, методы внесения изменений в систему меню претерпели значительных модификаций. Итак, изменения заключаются в следующем,
•ф-Строкаменюфактическиявляетсязамаскированнойпанельюинструментов.Если это утверждение вызывает недоверие, то можно захватить вертикальные полосы 8 левой части строки меню и перетащить ее в другое место. Если переместить строку меню достаточно далеко, то в итоге получится плавающая панель инструментов. Официальным обобщающим термином (VBA) для строки меню и панелей инструментов являетсякоманднаяпанель(commandbar).
ЧастьVI.Разработкаприложений |
593 |

•$• Исчез редактор меню Excel 5/95. Для того чтобы отредактировать меню вручную, необходимо воспользоваться командой Вид^Панели инструментов^Настройка. Но помните, что рабочие книги Excel 5/95, в которых находятся меню, созданные с помощью старых методов редактирования, продолжают работать в Excel 97 и-последующих версиях. Внести изменения в подобные меню можно только средствами Excel 5/95,
•Ф- Не существует простого способе назначения макроса VBA новой опции меню
Сервис. В Excel 5/95 это сделать очень просто. Далее в этой главе показан код VBA. который можно использовать для добаЕтения новой опции меню Сервис.
•Ф- Excel 2000 и поздние версии по умолчанию отображают те опции меню, которые использовались наиболее часто. На наш взгляд, это одна из наиболее неудачных идей Microsoft. Сложно представить, зачем может понадобиться изменять порядок представления опций меню. К счастью, данная возможность отключается с помощью опции вкладки Параметры диалогового окна Настройка.
Добавление элементов меню
Вы вправе добавлять собственные меню во встроенные строки меню. Кроме того, можно добавлять собственные опции меню во встроенные меню и даже создавать новые строки меню, если в этом есть необходимость. Например, при разработке приложения, которое не нуждается во встроенных меню Excel, простым решением будет использование новой строки меню, которая состоит из пользовательских меню и опций меню, запускающих созданные разработчиком макросы. Допускается скрывать стандартную строку меню Excel и заменять ее на созданную разработчиком строку меню.
Изменение опций меню
Если стандартные подписи опций меню Excel вам надоели, то замените их на другие. Например, можно изменить название меню Сервис на Инструменты или Утилиты. Кроме того, встроенной опции меню можно назначить собственный макрос. Существует ряд других возможностей по изменению меню, в число которых входит переорганизация меню в строке меню (например, меню Справка (?) можно отображать в строке первым, а не последним).
Ссылки на коллекцию CommandBars
Коллекция CoittmandBara содержится в объекте Application. При ссылке на эту коллекцию из модуля кода VBA общего назначения можно опустить ключевое слово Application (подразумевается по умолчанию). Например, следующий оператор (расположенный в модуле кода VBA общего назначения) отображает имя первого элемента коллекции CoimandBars:
MsgBox ComrciandBars (1} .Name
При ссылке на коллекцию CommandBars из модуля кода объекта ЭтаКнига ссылку необходимо предварять ссылкой на объект Application, как показано ниже:
MsgBox Application.CommandBars(1).Name
При изменении названий встроенных меню Excel следует быть предельно осторожным. Некоторые разработчики Excel предполагают, что меню имеют стандартные названия, и используют эти названия при создании новых опций меню. Код, написанный такими разработчиками, не будет выполняться, если названия меню отличаются от стандартных. Как показано ниже, использование метода Findcontrol помогает избежать подобных проблем.
Далее в этой главе речь пойдет о коде VBA, который предназначен для внесения изменений в существующие меню.
594 |
Глава 23. Создание пользовательских меню |

Глава22предоставляетполнуюинформациюодиалоговомокнеНастройкэ.
Примеры кода VBA
В настоящем разделе предоставляются практические примеры кода VBA, который предназначен для управления меню Excel.
Вывод информации о меню
Процедура L i s t M e n u I n f о, которая приведена ниже, демонстрирует описанные принципы. Она отображает название каждого элемента меню (меню, опции меню, а также опции подменю), находящегося в строке меню листа.
Sub ListMenuInfo()
Dim row As Integer
Dim Menu As CommandBarControl
Dim Menultem As CommandBarControl Dim SubMenultem. As Camm.and3arCon.trol row = 1
On Error Resume Next
For Each Menu In CommandBars(1).Controls For Each Menultem In Menu,Controls
For Each SubMenultem In Menultem.Controls Cells(row, 1) = Menu.Caption Cells(row, 2) = Menultem.Caption Cells(row, 3) = SubMenultem.Caption row = row + 1
Next SubMenultem Next Menultem
Next Menu End Sub
Нарнс. 23Л показан результат выполнения процедуры ListMenuInfo.
/*ис.23.1. Фрагмент, полученный s pfsv.ibtnaine выполнения процедуры ListMenuInfo
Часть V/. Разработка приложений |
595 |

Рабочая книга, которая содержит эту процедуру, доступна на Web-узле издательства.
Оператор on Error Resume Next используется с целью предотвратить отображение сообщения об ошибке, которое возникает, когда процедура пытается получить доступ к несуществующей опции подменю.
Добавление нового меню в строку меню
Вэтом разделе описан метод использования кода VBA для добавления нового меню в строку меню листа. Строка меню листа является первым элементом коллекции ContmandBars, поэтому на нее можно ссылаться одним из двух способов:
CommandBars("Worksheet Menu Bar") CommandBars (1)
Втерминологии VBA метод Add используется для добавления нового элемента управления в коллекцию C o n t r o l s . Новый элемент управления является "всплывающим"; он имеет тип m s o C o n t r o l P o p u p . Можно указать расположение нового элемента управления. Если этого не сделать, то новый элемент управления будет располагаться в конце строки меню.
Процедура добавления нового меню состоит из двух этапов.
1.Необходимо воспользоваться методом Add для добавления переменной, которая ссылается на новый элемент управления. Аргументы метода Add позволяют указать тип элемента управления, идентификатор элемента управления (имеет смысл только в случае добавления встроенного меню), расположение, а также время существования элемента управления (должен ли элемент управления сохраняться в момент закрытия Excel).
2.Необходимо определить свойства добавленного элемента управления. Например, почти всегда требуется указать значения свойств C a p t i o n и OnAction.
Соглашения по созданию меню
Легко заметить, что меню в программах для Windows обычно соответствуют определенным соглашениям. Источники происхождения этих соглашений неизвестны, но им необходимо следовать, если требуется произвести впечатление опытного разработчика, который точно знает, что делает. При внесении изменений в меню необходимо учитывать следующее.
•> Традиция требует, чтобы меню Файл всегда располагалось первым, а меню Справка — последним в строке меню.
<- Текст меню должен вводиться в правильном регистре. Первая буква каждого названия должна быть прописной.
<• Меню верхнего уровня не должны связываться с определенными действиями. Другими словами, каждое меню имеет как минимум одну опцию.
<• Подписи опций меню обычно ограничены тремя или меньшим количеством слов.
•> Каждая опция меню должна иметь "горячую" клавишу (подчеркнутый символ), которая является уникальной в пределах этого меню.
• Опция меню, которая отображает диалоговое окно, должна завершаться троеточием {...). •Ф- Список опций меню должен оставаться относительно коротким. Иногда подменю являются хорошей альтернативой использованию длинных списков. Если вами асе же используется длинный список опций меню, то необходимо вставить разделительные
полосы, которые логически группируют сходные опции меню.
Глава 23. Создание пользовательских меню
Если это возможно, отключите опции меню, которые не соответствуют текущему контексту. В VBA, чтобы отключить опцию (сделать ее неактивной) меню, необходимо изменить значение свойства Enabled на False.
Некоторые опции меню служат в качестве переключателей. Когда параметр активен, опция меню отображается с установленным флажком.
Добавление меню: первая попытка
В этом примере главной целью является добавление нового меню Бюджет в строку меню листа. Данное меню должно располагаться слева от меню Справка.
Sub AddNewMenu()
Dim Helplndex As Integer
Dim NewMenu As CommandBarPopup
i
1Получение индексного номера меню ?
Helplndex = CommandBars(1).Controls{"Help"}.Index
1Создание меню
Set NewMenu = CommandBars (1) .Controls -Add __ (Type:=msoControlPopup, _ Before:=HelpIndex, _
Temporary:=True)
' Добавление названия NewMenu.Caption = "^Бюджет"
End Sub
Предыдущий код не является идеальным способом добавления меню. Этот код может вставить, а может и не вставить меню в правильную позицию, что объясняется такими причинами.
•Предполагается, что в строке меню присутствует меню ?. В то же время пользователь мог удалить его.
•Предполагается, что меню ? имеет название Help. Неанглийские версии Excel могут использовать другое название для данного меню (в русской версии это Справка).
Добавление меню: вторая попытка
Листинг 23.1 содержит более правильный вариант кода. В представленном коде используется метод F i n d C o n t r o l , который будет находить меню Справка. Если меню Справка не найдено, то код добавляет новое меню в конец строки меню листа-
Листинг 23,1. Добавление меню Бюджет в строку меню листа Excel
Sub AddNewMenu{)
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
Dim. Menultem As CammandBaEControl
Dim Submenuitem As CommandBarButton
1Удаление меню, если таковое существует Call DeleteMenu
1Поиск меню Справка
Set HelpMenu = CommandEars(1).FindControl(Id:=30010) If HelpMenu Is Nothing Then
'Добавление меню в конец строки меню
Часть V/. Разработка приложений |
597 |

Set NewMenu = CornmandEars (1) .Controls .Add .
(Type:=msoControlPopup, _
temporary:=True}
Else
'Добавление меню перед меню Help
Set NewMenu = CommandBars(1}.Controls.Add
{Type:=msoControlPopup, _
Before:=HelpMenu.Index, _
temporary:=True)
End If
1 Добавление подписи NewMenu.Caption = "&Бюджет"
End Sub
Предыдущая процедура создает полностью бесполезное меню (в этом меню отсутствуют функциональные опции). Обратитесь к разделу "Добавление опции в меню Сервис" далее в этой главе для получения дополнительной информации о добавлении опции меню.
Для того чтобы воспользоваться метолом F i n d C o n t r o l , необходимо знать значения свойства ID требуемого элемента управления. Каждый встроенный элемент управления Excel CommandBar имеет уникальное значение свойства ID. В этом примере значение свойства ID для меню Справка определено с помощью следующего оператора:
MsgBox C o m m a n d B a r s ( 1 ) . C o n t r o l s ( " С л р а в к а " ) . I D
Окно сообщения отобразило значение 30010 свойства ID, которое использовано в качестве параметра метода F i n d C o n t r o l . В табл. 23.1 показаны значения свойства ID для элементов верхнего уровня строки меню Excel.
Таблица 23.1. Значение свойства /О меню верхнего уровня Excel
Меню |
Значение |
File (Файл) |
30002 |
Edit (Правка) |
30003 |
View (Вид) |
30004 |
Insert (Вставка) |
30005 |
Format (Формат) |
30006 |
Tools (Сервис) |
30007 |
Data (Данные) |
30011 |
Chart (Диаграмма) |
30022 |
Window (Окно) |
30009 |
Help (Справка) |
30010 |
Удаление меню со строки меню
Чтобы удалить меню, можно воспользоваться методом D e l e t e . Следующий пример демонстрирует способ удаления меню Бюджет со строки меню листа. Обратите внимание на использование оператора On E r r o r ReEsume Next, который позволяет игнорировать сообщение об ошибке, которое возникает при попытке удалить несуществующее меню.
598 |
Глава 23. Создание пользовательских меню |