10: Set mymenu = mybar.Controls.Add(Type:=msoControlPopup, _
Temporary:=True)
11: mymenu.Caption = "17-й час"
12:
13: Set mymenuitem = mymenu.Controls.Add(Type:=msoControlButton, ID:=1)
14: mymenuitem.Caption = "Демонстрация"
15: mymenuitem.Style = msoButtonCaption
16: mymenuitem.OnAction = "ПокажиМеня" 17:
18: mybar.Visible = True
19: CommandBars("Worksheet Menu Bar").Visible = False
20: End Sub
Вам надо создать процедуру ПокажиМеня, вызываемую по команде Демонстрация. Эта процедура может содержать любой код, например, такой:
MsgBox "Оно работает!"
Вернитесь в рабочую книгу на Лист1 и выполните процедуру ПервоеМеню, щелкнув на командной кнопке Мое меню. Теперь строка примет вид, как на рис. 17.5.
Рис. 17.5. Теперь строка меню не пустая
Щелкните на пункте меню 17-й час, а затем на команде Демонстрация. Если вы создали процедуру ПокажиМеня с приведенным мной кодом, то откроется окно сообщения. Щелкните на кнопке ОК для закрытия этого окна. Щелкните в рабочем листе на командной кнопке Стандартное меню. Восстановится стандартное меню Excel. Сохраните рабочую книгу под именем Час17.
Сделаем анализ кода той части процедуры ПервоеМеню, которая отличается от кода, приведенного в листинге 17.1. Во-первых, объявлены две новые переменные-объекты:
Dim mybar As CommandBar
Dim mymenu As Object
Во-вторых, в строку меню вставлен пункт Файл. (Чтобы узнать значение Id для этого пункта, я сначала записала макрос, вставляющий этот пункт в строку меню.) Пункт Файл первый в строке меню, поэтому значение аргумента Before равно 1:
Set mymenu = mybar.Controls.Add(Type:=msoControlPopup, _
Temporary:=True)
mymenu.Caption = "17-й час"
После этого в пункт 17-й час вставляется элемент-команда:
Set mymenuitem = mymenu.Controls.Add(Type:=msoControlButton, ID:=1)
Для пользовательских элементов надо задать значения нескольких свойств. Прежде всего для свойства Caption, которое задает имя команды. Так как в меню будет отображаться только имя команды (т.е. только текст, без пиктограммы и комбинации клавиш, закрепленных за этой командой), то свойству Style (Стиль) присваивается значение msoButtonCaption (самый простой стиль команды). Свойство OnAction назначает процедуру, вызываемую этой командой:
mymenuitem.Caption = "Macro Demo"
mymenuitem.Style = msoButtonCaption
mymenuitem.OnAction = "ShowMe"
Обращаю ваше внимание на один существенный момент в создании меню. Вставляете ли вы пункт в строку меню или элемент меню (команду), все равно вы работаете с коллекцией Controls (Элементы управления). Какой именно элемент этой коллекции создается (пункт меню или команда), зависит от того объекта, для которого он создается (в первом случае - это строка меню, а во втором - пункт меню).
Резюме
Ключевым средством для создания меню с помощью VBA является метод Add. Для создания командной панели (строки меню), пункта меню или элемента меню (команды) везде используется метод Add. Но применяется он к разным коллекциям: к коллекции CommandBars при создании строки меню и к коллекции Controls для вставки в строку меню пунктов и команд. Вы также видели, что код создания строк меню мало отличается от кода создания панелей инструментов. Различия заключаются в использовании различных аргументов и свойств.