Имяпоявившегося окна. Теперь при щелчке заголовка подменю справа или слева от него появится пустое подменю (рис. 122).
 
    Рис. 122.Создание подменю
 
    Добавление встроенной команды
   MS Office позволяет добавлять команды к любым встроенным и пользовательским меню, а также изменять внешний вид, группировать и визуально отделять одну группу команд от другой.
   В диалоговом окне «Настройка» сделайте модифицируемое меню видимым, а затем:
   1) на вкладке Командывыберите в списке Категориикатегорию добавляемой команды – все команды данной категории будут показаны в списке Команды;
   2) выберите команду в списке Командыи перетащите ее в то меню или подменю, куда она добавляется. Чтобы выпадающее меню или подменю открылось, показав имеющиеся в нем элементы, протащите команду через заголовок соответствующего выпадающего меню или подменю. Горизонтальная черта отмечает место в списке команд выпадающего меню, куда попадет заголовок нового подменю (рис. 123).
 
    Рис. 123.Добавление встроенных команд
 
   Скопировать команду можно и иначе: выведите на экран меню с нужной командой и перетащите ее в свое меню при нажатой клавише Ctrl.
    Добавление собственной команды
   Добавление команды с помощью окна «Настройка» в собственное или встроенное меню зависит от приложения Office, в котором оно выполняется:
    Microsoft Excel.Действуя так же, как и при вставке встроенной команды, выберите в списке Категориикоманду Макрос (Macros) и перетащите элемент Настраиваемая команда менюиз списка Командыв меню. Щелкните эту команду правой кнопкой мыши и выберите в появившемся меню команду Назначить макрос. Затем введите в поле Имяимя макроса, который должен запускаться командой меню;
    Microsoft Wordи Microsoft PowerPoint.Как при вставке встроенной команды, выберите в списке Категориикоманду Макросыи перетащите в меню имя нужного макроса из списка Команды (рис. 125, подробнее в главе 2). Для этого предварительно необходимо создать макрос (модуль) с необходимым именем и действием (рис. 124). Результат действия команды показан на рис. 126.
 
    Рис. 124.Создание макроса (модуля) запуска разработанной формы
 
    Рис. 125.Выбор макроса (модуля), открывающего форму
 
    Рис. 126.Добавление собственной команды в разработанную панель и ее запуск
 
    Удаление команды
   Для удаления компонента меню надо в диалоговом окне «Настройка» сделать видимым модифицируемое меню, щелкнуть правой кнопкой мыши удаляемый элемент и в появившемся меню выбрать команду Удалить. Чтобы удалить целиком пользовательскую панель меню, нужно перейти на вкладку Панели инструментовдиалогового окна «Настройка» и, выбрав в списке Панели инструментовимя удаляемой панели меню, щелкнуть кнопку Удалить.
 
    Восстановление встроенных компонентов меню
   Восстановить можно только встроенный элемент меню, который был ранее удален. Как и другие действия над меню, это делается в окне «Настройка». Если при этом восстановится заголовок выпадающего меню или подменю, то вместе с ним восстановятся само меню и все его потомки.
   В диалоговом окне «Настройка» нужно сделать видимым модифицируемое меню. Затем, щелкнув правой кнопкой мыши заголовок выпадающего меню или подменю, которое нужно восстановить, выберите в появившемся меню команду Сброс.
   Чтобы восстановить встроенную панель меню, перейдите на вкладку Панели инструментовокна «Настройка», выберите в списке Панели инструментовимя восстанавливаемой панели меню и щелкните кнопку Сброс.
Создание меню с помощью VBA
   Новое меню в Excel, Word или PowerPoint обычно создается средствами VBA, поскольку в этих приложениях диалоговое окно «Настройка» не содержит кнопки Свойства.Новое меню создается методом Add коллекции CommandBars (Панели команд):
    Выражение.Add(Name, Position, MenuBar, Temporary),
   где выражение –обязательное выражение, возвращающее объект CommandBars, а все параметры в скобках необязательны. Nameзадает имя нового меню;
    Positionопределяет его положение (значения-константы msoBarLeft, msoBarTop, msoBarRight, msoBarButtom определяют положение меню слева, вверху, справа или внизу окна, msoBarFloating задает «плавающее» меню, msoBarPopup указывает, что новое меню будет всплывающим).
 
   Значение True параметра MenuBarуказывает на то, что новое меню заменит текущую активную строку меню (по умолчанию – False). Значение True параметра Temporaryозначает, что новое меню будет временным и исчезнет, когда закроется содержащее его приложение (по умолчанию – False).
   В следующем примере создается новое меню «Головное меню»:
   Dim CstmBar As CommandBar
   Set CstmBar = CommandBars.Add(Name:="Головнoe меню",
   Position:=msoBarTop, MenuBar:=True, Temporary:=False)
    Добавление выпадающих меню
   Чтобы добавить новое меню программно, надо использовать метод Add коллекции CommandBarControls, применив его к объекту типа CommandBar, который представляет панель нашего меню. Данный метод позволяет помещать на панель кнопки (CommandBarButton), комбинированные списки (CommandBarComboBox) и выпадающие меню (ComandBarPopup). Вызов метода имеет вид:
   выражение. Add(Type, Id, Parameter, Before, Temporary),
   где Выражениедолжно возвратить объект типа CommandBarsControl.
 
   Параметры в скобках необязательны. Параметр Туре(Тип) задает тип добавляемого объекта. Его значение msoControlPopup указывает, что добавляемый управляющий элемент – выпадающее меню. Для пользовательских меню параметры Idи Parameterможно опустить. Значение аргумента Before –число, указывающее положение нового элемента в последовательности элементов панели: если его нет, элемент помещается в конец. Определить имя и ключ быстрого доступа к созданному меню можно, задав значение свойства Caption.
   Пример добавления выпадающего меню Ввод документовпанели Головное менюс ключом быстрого доступа «В»:
   Dim CstmCtrl As CommandBarControl
   Set CstmCtrl = CstmBar.Controls.Add(Type:=msoControlPopup,
   Before:=1)
   CstmCtrl.Caption = «&Ввод документов»
   Чтобы добавить новое подменю программно, к объекту, представляющему родительское выпадающее меню, нужно применить метод Add коллекции CommandBarControls. В качестве параметра Туре (Тип) надо использовать значение msoControlPopup.
   В следующем примере в конец выпадающего меню Ввод документов,расположенного на панели меню Головное меню,добавляется подменю «о движении товаров»:
   Dim CstmPopUpi As CommandBarPopup
   Set CstmPopUpi =
   stmCtrl.Controls.Add(Type:=msoControlPopup)
   CstmPopUpi.Caption = «о движении товаров»
    Добавление команд
   Добавить новую команду в меню можно, применив метод Add коллекции CommandBarControls к объекту, представляющему изменяемое меню. Для того чтобы добавить собственную команду, вставьте ее имя в меню, а затем в качестве значения свойства OnAction задайте имя VBA-процедуры, которая должна вызываться при выборе данной команды. В качестве значения аргумента Туре (Тип) метода Add укажите msoControlButton, означающее, что вставляемый в меню элемент будет командой. Добавим команду «Накладная» в выпадающее меню Ввод документовиз панели Головное меню.Выбор этой команды запускает процедуру Invoice:
   Set CstmCtrl = CstmPopUpi.Controls.Add(Type:=msoControlButton)
   CstmCtrl.Caption = «Накладная»
   CstmCtrl.OnAction = «Module1.Invoice»
   Метод Add позволяет вставлять в меню и встроенные команды. Для этого при вызове задайте значение параметра Id, равное числовому идентификатору данной команды в Office. Поскольку в Office 2000 количество команд доходит до 4000, в табл. 22 приведем основные команды редактирования.
 
    Таблица 22
Фрагмент таблицы идентификаторов встроенных команд меню
 
   Пример добавления команды проверки правописания Spelling в меню Проверкииз панели Головное меню:
   Set mySpell = CommandBars(«Головное меню»).Соntrols(«Проверки»)_.Controls.Add(Id:=2)
    Пример 61.Создать документ, в котором будут отключены все встроенные меню и создано собственное иерархическое меню. На верхнем уровне меню будет состоять из одного пункта. Оно будет включать два подменю, каждое из которых содержит по одной команде. Для реализации данных условий создаем простую форму, содержащую две кнопки: Создатьи Отмена(рис. 127). Первая кнопка отключает все панели открытого документа и создает собственное меню (рис. 127), вторая кнопка возвращает все панели на место (рис. 128).
    Технология выполнения
   1. Активизируйте приложение Word и создайте документ.
   2. Перейдите в редактор VBA и создайте форму.
   3. Создайте процедуру создания собственной панели.
   Option Explicit
   Public Sub CreateCustomMenu()
   Dim CstmBar As CommandBar
   Dim CstmPopUpi As CommandBarPopup, CstmPopUp2 As CommandBarPopup
   Dim CstmCtrl As CommandBarControl
   Dim Exist As Boolean
   'Выключаем все панели
   For Each CstmBar In CommandBars
   CstmBar.Enabled = False
   Next CstmBar
   'Создаем, включаем и делаем видимой собственную панель
   Exist = False
   For Each CstmBar In CommandBars
   If CstmBar.Name = «Головное меню» Then
   Exist = True
   Exit For
   End If
   Next CstmBar
   If Not Exist Then
   Set CstmBar = CommandBars.Add(Name:="Головнoe меню", Position:=msoBarTop, MenuBar:=True, Temporary:=False)
   End If
   CstmBar.Enabled = True
   CstmBar.Visible = True
   'Добавляем меню на панель
   Exist = False
   For Each CstmCtrl In CstmBar.Controls
   If CstmCtrl.Caption = «&Ввод документов» Then
   Exist = True
   Exit For
   End If
   Next CstmCtrl
   If Not Exist Then
   Set CstmCtrl = CstmBar.Controls.Add(Type:=msoControlPopup, Before:=1)
   CstmCtrl.Caption = «&Ввод документов»
   'Добавляем две команды подменю
   Set CstmPopUpi =
   CstmCtrl.Controls.Add(Type:=msoControlPopup)
   CstmPopUpi.Caption = « о движении товаров»
   Set CstmPopUp2 =
   CstmCtrl.Controls.Add(Type:=msoControlPopup)
   CstmPopUp2.Caption = « финансовых»
   'Добавляем команду в каждое подменю
   Set CstmCtrl =
   CstmPopUpi.Controls.Add(Type:=msoControlButton)
   CstmCtrl.Caption = «Накладная»
   CstmCtrl.OnAction = «Module1.Invoice»
   Set CstmCtrl =
   CstmPopUp2.Controls.Add(Type:=msoControlButton)
   CstmCtrl.Caption = «Счет»
   CstmCtrl.OnAction = «Module1.Account»
   End If
   End Sub
    Пояснения к процедуре.Вначале, используя свойство Enabled, были отключены все панели. Затем было сформировано головное меню с двумя подменю и командами, содержащее всего один пункт. Обратите внимание: перед добавлением нового пункта обычно проверяется, а не был ли он уже добавлен. Подобная проверка позволяет избежать ошибок, возникающих при попытках добавить уже существующий пункт или удалить несуществующий.
   4. Создайте процедуру восстановления панелей инструментов документа.
   Public Sub ResetMainMenu()
   Dim CstmBar As CommandBar
   'Включаем все панели
   For Each CstmBar In CommandBars
   CstmBar.Enabled = True
   Next CstmBar
   Set CstmBar = CommandBars.Item(«Menu Bar»)
   CstmBar.Visible = True
   End Sub
   5. Пропишите обработчик кнопки «Создать».
   Private Sub CommandButton1_Click()
   Call CreateCustomMenu
   End Sub
   6. Пропишите обработчик кнопки «Отмена», восстанавливающей стандартное окружение.
   Private Sub CommandButton2_Click()
   Call ResetMainMenu
   End Sub
   7. Чтобы пример был законченным, приведем процедуры, вызываемые в ответ на выбор команд меню Накладнаяи Счет:
   Public Sub Invoice()
   MsgBox («Накладная!»)
   End Sub
   Public Sub Account()
   MsgBox («Счет!»)
   End Sub
   8. Откомпилируйте программу, запустите форму на выполнение.
 
    Рис. 127.Форма примера 61 в рабочем режиме. Результат работы кнопки Создать
 
    Примечание.Данный пример доработать для более рационального использования следующим образом: в головном меню разработчика создать пункт Форма,который вызывает соответствующую форму, редактирующую меню всего приложения (рис. 129, 130). После нажатия кнопки Создатьменю всего приложения Word изменяется, подключив Главное меню, созданное программно. В этом меню пункт «Работа с меню + Отмена» запускает форму с соответствующими кнопками ( Создатьи Отменить).
 
    Рис. 128.Результат работы кнопки Отменить
    Рис. 129.Главное меню разработчика и вызываемая форма
 
    Рис. 130.Главное меню приложения, созданное программно, и пункт Отмена, вызывающий форму с кнопкой Отменить

Литература

   1.  Биллиг В.А., Дехтяръ М.И.VBA и Office 97. Офисное программирование. М.: Издательский отдел «Русская Редакция», ТОО «Cheannel Trading Ltd.», 1998.
   2.  Биллиг В.А.VBA в Office 2000. Офисное программирование. М.: Издательско-торговый дом «Русская Редакция», 1999.
   3.  Санна П. и др.Visual Basic® для приложений (версия 5) в подлиннике / Пер. с англ. СПб.: BHV – Санкт-Петербург, 1997.
   4.  Гарнаев А.Ю.Самоучитель VBA. СПб.: БХВ-Петербург, 2004.
   5.  Кузьменко В.Г.VBA 2000. М.: ЗАО «Издательство БИНОМ», 2000.
   6.  Камминг С.VBA для «чайников». 3-е изд. М.: Издательский дом «Диалектика», 2001.
   7.  Симонович СВ., Евсеев Г.А., Алексеев А.Г.Специальная информатика: Учеб. пособие. М.: АСТ-ПРЕСС: Информ-Пресс, 2001.
   8.  Робинсон С.Microsoft Access 2000: Учебный курс. СПб.: Питер, 2002.
   9. Информатика: Практикум по технологии работы на компьютере / Под ред. Н.В. Макаровой. М.: Финансы и статистика, 2003.
   10.  Харитонова И., Вольман Н.Программирование в Access 2002: Учебный курс. СПб.: Питер, 2002.