[an error occurred while processing this directive] | |
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
17-й час. Работа с менюВ предыдущем часе вы изучили методы работы с панелями инструментов. В этом часе вы узнаете, как работать с системой меню "вручную" и с помощью программ. В этом часе будут рассмотрены следующие вопросы.
Способы изменения менюПри работе с меню вы в действительности работаете с тремя объектами: контейнером (строкой меню), пунктами меню и элементами пунктов меню. Контейнер для меню похож на панель инструментов, в Excel он называется строкой меню, а в VBA - командной панелью (command bar). Командная панель содержит пункты меню (или просто меню), например, такие, как Файл, Правка или Справка. Пункты меню в свою очередь содержат элементы меню или команды. Например, пункт меню Файл содержит элементы меню Открыть, Сохранить и Печать. При настройке меню "вручную" вы можете добавить в строку меню новые пункты или новые команды - в пункты меню. Для этого можно использовать предопределенные Excel пункты меню и команды или создать собственные. Для создания нового пункта меню и новых элементов меню, которые бы использовались для выполнения макросов и процедур, проделайте следующие действия.
Рис. 17.1. В списке категорий вы видите знакомые пункты меню
Символ & перед буквой Г назначает быструю клавишу для этого пункта меню.
Практически можно назначить макрос или процедуру непосредственно пункту Гость. Но, в соответствии с общепринятыми стандартами пользовательских интерфейсов, исполняемые команды назначаются не пунктам меню, а элементам меню, т.е. командам.
Рис. 17.2. В строку меню вставлен новый пункт
Рис. 17.3. Маленькое окошко под пунктом Гость показывает, что это меню пока пустое После закрытия диалогового окна Настройка новое меню готово к работе. Выполните команду Гость > Расходы. Откроется форма Гостевые расходы. Щелкните на кнопке Отмена для закрытия формы. Теперь вы знаете еще один способ запуска приложений! Программная работа с менюСоздание строки меню с помощью кода VBA ничем не отличается от аналогичной операции создания панели инструментов, рассмотренной в предыдущем часе. Фактически, вы создаете элемент той же самой коллекции CommandBars (Командные панели). Оператор, создающий строку меню (командную панель), имеет следующий синтаксис:
Аргумент Name (Имя) содержит имя командной панели. Строго говоря, аргумент Name необязателен. Если он не задан, то по умолчанию командной панели присваивается имя, подобное Custom 1. Аргумент Position (Позиция) также необязательный аргумент. Он указывает местоположение или тип создаваемой командной панели. Так как мы создаем именно строку меню, то аргументу MenuBar (Строка меню) надо дать значение True. По умолчанию этот аргумент имеет значение False. Аргумент Temporary (Временно) также необязательный. Если этот аргумент имеет значение True, то командная панель будет удалена при закрытии приложения, ее содержащего. По умолчанию этот аргумент имеет значение False. Приступим к практической работе по созданию меню. Закройте все открытые рабочие книги и откройте новую. Нажмите комбинацию клавиш <Alt+F11> для перехода в редактор Visual Basic. Вставьте модуль в текущую рабочую книгу. Далее выполните следующие действия.
Рис. 17.4. Вместо привычного меню - пустая строка Итак, мы только что создали строку меню (пока пустую) посредством кода VBA. В листинге 17.1 приведен полный код процедуры ПервоеМеню. Листинг 17.1. Процедура ПервоеМеню
Сначала в этой процедуре объявлена переменная-объект, которой затем с помощью метода Add присваивается строка меню.
После создания строки меню она выводится на экран путем установки значения свойства Visible (Видимый) как True. Одновременно с экрана убирается стандартное меню рабочего листа, для чего значение свойства Visible этой строки меню делается равным False:
Вот и вся процедура создания строки меню. Процедура ОтменаМеню применяет метод Delete (Удалить) для удаления нашей строки меню. Следующий шаг в процессе создания меню - добавление в нее пунктов и команд. Добавление пунктов и команд менюЧтобы добавить в строку меню пункты меню и команды, применяется метод Add, создающий элементы коллекции Controls:
Как вы догадались, ИмяМеню - это название строки меню, которое используется для ссылки на нее в коде процедуры. Аргумент Туре (Тип) задает тип создаваемого элемента, в данном случае для создания раскрывающегося пункта меню надо задать тип msoControlPopup. Значение аргумента Id зависит от типа пункта меню, вставляемого в строку меню. Если это пункт из встроенной системы меню Excel, то значение Id задается целым числом, соответствующим этому пункту. Если создается пользовательский пункт меню (т.е. такой, которого нет в системе меню Excel), то Id следует положить равным 1. Как определить номер (Id) пункта меню Excel? Самый простой путь определения такого номера - создание макроса, вставляющего этот пункт в существующую строку меню. Просмотрев код макроса, вы определите этот номер. Для вставки пункта меню в строку меню щелкните правой кнопкой мыши в строке меню и в контекстном меню выберите команду Настройка. В диалоговом окне Настройка перейдите на вкладку Команды и в списке Категории выберите пункт Встроенные меню. После этого в списке Команды отобразятся все возможные встроенные пункты меню Excel. Перетащите нужный пункт из списка Команды в строку меню. Аргумент Parameter (Параметр) необязательный, и его значение зависит от типа пункта меню, который добавляется в строку меню. Если это пункт из встроенной системы меню Excel, то обычно этот аргумент опускается. Если вставляется пользовательский пункт меню, то этот аргумент можно использовать для передачи информации о выборе данного пункта в процедуру Visual Basic. Значение необязательного аргумента Before (Перед) определяет позицию создаваемого пункта меню в строке меню. Этот пункт меню будет вставлен перед тем пунктом строки меню, номер которого указан в данном аргументе. Если этот аргумент не задан, то новый пункт вставляется в конец строки меню. Если хотите сделать пункт меню или даже команду временной, т.е. работающими только тогда, когда отрыто приложение, для которого создается строка меню, задайте необязательный параметр Temporary как True. По умолчанию этот аргумент имеет значение False. Если необходимо добавить пункт меню в активную строку меню, то используйте свойство ActiveMenuBar коллекции commandBars, которое возвращает имя текущей строки меню. Вот пример использования этого свойства:
Обычно команды пользовательских меню должны загружать какие-либо процедуры. Как назначить элементам меню процедуры, показано в листинге 17.2. В этом листинге в строку меню Час17 добавлены пункты Файл и 17-й час. Листинг 17.2. Измененная процедура ПервоеМеню
Вам надо создать процедуру ПокажиМеня, вызываемую по команде Демонстрация. Эта процедура может содержать любой код, например, такой:
Вернитесь в рабочую книгу на Лист1 и выполните процедуру ПервоеМеню, щелкнув на командной кнопке Мое меню. Теперь строка примет вид, как на рис. 17.5.
Рис. 17.5. Теперь строка меню не пустая Щелкните на пункте меню 17-й час, а затем на команде Демонстрация. Если вы создали процедуру ПокажиМеня с приведенным мной кодом, то откроется окно сообщения. Щелкните на кнопке ОК для закрытия этого окна. Щелкните в рабочем листе на командной кнопке Стандартное меню. Восстановится стандартное меню Excel. Сохраните рабочую книгу под именем Час17. Сделаем анализ кода той части процедуры ПервоеМеню, которая отличается от кода, приведенного в листинге 17.1. Во-первых, объявлены две новые переменные-объекты:
Во-вторых, в строку меню вставлен пункт Файл. (Чтобы узнать значение Id для этого пункта, я сначала записала макрос, вставляющий этот пункт в строку меню.) Пункт Файл первый в строке меню, поэтому значение аргумента Before равно 1:
Затем в строку меню вставляется пункт 17-й час:
После этого в пункт 17-й час вставляется элемент-команда:
Для пользовательских элементов надо задать значения нескольких свойств. Прежде всего для свойства Caption, которое задает имя команды. Так как в меню будет отображаться только имя команды (т.е. только текст, без пиктограммы и комбинации клавиш, закрепленных за этой командой), то свойству Style (Стиль) присваивается значение msoButtonCaption (самый простой стиль команды). Свойство OnAction назначает процедуру, вызываемую этой командой:
Обращаю ваше внимание на один существенный момент в создании меню. Вставляете ли вы пункт в строку меню или элемент меню (команду), все равно вы работаете с коллекцией Controls (Элементы управления). Какой именно элемент этой коллекции создается (пункт меню или команда), зависит от того объекта, для которого он создается (в первом случае - это строка меню, а во втором - пункт меню). РезюмеКлючевым средством для создания меню с помощью VBA является метод Add. Для создания командной панели (строки меню), пункта меню или элемента меню (команды) везде используется метод Add. Но применяется он к разным коллекциям: к коллекции CommandBars при создании строки меню и к коллекции Controls для вставки в строку меню пунктов и команд. Вы также видели, что код создания строк меню мало отличается от кода создания панелей инструментов. Различия заключаются в использовании различных аргументов и свойств. Вопросы и ответыВопрос. При работе с панелями инструментов я использовал коллекции CommandBars и Controls. Эти же коллекции применяются и при работе со строками меню. Почему? Ответ. В Excel (или шире - в Microsoft Office) строки меню и панели инструментов - это два элемента одной коллекции CommandBars (Командные панели). В свою очередь пункты меню, элементы меню (команды) и кнопки панелей инструментов также являются членами одной коллекции Controls (Элементы управления). Если подумать, то в таком объединении разнородных, на первый взгляд, элементов есть определенный смысл: и строка меню, и панель инструментов - это всего лишь контейнеры-панели, содержащие разнообразные элементы управления. Вопрос. Как можно заблокировать какой-либо пункт меню или команду при выполнении своего приложения? Ответ. Очень просто! Положите для пункта меню или команды, которые хотите заблокировать, значение свойства Enabled равным False. И все! ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеНапишите процедуру, которая создавала бы и выводила на экран строку меню (с именем Пример17), содержащую пункты Файл, Правка и Справка. Напишите еще одну процедуру для удаления этой строки меню. На свободном рабочем листе создайте две командные кнопки, которые выполняли бы эти процедуры. Выполните и протестируйте процедуры. |
[an error occurred while processing this directive] |