- •Что такое Visual Basic for Applications
- •Автоматизация среды Excel
- •Запись простого макроса
- •Выполнение макросов
- •Просмотр кода макроса
- •Редактирование кода макроса
- •Ограниченность макросов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Назначение макросам комбинаций клавиш
- •Где хранить макросы
- •Создание личной книги макросов
- •Сохранение макросов в личной книге макросов
- •Выполнение макросов из личной книги макросов
- •Редактирование макросов в личной книге макросов
- •Удаление макросов из личной книги макросов
- •Назначение макросов командным кнопкам
- •Назначение макроса графическим изображениям
- •Назначение макросов кнопкам панелей инструментов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Введение в процесс разработки приложений
- •Кто будет использовать приложение
- •Откуда будут поступать данные для приложения
- •Где и как будут храниться данные, полученные с помощью приложения
- •Как данные будут обрабатываться приложением
- •Вид выходных данных
- •Типы элементов управления
- •Вставка элементов управления в рабочий лист
- •Форматирование элементов управления
- •Имена элементов управления
- •Экранные формы
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Модуль: дом для кода vba
- •Обзор процедур
- •Создание процедур
- •Выполнение процедуры
- •Сохранение изменений в модуле
- •Переменные
- •Типы данных
- •Объявление переменных
- •Соглашения об именах переменных
- •Массивы
- •Присвоение значений переменным
- •Использование констант
- •Область видимости переменных и констант
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Функция MsgBox
- •Функция InputBox
- •Метод InputBox
- •Именование аргументов
- •Объединение текстовых строк
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Управление выполнением приложения
- •Оператор If
- •Оператор Select Case
- •Использование встроенных диалоговых окон Excel
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Оператор For…Next
- •Оператор Do... Loop
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое объект
- •Объекты, свойства и методы
- •Объектная модель Excel
- •Пять наиболее часто используемых объектов
- •Как понимать иерархию объектной модели
- •Ссылка на объекты в коде vba
- •Работа с объектами
- •Задание свойств объекта
- •Использование методов
- •Справочная информация о свойствах и методах
- •Переменные-объекты
- •1: Sub ПримерПеремОбъекта()
- •Коллекции
- •Метод Add
- •Свойство Count
- •1: Sub КоличРабЛистов()
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Объект Application
- •Использование встроенных функций Excel
- •Свойства и методы объекта Application
- •Объект Workbook
- •Объект Worksheet
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Описание объекта Range
- •Свойства объекта Range
- •Методы объекта Range
- •Использование оператора With
- •Оператор For Each
- •Использование объекта Range
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Панели инструментов
- •Просмотр кода
- •Использование справочной системы
- •Просмотр объектов
- •Параметры редактора Visual Basic
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Тестирование и отладка как этап разработки приложений
- •Отладка
- •Режим останова
- •Использование окна Immediate
- •Просмотр значений в окне Immediate
- •Пошаговое выполнение программ
- •Наблюдение за переменными
- •Исправление ошибок
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Понятие об обработке ошибок
- •Перехват ошибок
- •Написание процедуры обработки ошибся
- •Выход из обработчика ошибок
- •Пример обработчика ошибок
- •Централизованный обработчик ошибок
- •Вопрос и ответы
- •Практикум
- •Упражнение
- •Вставка экранных форм в приложения
- •Свойства экранной формы
- •Выполнение экранной формы
- •Вставка элементов управления в экранную форму
- •Свойства элементов управления
- •Свойства командных кнопок
- •Свойства переключателей
- •Блокировка элементов управления
- •Экранные подсказки к элементам управления
- •Задание порядка обхода элементов формы
- •Назначение быстрых клавиш элементам формы
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Инициализация значений экранной формы
- •Вызов экранной формы
- •Управление поведением формы
- •Проверка вводимых данных
- •Сохранение данных, введенных в форму
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Настройка панелей инструментов
- •Создание панелей инструментов
- •Процедуры, управляющие панелями инструментов
- •Создание панели инструментов
- •Удаление панели инструментов
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Способы изменения меню
- •Программная работа с меню
- •Добавление пунктов и команд меню
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Создание диаграмм
- •Запись макроса построения диаграмм
- •Код макроса
- •Изменение кода макроса
- •Усовершенствованная процедура построения диаграмм
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Работа со сводной таблицей
- •Основы сводных таблиц
- •Запись макроса для создания сводной таблицы
- •Исследование кода макроса
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Базы данных, доступные из Excel
- •Средства доступа к внешним данным
- •Использование ms Query
- •Код записанного макроса
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое ado
- •Объекты доступа к базам данных
- •Использование ado
- •Создание ссылки на библиотеку ado
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Вставка полей в экранную форму
- •Перемещение по записям
- •Редактирование данных
- •Добавление средства поиска
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Что такое автоматизация
- •Основы автоматизации
- •Ссылка на библиотеку объектов приложения-сервера
- •Просмотр библиотеки объектов
- •Создание экземпляра приложения-сервера
- •Использование объектов Microsoft Word
- •Вопросы и ответы
- •Практикум
- •Упражнение
- •Автоматическое выполнение процедур
- •Процедуры, выполняемые при наступлении событий
- •Создание надстроек Excel
- •Упражнение
- •Приложение. Ответы Ответы к 1-му часу Тесты
- •Ответы ко 2-му часу Тесты
- •Ответы к 3-му часу Тесты
- •Ответы к 4-му часу Тесты
- •Упражнение
- •Ответы к 5-му часу Тесты
- •Упражнение
- •Ответы к 6-му часу Тесты
- •Упражнение
- •Ответы к 7-му часу Тесты
- •Упражнение
- •Ответы к 8-му часу Тесты
- •Упражнение
- •Ответы к 9-му часу Тесты
- •Упражнение
- •Ответы к 10-му часу Тесты
- •Упражнение
- •Ответы к 11-му часу Тесты
- •Упражнение
- •Ответы к 12-му часу Тесты
- •Упражнение
- •Ответы к 13-му часу Тесты
- •Упражнение
- •Ответы к 14-му часу Тесты
- •Ответы к 15-му часу Тесты
- •Упражнение
- •Ответы к 16-му часу Тесты
- •Упражнение
- •Ответы к 17-му часу Тесты
- •Упражнение
- •Ответы к 18-му часу Тесты
- •Упражнение
- •Ответы к 19-му часу Тесты
- •Упражнение
- •Ответы к 20-му часу Тесты
- •Упражнение
- •Ответы к 21-му часу Тесты
- •Упражнение
- •Ответы к 22-му часу Тесты
- •Упражнение
- •Ответы к 23-му часу Тесты
- •Упражнение
- •Ответы к 24-му часу Тесты
- •Упражнение
Добавление пунктов и команд меню
Чтобы добавить в строку меню пункты меню и команды, применяется метод 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 для вставки в строку меню пунктов и команд. Вы также видели, что код создания строк меню мало отличается от кода создания панелей инструментов. Различия заключаются в использовании различных аргументов и свойств.