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

2 семестр / vba_2002

.pdf
Скачиваний:
97
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Сброс встроенной панели инструментов

Выберите встроенную панель инструментов из списка и щелкните на кнопке Сброс. Панель инструментов будет восстановлена в первоначальное состояние. Если на панель инструментов ранее добавлены дополнительные инструменты, то они будут удалены. Если удалены все инструменты, принятые по умолчанию, то они будут заново размещены на панели инструментов. Кнопка Сброс недоступна, пока выделена пользовательская панель инструментов.

Перемещение и копирование элементов управления

Когда Excel находится в режиме модификации командных панелей (т.е., открыто диалоговое окно Настройка), можно копировать элементы управления между всеми видимыми панелями инструментов. Для того чтобы переместить элемент управления, перетащите его на новое место. Это может быть текущая или другая панель инструментов. Чтобы скопировать элемент управления, необходимо удерживать клавишу <Ctrl> в процессе перетаскивания элемента управления. Кроме того, элементы управления можно копировать в пределах одной панели инструментов.

Вставка нового элемента управления

Чтобы добавить новый элемент управления на панель инструментов, воспользуйтесь вкладкой Команды диалогового окна Настройка (рис 22.3).

Рис. 22.3. Вкладка Команды содержит список всех доступныхвстроенныхэлементовуправления

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

Добавление на панель инструментов кнопки для макроса

Вы можете создать на панели управления новую кнопку, к которой будет присоединен макрос. Для этого активизируйте вкладку Команды диалогового окна Настройка и выберите Макросы из списка Категории. Перетащите команду Настраиваемая кнопка на панель инструментов (по умолчанию на этой кнопке изображена улыбающаяся рожица).

После добавления кнопки щелкните на ней правой кнопкой мыши и выберите необходи мый параметр из появившегося контекстного меню, показанного на рис. 22.4. Измените название кнопки, укажите необходимый макрос и измените изображение.

ЧастьVI.Разработкаприложений

56!'

Выбор команды Выбрать значок для кнопки из контекстного меню приводит к отображению меню из 42 изображений. Это небольшая часть библиотеки изображений, которые можно использовать. Дополнительная информация приводится в разделе "Изменение изображения на кнопках панели инструментов",

ic.22.4.Модификациякнопкинапанелиинструментов

Распространениепанелейинструментов

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

Добавление панели инструментов в рабочую книгу

Для того чтобы сохранить панель инструментов в файле рабочей книги, выберите команду Вид^Панели инструментов^Настройка — будет отображено диалоговое окно Настройка. Щелкните на кнопке Вложить, чтобы открыть диалоговое окно Управление панелями инструментов, которое показано на рис. 22.5. Это диалоговое окно включает список всех пользовательских панелей шструментов, находящихся в коллекции Toolbars, показанной в списке слева. Панели инструментов, которые уже хранятся в рабочей книге, отображаются в списке справа.

Чтобы присоединить панель инструментов, выберите ее и щелкните на кнопке Копировать. Когда панель инструментов выделена в правом списке, кнопка Копировать преобразуется в Удалить. На этой кнопке можно щелкнуть дня удаления панели инструментов из рабочей книги.

570

Глава 22. Создание собственных панелей инструментов

Рис.22.5.ДиалоговоеокноУправлениепанелями

инструментов

Странно, но не существует способа добавлять или удалять панели инструментов из рабочих книг с помощью кода VBA. Эти операции должны выполняться вручную.

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

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

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

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

Приведем типичный сценарий: создается приложение, в котором применяется пользовательская панель инструментов. Кнопки на этой панели инструментов запускают процедуры VBA в рабочей книге приложения. Панель инструментов присоединяется к рабочей книге приложения, и рабочая книга сохраняется. После этого на основе рабочей книги создается надстройка. Версия XLS этого приложения закрывается, надстройка устанавливается, а при щелчке на кнопке панели управления надстройки открывается рабочая книга из файла XLS!

Предполагалось, конечно, что кнопки панели инструментов будут запускать процедуры из надстройки, а не файла XLS, который служил основой для надстройки. Но при добавлении панели инструментов к рабочей книге панель инструментов добавляется в своем текущем виде, а в этом виде на панели инструментов используются ссылки на макросы в рабочей книге файла XLS. Следовательно, щелчок на кнопке приводит к открытию файла XLS, что необходимо для запуска хранящегося в нем макроса. Можно вручную (или с помощью кода VBA) изменить свойство OnAction каждой кнопки панели инструментов, чтобы она ссылалась на код надстройки, а не на код, хранящийся в файле XLS. Однако рекомендуется создать код, который будет создавать панель инструментов "на лету", пока происходит открытие надстройки. Такая задача рассматривается далее в этой главе.

Часть VI. Разработка приложений

571

Управление коллекцией CommandBars

Коллекция CommandBars, которая содержится в объекте A p p l i c a t i o n , представляет все объекты CommandBar. Каждый объект CommandBar содержит коллекцию объектов C o n t r o l . Все эти объекты имеют свойства и методы, которые можно использовать в процедурах языка VBA.

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

Командными панелями Excel (в число которых входят и панели управления) можно управлять с помощью объектов, входящих в состав коллекции CommandBars. 'Эта коллекция содержит следующие элементы.

54 встроенных панели инструментов Excel.

Все пользовательские панели инструментов.

Встроенная строка меню листа. Эта строка отображается, когда активен рабочий лист.

Встроенная строка меню диаграммы. Эта строка отображается, когда активен лист диаграммы.

Все создаваемые строки меню.

Все 58 контекстных меню, которые интегрированы в Excel.

Новые панели инструментов в Excel 2002

Если вы перешли к Excel 2002 от старой версии Excel, то должны познакомиться с несколькими новыми панелями инструментов, которых не было в старой версии. В Excel 2002 представлено несколько ноаых панелей инструментов, которых не было в Excel 2000:

Граница;

Диаграмма; Собрание по сети; Защита;

Список полей сводной таблицы; Организационная диаграмма; Буфер обмана; Область задач; Текст в речь.

Вы, возможно, удивитесь, но Область задач — это на самом деле панель инструментов (весьма нестандартная). Она содержит всего один элемент управления.

Типы командных панелей

Как отмечалось в самом начале этой главы, существует три типа командных панелей, каждый из которых отличается значением свойства Туре. Возможные значения этого свойства коллекции CommandBars перечислены в следующей таблице. VBA имеет встроенные константы, которые используются для указания типа командной панели.

Тип

Описание

Константа

0

Панель инструментов

msoBarTypeNormal

1

Строка меню

msoBarTypeMenuBar

2

Контекстное меню

msoBarTypePopup

572

Глава 22. Создание собственныхпанелейинструментов

Просмотр списка объектов CommandBar

Если вы решили получить информацию о содержимом коллекции CommandBars, то следующая процедура окажется весьма полезной. Ее запуск приведет к созданию списка (рис. 22,6), который содержит все объекты CommandBar, входящие в коллекцию CommandBars. Для Excel 2002 этот список будет состоять из 114 встроенных командных панелей и всех командных панелей, определенных, пользователем. Для каждой командной панели процедура указывает значения свойств Index, Type и Name (свойство Туре отображается в виде Панель инструментов, Строка меню или Контекстное меню). Кроме того, указывается, какая из командных панелей является встроенной.

Рис22.6. Код VBA создает такой список объектов CommandBar

Sub ShowConimandBarNames {)

Dim Row As Integer

Dim cbar As CommandBar

Cells.Clear

Row = 1

For Each cbar In CommandBars

Cells(Row, 1} = cbar.Index

Cells{Row, 2) = cbar.Name

Select Case cbar.Type

Case msoBarTypeNormal

Cells(Row, 3) = "Toolbar"

Case msoBarTypeMenuBar

Cells(Row, 3) = "Menu Bar"

Case msoBarTypePopUp

Cells{Row, 3)

= "Shortcut"

End Select

 

Cells(Row, 4) = cbar.Builtln

Row = Row + 1

 

Next cbar

 

End Sub

 

Часть VI. Разработка приложений

573

При работе с панелями инструментов можно включить запись макросов, чтобы получить представление о том, что происходит, в терминах VBA. Большинство (но не все) действий, предпринимаемых для изменения панелей инструментов, приводят к генерации кода VBA. Рассматривая записанный код, легко понять, как устроена объектная модель панелей инструментов. Вскоре вы убедитесь, что объектная модель панелей инструментов достаточно проста и легка для понимания.

Создание командной панели

В VBA командная панель создается с помощью метода Add коллекции CommandBars. Представленный далее оператор создает новую панель инструментов, которая имеет имя, принятое по умолчанию (Custom 1):

CommandBars.Add

Созданная панель инструментов не содержит элементов управления, кроме того, пользователь не видит ее (свойство V i s i b l e установлено в значение F a l s e ) .

Зачастую при создании панели инструментов возникает необходимость установить некоторые ее свойства. Следующий пример демонстрирует один из способов выполнить данную задачу.

Sub CreateAToolbar()

Dim TBar As CommandBar

Set TBar = CommandBars.Add With TBar

-Name = "MyToolbar" ,Top = 0

.Left = 0

.Visible = True End With

End Sub

Процедура CreateToolbar использует метод Add коллекции CommandEars для добавления новой панели инструментов и создает переменную Tbar, которая представляет созданную панель инструментов. Следующие инструкции назначают панели инструментов имя, располагают ее в верхнем левом углу экрана и делают видимой. Свойства Тор и Left указывают расположение панели инструментов, задавая координаты на экране, а не в окне программы Excel.

При получении доступа к коллекции CommandBars из модуля кода диалогового окна UserForin или объектов ThisWorkbook, Sheet, chart необходимо добавлять к ссылкам объект Application . Например:

Application.CommandBars.Add

Если код находится в модуле кода VBA общего назначения, то задавать ссылки не обязательно.

Ссылки на командные панели

На определенный объект CommandBar можно ссылаться с помощью значения свойства i n d e x или свойства Name. Например, панель инструментов Standard (Стандартная) имеет свойство Index, установленное в значение 3. Это позволяет ссылаться на эту панель инструментов с помощью таких операторов:

CommandBars(3) CommandBars("Standard")

574

Глава 22. Создание собственных панелей инструментов

Если для обращения к панели инструментов используется имя, то помните о регистре символов. Другими словами, можно одновременно использовать для разных панелей инструментов такие имена, как S t a n d a r d , s t a n d a r d и STANDARD.

В разных версиях Excel панели инструментов имеют различные значения свойства index (нумерация индексов панелей не сохраняется). Например, в Excel 2002 панель инструментов 3-0 Settings {Настройка объема) имеет свойство index, установленное в значение 56. А в Excel 2000 значение 53 свойства index, соответствует панели инструментов WordArt. Если приложение должно работать с различными версиями Excel, то необходимо использовать свойство Name, а не index.

Удаление командныхпанелей

Для того чтобы удалить панель инструментов, определенную пользователем, необходимо сослаться на объект с помощью индекса (если он известен) или имени. Следующий оператор удаляет панель инструментов, которая называется MyToolbar:

CommandBars ("MyToolbar"} .Delete

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

On Error Resume Next CommandBars("MyToolbar").Delete On Error GoTo 0

Еше один подход заключается в создании собственной функции, которая определяет наличие определенной панели инструментов в коллекции CommandBars. Представленная далее функция принимает в качестве параметра имя объекта CommandBar (который потенциально существует) и возвращает значение True, если эта командная панель присутствует. Такая функция циклически просматривает элементы коллекции CommandBars и завершает свою работу после того, как будет найдено имя, указанное в виде параметра.

Function CoimandBarExists (n) As Boolean Dim cb Aa CommandBar

For Each cb In CammandBars

If UCase(cb.Name) - UCase(n) Then CorranandBarExis ts = True

Exit Function End If

Next cb

CommandBarExists = False End Function

Свойства командных панелей

Ниже приведены наиболее полезные свойства объекта CommandBar.

Builtln — предназначено только для чтения. Имеет значение True, если объект является одной из встроенных в Excel командных панелей.

Left — координаты на экране левого края командной панели (в пикселях).

ЧастьVI.Разработкаприложений

575

Name — отображаемое имя командной панели.

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

«msoBarLef t — командная панель прикреплена к левой границе окна.

msoBarTop — командная панель прикреплена к верхней границе окна.

msoBarRight — командная панель прикреплена к правой границе окна.

msoBarBottom — командная панель прикреплена к нижней границе окна.

msoBarFloating — командная панель ни к чему не прикреплена.

msoBarPopup — командная панель является контекстным меню.

Protection — целое число, которое указывает тип защиты командной панели. Это свойство может иметь следующие значения.

msoBarNoProtection — (значение по умолчанию) защита не применяется. Командная панель может изменяться пользователем.

msoBarNoCustomize — командная панель не может изменяться.

msoBarNoResize — не может изменяться размер командной панели.

msoBarNoMove — командная панель не может перемещаться.

msoBarNoChangeVisible — пользователь не может изменить состояние видимости этой командной панели.

msoBarNoChangeDock — пользователь не может прикрепить панель в другом положении.

msoBarNoVerticalDock — командная панель не может быть прикреплена к правом)1 или левому краю окна,

msoBarNoHorizonCalDock — командная панель не может быть прикреплена к верхнему йЯн нижнему краю окна.

Тор — задает вертикальную позицию командной панели (в пикселях).

Туре — содержит целое число, которое представляет тип командной панели. Это свойство может иметь следующие значения.

msoBarTypeNormal — панель инструментов.

msoBarTypeMenuBar — строка меню.

msoBarTypePopUp — контекстное меню.

Visible — свойство имеет значение True для отображаемых командных панелей. Примеры кода VBA, которые приводятся в следующем разделе, демонстрируют исполь-

зование некоторых свойство командных панелей.

Подсчет пользовательских панелей инструментов

Следующая функция возвращает количество панелей инструментов, которые определены пользователем. Эта функция в цикле перебирает элементы коллекции CommandBars и увеличивает значение счетчика на единицу каждый раз, когда элемент коллекции является панелью инструментов и его свойство Built Гц не установлено в значение True.

Function CustomToolbars() Dim cb As CoimandBar

576

Глава 22. Создание собственных панелей инструментов

Dim Count As Integer

Count = 0

For Each cb In CommandBars

If cb.Type = msoBarTypeNormal Then

If Not cb.Builtln Then

Count = Count + 1

End If

End If

Next cb

CustomToolbars = Count

End Function

Запрет изменения панели инструментов

Свойство P r o t e c t i o n объекта CommandBar предоставляет ряд возможностей для защиты панели инструментов. Приведенный ниже оператор устанавливает свойство P r o t e c t i o n панели инструментов MyToolbar:

CommandBars("MyToolbar") . Protection = msoBarNoCustomize

После выполнения этого оператора пользователь не сможет модифицировать панель инструментов.

Константы, которые используются в качестве значений свойства P r o t e c t i o n , являются аддитивными, что означает одновременное суммирование различных степеней зашиты. Например, следующий оператор запрещает модификацию н перемещение панели инструментов MyToolbar:

Set cb = CommandBars("MyToolbar")

cb.Protection = msoBarNoCustomize + msoBarNoMove

Создание "автоматической" панели инструментов

Некоторые встроенные панели инструментов Excel обладают определенным "уровнем интеллекта" (как может показаться). Они появляются при возникновении конкретного объекта и исчезают при его скрытии. Например, панель инструментов Chart (Диаграммы) обычно отображается только тогда, когда ведется работа над диаграммой. Как только работа с диаграммой завершена, панель инструментов исчезает. Одно время Microsoft называла это поведение

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

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

Зачастую возникает необходимость программирования чувствительности панелей в соб ственном приложении. Например, может понадобиться сделать панель инструментов видимой только тогда, когда активными становятся определенные рабочие листы или ячейки в диапазоне. Благодаря поддержке событий в программной модели Excel такое программирование осуществить достаточно просто.

Процедура, представленная в листинге 22.1, создает панель инструментов при открытии

рабочей книги. Событие S e l e c l i o n C h a n g e рабочей книги используется для

определения

принадлежности активной ячейки диапазону ToolbarRancje. Если это так. то панель инст-

рументов отображается на экране. В противном случае панель инструментов скрывается.

Часть VI. Разработка приложений

577

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

Процедура, называемая WorkbookjDpen, создает простую панель инструментов с именем Autosense. Четыре кнопки на панели инструментов, настроенные для вызова процедур, называются Buttonl, Button2, Button3 и Button4. Обратите внимание, что перед созданием панели инструментов программно удаляется одноименная панель инструментов (если такая существует).

Листинг 22.1. Пользовательская панель инструментов, отображаемая только при активности ячейки определенного диапазона

Sub

CreateToolbar()

'

Создание

демонстрационной панели инструментов AutoSense

 

Dim AutoSense As CommandBar

 

Dim Button As CommandBarButton

 

Dim i As

Integer

1

Удаление

существующей односменной панели инструментов

 

On Error Resume Next

 

CoxranandBars!"AutoSense").Delete

 

On Error GoTo 0

'

Создание

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

 

Set AutoSense - CommandBars.Add

 

For i = 1 To 4

 

Set Button = AutoSense.Controls.Add{msoControlButton)

 

With

Button

 

.OnAction = "Button" & i

 

.Faceld = i + 37

 

End With

 

Next i

 

 

AutoSense.Name = "AutoSense"

End Sub

 

Процедура обработки события SelectionChange (которая расположена в модуле кола рабочего листа sheetl) выглядит следующим образом:

Private Sub Worksheet_SelectionChange(ByVal Target As _ Excel.Range)

If Union(Target, Range("ToolbarRange")}.Address = _ Range("ToolbarRange").Address Then

CommandBars("AutoSense").Visible = True

Else

ComnandBars("AutoSense").visible = False End If

End Sub

Эта процедура проверяет адрес активной ячейки. Если такая ячейка находится в указанном диапазоне, который называется ToolbarRange, то свойство Visible панели инструментов AutoSense устанавливается в значение True. В противном случае значение свойства Visible имеет значение False.

Кроме того, рабочая книга содержит процедуру Workbook_BeforeClose, которая удаляет панель инструментов AutoSense при закрытии рабочей книги. Эта техника, конечно, может быть адаптирована для предоставления других видов чувствительности пане-

лей инструментов.

 

578

Глава 22. Создание собственных панелей инструментов

Соседние файлы в папке 2 семестр