Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Макросы.doc
Скачиваний:
26
Добавлен:
21.11.2018
Размер:
16.91 Mб
Скачать

Добавление пунктов и команд меню

Чтобы добавить в строку меню пункты меню и команды, применяется метод Add, создающий элементы коллекции Controls:

ИмяМеню.Controls.Add(Type, Id, Parameter, Before, Temporary)

Как вы догадались, ИмяМеню - это название строки меню, которое используется для ссылки на нее в коде процедуры. Аргумент Туре (Тип) задает тип создаваемого элемента, в данном случае для создания раскрывающегося пункта меню надо задать тип msoControlPopup.

Значение аргумента Id зависит от типа пункта меню, вставляемого в строку меню. Если это пункт из встроенной системы меню Excel, то значение Id задается целым числом, соответствующим этому пункту. Если создается пользовательский пункт меню (т.е. такой, которого нет в системе меню Excel), то Id следует положить равным 1. Как определить номер (Id) пункта меню Excel? Самый простой путь определения такого номера - создание макроса, вставляющего этот пункт в существующую строку меню. Просмотрев код макроса, вы определите этот номер.

Для вставки пункта меню в строку меню щелкните правой кнопкой мыши в строке меню и в контекстном меню выберите команду Настройка. В диалоговом окне Настройка перейдите на вкладку Команды и в списке Категории выберите пункт Встроенные меню. После этого в списке Команды отобразятся все возможные встроенные пункты меню Excel. Перетащите нужный пункт из списка Команды в строку меню.

Аргумент Parameter (Параметр) необязательный, и его значение зависит от типа пункта меню, который добавляется в строку меню. Если это пункт из встроенной системы меню Excel, то обычно этот аргумент опускается. Если вставляется пользовательский пункт меню, то этот аргумент можно использовать для передачи информации о выборе данного пункта в процедуру Visual Basic.

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

Если хотите сделать пункт меню или даже команду временной, т.е. работающими только тогда, когда отрыто приложение, для которого создается строка меню, задайте необязательный параметр Temporary как True. По умолчанию этот аргумент имеет значение False.

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

Set CurrMenuBar = CommandBars.ActiveMenuBar

Обычно команды пользовательских меню должны загружать какие-либо процедуры. Как назначить элементам меню процедуры, показано в листинге 17.2. В этом листинге в строку меню Час17 добавлены пункты Файл и 17-й час.

Листинг 17.2. Измененная процедура ПервоеМеню

1: Sub ПервоеМеню()

2:  Dim mybar As CommandBar

3:  Dim mymenu As Object

4:  Dim mymenuitem As Object

5:

6:  Set mybar = CommandBars.Add(Name:="Час17", _

     Position:=msoBarTop, MenuBar:=True, Temporary:=True)

7:

8:  mybar.Controls.Add Type:=msoControlPopup, ID:=30002, Before:=1

9:

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:

mybar.Controls.Add Type:=msoControlPopup, ID:=30002, Before:=l

Затем в строку меню вставляется пункт 17-й час:

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 для вставки в строку меню пунктов и команд. Вы также видели, что код создания строк меню мало отличается от кода создания панелей инструментов. Различия заключаются в использовании различных аргументов и свойств.