[an error occurred while processing this directive]

В начало

Введение

1-й час. Знакомство с Visual Basic for Applications

2-й час. Работа с макросами

3-й час. Работа с элементами управления

4-й час. Переменные и константы

5-й час. Ввод данных

6-й час. Логика условных операторов

7-й час. Циклические вычисления

8-й час. Введение в объекты

9-й час. Основные объекты Excel

10-й час. Объект Range

11-й час. Редактор Visual Basic

12-й час. Отладка программ

13-й час. Обработка ошибок

14-й час. Экранные формы

15-й час. Автоматизация экранных форм

16-й час. Панели инструментов

17-й час. Работа с меню

18-й час. Диаграммы

19-й час. Сводные таблицы

20-й час. Получение внешних данных

21-й час. Доступ к данным с помощью ADO

22-й час. Еще об ADO

23-й час. Автоматизация

24-й час. Выполнение процедур

Приложение. Ответы

17-й час. Работа с меню

В предыдущем часе вы изучили методы работы с панелями инструментов. В этом часе вы узнаете, как работать с системой меню "вручную" и с помощью программ. В этом часе будут рассмотрены следующие вопросы.

  • Способы модификации системы меню.
  • Создание меню посредством кода VBA.
  • Отображение и удаление строк меню.

Способы изменения меню

При работе с меню вы в действительности работаете с тремя объектами: контейнером (строкой меню), пунктами меню и элементами пунктов меню. Контейнер для меню похож на панель инструментов, в Excel он называется строкой меню, а в VBA - командной панелью (command bar). Командная панель содержит пункты меню (или просто меню), например, такие, как Файл, Правка или Справка. Пункты меню в свою очередь содержат элементы меню или команды. Например, пункт меню Файл содержит элементы меню Открыть, Сохранить и Печать.

При настройке меню "вручную" вы можете добавить в строку меню новые пункты или новые команды - в пункты меню. Для этого можно использовать предопределенные Excel пункты меню и команды или создать собственные. Для создания нового пункта меню и новых элементов меню, которые бы использовались для выполнения макросов и процедур, проделайте следующие действия.

  1. Откройте рабочую книгу Гость.
  2. Щелкните правой кнопкой мыши на строке меню и в контекстном меню выберите команду Настройка. Откроется одноименное диалоговое окно.
  3. Перейдите на вкладку Команды. На этой вкладке представлены все доступные категории (пункты) меню и команды меню (рис. 17.1).
  4. В списке Категории выберите категорию Новое меню. В списке Команды будет находиться только один элемент, также названный Новое меню.
  5. Перетащите элемент Новое меню из списка Команды в строку меню.
  6. Опустите его между пунктами меню Данные и Окно. В строке меню появится новый пункт, выделенный черной рамкой (рис. 17.2).

Рис. 17.1. В списке категорий вы видите знакомые пункты меню

  1. Теперь надо переименовать новый пункт меню. Щелкните на нем правой кнопкой мыши и в контекстном меню выберите пункт Имя. Введите новое имя &Гость.

Символ & перед буквой Г назначает быструю клавишу для этого пункта меню.

  1. Далее надо добавить команды в меню Гость. Снова выберите элемент Новое меню в окне Настройка и перетащите его в меню Гость. При перетаскивании этого элемента под меню Гость откроется небольшое серое окошко. Когда в этом окошке появится указатель в виде черной буквы I (рис, 17.3), опустите элемент Новое меню в это окошко.

Практически можно назначить макрос или процедуру непосредственно пункту Гость. Но, в соответствии с общепринятыми стандартами пользовательских интерфейсов, исполняемые команды назначаются не пунктам меню, а элементам меню, т.е. командам.

  1. Щелкните правой кнопкой мыши на элементе Новое меню пункта Гость и в открывшемся меню выберите команду Имя.
  2. Введите имя &Расходы.
  3. Теперь надо назначить процедуру или макрос новой команде Расходы меню Гость. Щелкните правой кнопкой мыши на элементе Расходы и в контекстном меню выберите команду Назначить макрос. Откроется одноименное диалоговое окно.
  4. В диалоговом окне Назначить макрос выберите процедуру ЗагрузкаФормы и щелкните на кнопке ОК.
  5. Щелкните на кнопке Закрыть диалогового окна Настройка.

Рис. 17.2. В строку меню вставлен новый пункт

Рис. 17.3. Маленькое окошко под пунктом Гость показывает, что это меню пока пустое

После закрытия диалогового окна Настройка новое меню готово к работе. Выполните команду Гость > Расходы. Откроется форма Гостевые расходы. Щелкните на кнопке Отмена для закрытия формы.

Теперь вы знаете еще один способ запуска приложений!

Программная работа с меню

Создание строки меню с помощью кода VBA ничем не отличается от аналогичной операции создания панели инструментов, рассмотренной в предыдущем часе. Фактически, вы создаете элемент той же самой коллекции CommandBars (Командные панели). Оператор, создающий строку меню (командную панель), имеет следующий синтаксис:

CommandBars.Add(Name, Position, MenuBar, Temporary)

Аргумент Name (Имя) содержит имя командной панели. Строго говоря, аргумент Name необязателен. Если он не задан, то по умолчанию командной панели присваивается имя, подобное Custom 1.

Аргумент Position (Позиция) также необязательный аргумент. Он указывает местоположение или тип создаваемой командной панели.

Так как мы создаем именно строку меню, то аргументу MenuBar (Строка меню) надо дать значение True. По умолчанию этот аргумент имеет значение False.

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

Приступим к практической работе по созданию меню. Закройте все открытые рабочие книги и откройте новую. Нажмите комбинацию клавиш <Alt+F11> для перехода в редактор Visual Basic. Вставьте модуль в текущую рабочую книгу. Далее выполните следующие действия.

  1. Создайте новую процедуру с именем ПервоеМеню.
  2. Введите следующий код процедуры:

Dim mybar As CommandBar

Set mybar = CommandBars.Add(Name:="Чcal", _

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

mybar.Visible = True

CommandBars("Worksheet Menu Bar").Visible = False

  1. Создайте другую процедуру под именем ОтменаМеню.
  2. Введите код этой процедуры.

CommandBars ("Час17").Delete

  1. Перейдите в рабочую книгу. Создайте командную кнопку на рабочем листе Лист1. Назначьте этой кнопке процедуру ПервоеМеню и задайте надпись на кнопке Мое меню.
  2. Создайте другую командную кнопку и назначьте ей процедуру ОтменаМеню. Задайте надпись на кнопке Стандартное меню.
  3. Щелкните на кнопке Мое меню. В окне рабочей книги вместо стандартной строки меню отобразится пустая строка (рис. 17.4).
  4. Щелкните на кнопке Стандартное меню. Восстановится стандартная строка меню.

Рис. 17.4. Вместо привычного меню - пустая строка

Итак, мы только что создали строку меню (пока пустую) посредством кода VBA. В листинге 17.1 приведен полный код процедуры ПервоеМеню.

Листинг 17.1. Процедура ПервоеМеню

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

2:  Dim mybar As CommandBar

3:

4:  Set mybar = CommandBars.Add(Name:="Чac17", _

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

5:  mybar.Visible = True

6:  CommandBars("Worksheet Menu Bar").Visible = False

7:

8: End Sub

Сначала в этой процедуре объявлена переменная-объект, которой затем с помощью метода Add присваивается строка меню.

Dim mybar As CommandBar

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

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

После создания строки меню она выводится на экран путем установки значения свойства Visible (Видимый) как True. Одновременно с экрана убирается стандартное меню рабочего листа, для чего значение свойства Visible этой строки меню делается равным False:

mybar.Visible = True

CommandBars("Worksheet Menu Bar").Visible = False

Вот и вся процедура создания строки меню. Процедура ОтменаМеню применяет метод Delete (Удалить) для удаления нашей строки меню.

Следующий шаг в процессе создания меню - добавление в нее пунктов и команд.

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

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

Вопросы и ответы

Вопрос. При работе с панелями инструментов я использовал коллекции CommandBars и Controls. Эти же коллекции применяются и при работе со строками меню. Почему?

Ответ. В Excel (или шире - в Microsoft Office) строки меню и панели инструментов - это два элемента одной коллекции CommandBars (Командные панели). В свою очередь пункты меню, элементы меню (команды) и кнопки панелей инструментов также являются членами одной коллекции Controls (Элементы управления). Если подумать, то в таком объединении разнородных, на первый взгляд, элементов есть определенный смысл: и строка меню, и панель инструментов - это всего лишь контейнеры-панели, содержащие разнообразные элементы управления.

Вопрос. Как можно заблокировать какой-либо пункт меню или команду при выполнении своего приложения?

Ответ. Очень просто! Положите для пункта меню или команды, которые хотите заблокировать, значение свойства Enabled равным False. И все!

Практикум

С помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении.

Тесты

  1. Какой метод используется для создания меню?
  2. Какое свойство пользовательской команды (элемента меню) назначает процедуру, выполняемую при выборе этой команды?
  3. Какой тип элемента управления задает пункт меню?
  4. Как удалить строку меню с помощью кода VBA?
  5. Какое диалоговое окно должно быть открыто при настройке меню?
  6. Для создания командной панели вы используете метод Add. Какой аргумент этого метода (и как) надо задать, чтобы командная панель автоматически удалялась при закрытии приложения, содержащего эту панель?
  7. Как вывести на экран строку меню?

Упражнение

Напишите процедуру, которая создавала бы и выводила на экран строку меню (с именем Пример17), содержащую пункты Файл, Правка и Справка. Напишите еще одну процедуру для удаления этой строки меню. На свободном рабочем листе создайте две командные кнопки, которые выполняли бы эти процедуры. Выполните и протестируйте процедуры.

[an error occurred while processing this directive]