Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2702
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Программирование объектов интегрированной среды MS Office 193

В этот момент панель появится на экране, однако она пока что пуста. Чтобы поместить на нее кнопку Открыть, необходимо вызвать метод Add, принадлежащий семейству Controls этой па-

нели, то есть, в данном случае, объектной переменной MyCBar. Чтобы затем можно было обратиться к свойствам этой кнопки, одновременно следует присвоить ее в качестве значения заранее объявленной объектной переменной MyCon:

Set MyCon = MyCBar.Controls.Add(Type:=msoControlButton, ID:=23)

Теперь можно обращаться к кнопке на панели инструментов при помощи переменной MyCon. Например, назначим для этой кнопки рисунок, соответствующий кнопке Открыть:

MyCon.FaceId = 23

Панель Моя панель инструментов стала теперь равноправной панелью инструментов приложения (рис. 8.3). Как и любую другую панель, ее можно вывести на экран или же отключить. Чтобы убедиться в этом, достаточно раскрыть меню Вид | Панели инструментов (рис. 8.4).

Рис. 8.3. Кнопка Открыть с соответст-

Рис. 8.4. Созданная макросом VBA пользовательская

вующим рисунком на своей поверхности

панель инструментов ничем не отличается от осталь-

помещена на вновь созданную пользова-

ных панелей инструментов приложения

тельскую панель инструментов

 

Создание новой кнопки

Впрочем, стандартные кнопки панелей Office мало, где могут пригодиться. Гораздо интересней другая задача: как снабдить существующую или новую панель совершенно новой кнопкой (или иным элементом управления), которая приводила бы в действие пользовательский макрос, то есть выполняла бы совершенно новую, созданную специально для решения какой-то задачи, пользовательскую команду. Предположим, требуется обеспечить для пользователя возможность запуска макроса с именем MySub. Для иллюстрации этого принципа используем простейшую процедуру, которая всего лишь выводит на экран сообщение:

Sub MySub()

MsgBox "Выполнен пользовательский макрос"

End Sub

194 Глава 8. VBA-программирование: примеры и иллюстрации

Для того чтобы связать процедуру MySub с кнопкой на панели инструментов, необходимо вначале такую кнопку создать. Для этого следует объявить объектную переменную типа

CommandBarButton:

Dim MyCBut As CommandBarButton

Предположим, что эту кнопку надо поместить на панель инструментов Стандартная. В этом случае необходимо воспользоваться методом Add, принадлежащим семейству Controls именно этой панели (обратиться к панели Стандартная можно, как к элементу семейства, используя оригинальное имя панели — “Standard”):

Set MyCBut = _

CommandBars("Standard").Controls.Add(Type:=msoControlButton)

Параметр Type определяет тип добавляемого элемента управления, при этом значение msoControlButton соответствует обычной кнопке.

После того, как кнопка создана, хотя и не появилась еще на панели Стандартная, можно выполнить с ней необходимые преобразования, используя свойства переменной MyCBut:

With MyCBut

.Style = msoButtonCaption

.OnAction = "MySub"

.Caption = "Мой Макрос" End With

Задавая для свойства Style значение msoButtonCaption, можно определить тип кнопки

— “кнопка с надписью” (возможны также варианты “кнопка с рисунком” и “кнопка с надписью и рисунком”). Строка, загруженная в свойство OnAction, представляет собой имя макроса MySub, который теперь подлежит выполнению по щелчку на новой кнопке. Чтобы назначение кнопки было понятным без объяснений, снабдим ее надписью “Мой Макрос” (свойство Caption). Наконец, остается сделать кнопку видимой:

MyCBut.Visible = True

Рис. 8.5. На панели инструментов Стандарт-

Рис. 8.6. Новая кнопка на панели инструментов

ная появилась новая кнопка, служащая для за-

Стандартная сработала, запустив пользова-

пуска пользовательского макроса

тельский макрос

В результате кнопка Мой Макрос, готовая к действию, появится на панели инструментов

Стандартная (рис. 8.5).

Чтобы убедиться в работоспособности кнопки, достаточно щелкнуть на ней мышью и на экране появится окно-сообщение, показанное на рис. 8.6, и являющееся результатом выполнения мак-

роса MySub.

Создание пользовательского меню

Как уже отмечалось, меню и подменю интегрированной среды Office представляют собой такие же, в сущности, объекты, что и панели инструментов. Давайте посмотрим, каким образом можно создать целое меню и добавить его в строку главного меню приложения.

Программирование объектов интегрированной среды MS Office 195

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

Команда1 и Команда2:

Sub Команда1()

MsgBox "Выполнена команда 1" End Sub

Sub Команда2()

MsgBox "Выполнена команда 2"

End Sub

Чтобы получить доступ к строке меню текущего приложения, потребуется переменная типа CommandBar, а для выполнения действий с этим меню — две переменные типа CommandBarControl. Одна из них будет представлять новое меню, а вторая — команды в нем:

Dim MyCBar As CommandBar

Dim MyCon As CommandBarControl

Dim MyMenu As CommandBarControl

Чтобы переменная MyCBar представляла строку меню текущего приложения, достаточно выполнить присваивание:

Set MyCBar = CommandBars.ActiveMenuBar

Теперь все меню содержатся в семействе Controls переменной MyCBar, и, чтобы добавить туда еще одно меню, следует вызвать метод Add:

Set MyMenu = _

MyCBar.Controls.Add(Type:=msoControlPopup, Temporary:=True)

Параметр Type задает тип элемента управления — Раскрывающееся меню, а при помощи параметра Temporary меню становится временным — после закрытия окна приложения оно исчезнет из строки меню. При Temporary = True меню останется в строке также и при последующих сеансах работы с приложением.

Далее создадим надпись на меню:

MyMenu.Caption = "Мое меню"

Пока что меню пусто, в нем не содержится ни одной команды. Чтобы исправить положение, воспользуемся второй переменной CommandBarControl и методом Add семейства элементов управления меню, то есть семейства Controls переменной MyMenu. Может показаться странным, что само меню в целом, и каждая команда в нем в отдельности, представлены переменными одного и того же типа. Но на самом деле это вполне логично — каждая команда в меню может содержать в себе подменю — точно такое же меню, каждая команда в котором может... и так далее.

Set MyCon = _

MyMenu.CommandBar.Controls.Add(Type:=msoControlButton, ID:=1)

Параметр ID задает идентификатор команды — ее порядковый номер в меню, по которому к ней можно будет впоследствии обращаться.

В результате выполнения этого оператора переменная MyCon становится “временным представителем” новой команды, добавленной в новое меню Ìîå ìåíþ, которое, в свою очередь, представлено переменной MyMenu. Воспользуемся этим моментом и настроим команду меню соответствующим образом:

196 Глава 8. VBA-программирование: примеры и иллюстрации

With MyCon

.Caption = "Мое меню 1"

.TooltipText = "Мое меню 1"

.Style = msoButtonCaption

.OnAction = "Команда1" End With

При помощи свойства Caption задается надпись элемента меню. Свойство Style определяет тип этого элемента управления. А значение свойства OnAction назначает команде макрос, который будет выполняться при выборе данного пункта меню.

Чтобы создать вторую команду в новом меню, снова воспользуемся переменной MyCon, которая теперь потеряет связь с созданным и настроенным уже первым пунктом, и станет представителем второго пункта меню:

Set MyCon = _

MyMenu.CommandBar.Controls.Add(Type:=msoControlButton, ID:=2)

Настроим вторую команду меню аналогичным образом, изменим лишь надпись и текст подсказки (свойство TooltipText), а для свойства OnAction укажем имя другого макроса:

With MyCon

.Caption = "Мое меню 2"

.TooltipText = "Мое меню 2"

.Style = msoButtonCaption

.OnAction = "Команда2" End With

В результате выполнения описанного выше кода в строке главного меню приложения появится новое меню, в котором содержатся две команды (рис. 8.7).

Рис. 8.7. В строке главного меню приложения

Рис. 8.8. Выполнена одна из команд пользова-

появилось пользовательское меню, содержащее

тельского меню

в себе две команды

 

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

Добавление пользовательской команды в стандартное меню приложения MS Office

Сходным образом можно встроить собственную пользовательскую команду в одно из существующих меню приложения. Чтобы получить доступ к одному из меню в строке главного меню, необходимо обратиться все к тому же семейству Controls, однако, не добавляя новый элемент при помощи метода Add, а просто указывая порядковый номер одного из существующих элементов. Предположим, требуется встроить свою команду или подменю в меню Ôàéë. Для этого надо, во-первых, получить в свою объектную переменную ссылку на строку меню текущего приложения,…

Set MyCBar = CommandBars.ActiveMenuBar

Программирование объектов интегрированной среды MS Office 197

а во-вторых, в переменную типа CommandBarControl загрузить требуемый элемент строки: меню Ôàéë первое по счету, и поэтому к нему можно обратиться, как к элементу с номером 1:

Set MyMenu = MyCBar.Controls(1)

Теперь переменная MyMenu указывает на меню Ôàéë, и все команды этого меню доступны посредством ее семейства Controls. Чтобы добавить туда еще одну команду, следует воспользоваться методом Add этого семейства и еще одной объектной переменной типа

CommandBarControl (предполагается, что все упомянутые переменные уже объявлены, как это было сделано в предыдущем примере):

Set MyCon = _

MyMenu.CommandBar.Controls.Add(Type:=msoControlButton, ID:=1)

Далее остается настроить свойства новой команды соответствующим образом. Пусть команда называется Моя команда и пусть при выборе ее выполняется макрос с именем МойМакрос1:

Рис. 8.9. Пользовательская команда Моя команда, запускающая макрос МойМакрос1, добавлена в меню Файл

With MyCon

.Caption = "Моя команда"

.TooltipText = "Моя команда"

.Style = msoButtonCaption

.OnAction = "МойМакрос1" End With

На рис. 8.9 показано меню Ôàéë с новой командой.

Программирование помощника Office

Каждый, кто пользовался пакетом MS Office, так или иначе сталкивался с помощником — забавным мультипликационным персонажем, который дает советы, помогает найти нужную справку, а иногда просто развлекает пользователя. Скрепыш и Колобок, Ô1 и Мурка — существует целый ряд “актеров” в роли помощника, при этом каждый обладает своими забавными особенностями. Как и любой объект MS Office, поведене помощника можно запрограммировать при помощи

198 Глава 8. VBA-программирование: примеры и иллюстрации

VBA. Если, при разработке какого-нибудь макроса, необходимо обеспечить пользователю возможность получения справки или просто дать подсказку, то наилучший способ сделать это заключается в использовании объекта Assistant, то есть помощника Office.

Объект Assistant

Каким образом должен запускаться программный код, обращающийся к объекту Assistant? Существует несколько возможностей. Например, такой макрос можно привязать к существующей команде меню или добавить для него в меню специальную команду. Можно запускать такую процедуру при помощи кнопки на панели инструментов.

Обработка ошибок с использованием оператора On Error GoTo

Если в макросе предусмотрена обработка ошибок, то для ошибок пользователя можно предусмотреть специальный код, использующий помощника для выдачи сообщений или подсказок. Чтобы сделать это, следует использовать оператор On Error GoTo. Условный пример его использования покзан на листинге 8.1.

ЛИСТИНГ 8.1

Sub MySub()

On Error GoTo MyError1

…код макроса

Exit Sub

MyError1:

…код обработки ошибки

End Sub

Оператор On Error GoTo помещают в самое начало процедуры, то есть туда, где никаких ошибок быть еще не может. В качестве параметра указывают метку перехода по ошибке — сама метка, сопровождаемая двоеточием, должна при этом находиться в том месте кода, куда VBA передаст управления в случае возникновения какой-нибудь ошибки. Чтобы этот код не выполнялся всегда, его обычно размещают в конце процедуры, после всего полезного кода макроса, и предваряют его оператором Exit Sub, который принудительно завершает выполнение процедуры. Таким образом, при нормальном выполнении макроса код обработки ошибок никогда не получит управление. Но если возникнет ошибка, этот код сразу же “сработает”.

Создание пользовательской Справки

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

Создание кнопки Справка на рабочем листе Excel, полагаем, не вызовет у читателя никаких затруднений, поэтому сосредоточимся на коде VBA, который запрограммирует помощника на выдачу справок-подсказок по заполнению бланка заказа.

см. подробнее в гл. 1 раздел “Как поместить на лист элемент управления”.

Объект Assistant уникален, он не является элементом какого-либо семейства и в равной мере принадлежит всем приложениям Office. По этой причине не требуется никаких специальных переменных или ссылок для его использования — в любом макросе VBA, о каком бы приложении и объекте ни шла речь, можно вставить следующий оператор: …

Assistant.Visible = True

Программирование объектов интегрированной среды MS Office 199

… и помощник Office (в том обличье, на которое он настроен пользователем), появится на экране.

Рис. 8.10. Помощник Office в исполнении Мурки

Переменная типа Balloon

Чтобы “научить” Мурку выдавать подсказки пользователю по конкретной теме “заполнение бланка заказа”, нам потребуются всего две переменные:

Dim MyBal As Balloon

Dim UserChoice As Integer

Переменная типа Balloon представляет окна сообщений (“баллоны”) помощника, а смысл целочисленной переменной UserChoice будет раскрыт дальше.

Свойство Visible

Итак, последовательно пройдем все фазы работы помощника. Вначале, чтобы сделать помощника видимым, присвоим значение True его свойству Visible:

Assistant.Visible = True

Свойство Animation

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

Assistant.Animation = msoAnimationGreeting

Каждый из помощников по-своему разыгрывает сценку приветствия — Мурка, например, выпрыгивает из небольшого окошка на краю экрана.

Метод NewBalloon

Далее необходимо создать окно сообщения помощника — объект типа Balloon. Не существует семейства Balloons, хотя объектов Balloon можно создать много и использовать их все одновременно. Новый объект такого типа создается при помощи метода NewBalloon помощника

Office:

Set MyBal = Assistant.NewBalloon

Свойства Heading и Text

Теперь необходимо настроить Balloon-объект так, как требуется. Вначале, при помощи свойств Heading и Text зададим заголовок окна сообщения и непосредственно текст сообщения:

MyBal.Heading = "Инструкции по заполнению бланка заказа" MyBal.Text = "Вы хотите узнать:"

Свойство Button

Свойство Button определяет набор кнопок в окне сообщения, константа msoButtonSetOkCancel при этом соответствует набору ”OK и Отмена”:

200 Глава 8. VBA-программирование: примеры и иллюстрации

MyBal.Button = msoButtonSetOkCancel

Свойство Labels

Для того чтобы пользователь мог выбрать одну из тем предлагаемой справки, используют свойство Labels:

MyBal.Labels(1).Text = "Как заполнить бланк заказа?" MyBal.Labels(2).Text = "Почему выбранный процессор " + _

"или материнская плата не остаются выбранными?" MyBal.Labels(3).Text = "Как отпечатать счет?"

ПРИМЕЧАНИЕ

При наборе строковых значений в окне редактора Visual Basic можно ввести сколь угодно длинную строку. Однако часто, чтобы вся строка была видна на экране полностью, строку, как уже отмечалось, разбивают при помощи пробела и знака подчеркивания. В случае строковых констант дело осложняется тем, что текстовые строки разбивать подобным образом нельзя — редактор Visual Basic такое значение “не поймет”. В подобных случаях одну строку представляют как объединение нескольких строковых констант, которые, затем, разбивают при помощи пробела и знака подчеркивания. Строковые значения в языке Visual Basic объединяются при помощи знака + или

&.

Метод Show

В результате окно сообщения помощника будет снабжено тремя надписями, причем щелчком на любой из них пользователь закроет окно сообщения, а объект MyBal вернет номер надписи, на которой щелкнул пользователь. Чтобы не потерять это значение, при выводе на экран Balloon- объекта посредством метода Show следует сохранить возвращаемое число в целочисленной переменной:

UserChoice = MyBal.Show

После выполнения этого оператора над помощником появится окно сообщения, как показано на рис. 8.11.

Рис. 8.11. Помощник Office вездесущ. Если код макроса выполняется в окне редактора Visual Basic, то помощник со своим сообщением появится прямо над текстом макроса

Программирование объектов интегрированной среды MS Office 201

Реакция помощника на выбор пользователя

Далее можно изобразить “бурную деятельность” помощника изменив свойство Animation, присвоением новой константы:

Assistant.Animation = msoAnimationCheckingSomething

Анимация сценки msoAnimationCheckingSomething выглядит по-разному у разных помощников. Мурка, например, надевает очки, берет блокнот и карандаш, и начинает что-то сосредоточенно читать. В этот момент на экране настанет пора появиться следующему окну сообщения. Поскольку это должно быть одно из трех окон, соответствующее одному из трех выбранных вопросов, необходимо вначале определить — какое именно сообщение должно появиться на экране. Это нетрудно сделать, проанализировав при помощи конструкции Select Case число, содержащееся в переменной UserChoice:

Select Case UserChoice

Case 1

...

Case 2

...

Case 3

...

End Select

см. также в приложении раздел “Конструкция Select Case … End Select”.

Чтобы задать параметры окна сообщения, то есть Balloon-объекта, для каждого из трех случаев, можно воспользоваться той же самой переменной MyBal и методом NewBalloon объекта Assistant. Необходимо загрузить соответствующие строковые значения в свойства Heading (заголовок) и Text (собственно текст сообщения). Затем созданный и настроенный Balloon- объект необходимо отобразить на экране вызовом метода Show.

Необходимо заметить, что созданные Balloon-объекты продолжают существовать, пока соответствующей объектной переменной не присвоено другое значение. Если бы было использовано несколько переменных типа Balloon, и использованы для создания следующих окон другие переменные, “не трогая” переменную MyBal, то первоначальное окно сообщения можно было бы вновь, в любой момент отобразить на экране при помощи метода Show. Но в этом нет необходимости. В данном случае используем только одну переменную MyBal.

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

202 Глава 8. VBA-программирование: примеры и иллюстрации

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

Select Case UserChoice Case 1

Set MyBal = Assistant.NewBalloon MyBal.Text = "Необходимо выбрать в " + _

"раскрывающихся списках компоненты " + _ "компьютера. Общая цена изделия при " + _ "этом отображается в нижней строке."

MyBal.Heading = "Заполнение бланка заказа" MyBal.Show

Case 2

Set MyBal = Assistant.NewBalloon

MyBal.Text = "Некоторые материнские платы " + _ "несовместимы с некоторыми процессорами. " + _ "Такие сочетания недопустимы."

MyBal.Heading = "Несовместимость компонентов" MyBal.Show

Case 3

Set MyBal = Assistant.NewBalloon

MyBal.Text = "Для того чтобы отпечатать счет, " + _ "следует вначале убедиться, что " + _ "выбранная в бланке конфигурация " + _ "компьютера и его цена соответствуют " + _ " вашим намерениям. " + _ "Затем следует щелкнуть на кнопке Счет."

MyBal.Heading = "Печать счета" MyBal.Show

End Select

В результате над Муркой, усердно ищущей справку в блокноте, появится выбранная справка, как изображено на рис. 8.12.

Последней строкой кода рассматриваемого примера будет строка, убирающая помощника с экрана (до ее выполнения очередь не дойдет до тех пор, пока пользователь не щелкнет на кнопке OK в окне сообщения помощника):

Assistant.Visible = False

Форматирование объектов приложений MS Office

Форматирование документов, и вообще — объектов приложений MS Office, представляет собой весьма обширную область VBA-программирования. В основном, форматирование сводится просто к настройке определенных свойств тех или иных объектов, но число этих свойств и объектов огромно. Однако нет причин отчаиваться — при всем своем многообразии, объекты MS Office образуют собой весьма стройную и логичную систему, причем, это особенно верно в той части, что касается форматирования.

Например, любой объект, обладающий свойством Font, позволяет настроить свойства шрифта, который в этом объекте используется. Идет ли речь о символе, слове или абзаце в документе Word, текстовом значении в ячейке Excel или надписи на форме Access — в любом случае свойство объект.Font.Size позволит задать размер шрифта, а присваивание объект.Font.Bold = True сделает шрифт полужирным.

Соседние файлы в папке Книги