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

2 семестр / vba_2002

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

названиями каждого из месяцев. Кроме того, определяется свойство OnAction, которое приводит к вызову (в момент щелчка на кнопке) процедуры, вставляющей название месяца. Панель инструментов, которая получена в результате ее выполнения, показана на рис. 22. L4.

Листинг 22.4. Добавление выпадающего списка на командную панель

Sub

MonthListO

 

 

 

Dim

TBar

As

CommandBar

 

Dim NewDD As

CommandBarControl

'

Удаление

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

 

On Error Resume

Next

 

CommandBars("Список месяцев").Delete

 

On Error GoTo 0

 

1

Создание

новой

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

 

Set

TBar

= CommandBars.Add

 

With

TBar

 

 

 

 

 

.Name

=

"Список месяцев"

 

 

.Visible = True

 

End With

 

 

 

 

Добавление элемента управления DropDown

 

Set NewDD = CommandBars("Список месяцев").Controls.Add _

 

(Type:=msoControlDropdown)

 

With

NewDD

 

 

 

 

.Caption

=

"DateDD"

 

 

.OnAction =

"PasteMonth"

 

 

.Style = msoButtonAutomatic

1

 

Заполнение

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

 

 

For i = 1 То 12

 

 

.Addltem Format(DateSerial(1, i, 1) , "mmrnrn")

 

 

Next

i

 

 

 

 

-Listlndex = 1

 

End With

 

 

 

End Sub

 

 

 

 

Ниже приведена процедура PasteMonth.

Sub PasteMonth()

 

 

 

Вставляет название выделенного месяца в активную ячейку

 

On Error

Resume Next

 

With

CommandBars("Список месяцев").Controls("DateDD")

ActiveCell.Value = .List(.Listlndex) End With

End Sub

Данная рабочая книга имеет дополнительную особенность: в ней используется процедура обработки события, которая называется Worksheet_SelectionCh,ange. Эта процедура, которая приводится ниже, выполняется каждый раз, когда пользователь изменяет текущее выделение на рабочем листе. Процедура онределяет, не содержит ли активная ячейка название месяца. Если это так, то устанавливается свойство Listlndex выпадающего списка на панели инструментов.

Private Sub Worksheet_SelectionChange(ByVal

Target _

As Excel.Range)

 

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

589

For i = 1 To 12

Set ActCell = Target.RangeV'Al")

If ActCell.Value = Format(DateSerial(1, i, 1), _

"iminm") Then

CommandBars("Список месяцев")-Controls("DateDD") _,

.Listlndex = i

Exit Sub

End If

Next i

End Sub

Резюме

Вэтой главе рассматривались вопросы использования встроенных панелей инструментов Excel и методы внесения изменений в стандартные панели инструментов.

Вследующей главе речь пойдет о двух других типа командных панелей: меню и контекстных меню.

590

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

Создание

пользовательских

меню

Практически каждая программа Windows имеет систему меню, которая служит основным компонентом пользовательского интерфейса программы. Стандарт Windows требует расположения строки меню непосредственно под заголовком окна приложения. Кроме того, некоторые программы предоставляют и другой тип меню: контекстное меню. Обычно щелчок правой кнопкой мыши приводит к отображению контекстного меню, которое содержит часто ис-

пользуемые команды.

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

Несколько слов о строке меню Excel

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

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

Панели инструментов обычно состоят из графических значков и не содержат командные кнопки. Однако перечисленные

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

Операции с меню Excel

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

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

При закрытии Excel сохраняются все изменения, которые внесены в систему меню. Эти изменения отображаются при следующем запуске Excel. Информация об изменениях, внесенных в меню, хранится в файле XLB, который обычно располагается в папке Windows.

Дополнительная информация о файле XLB приводится в главе 22.

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

Терминология

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

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

Строка меню. Строка опций, которая отображается непосредственно под строкой заголовка приложения. Excel имеет две строки меню: одна отображается, когда активен рабочий лист, а вторая — когда активен лист диаграммы или встроенная диаграмма.

Меню. Один элемент верхнего уровня в строке меню. Например, обе строки меню Excel имеют меню Файл.

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

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

592

Глава 23. Создание пользовательских меню

Подменю. Меню второго уровня, которое находится в определенном меню. Например, меню Правка имеет подменю Очистить.

Опция подменю. Опция меню, которая отображается в списке после выбора подменю. Например, подменю Правка^Очистить содержит следующие опции подменю: Все, Форматы, Содержимое и Примечания.

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

Активная опция. Опция меню, которую можно использовать. Если опция меню неактивна, то ее название имеет серый цвет. Такие опции меню применить нельзя. Установленная. Состояние опции меню, которое обозначает включение или выключение параметра, Установка опции меню отображается специальным флажком, который также может быть сброшен.

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

Комбинация клавши для опции меню. Комбинация клавиш, которая является альтернативным методом выбора опции меню. Комбинация клавиш для опции показана справа от самого элемента меню. Например, комбинация <Ctrl+S> используется для открытия диалогового окна, которое вызывается по команде Файл^Сохранить.

Удаление элементов меню

Можно удалить любой фрагмент системы меню Excel: меню, опции меню и даже целые панели меню. Например, если требуется запретить конечным пользователям получать доступ к параметрам отображения, то следует удалить меню Вид со строки меню листа. Кроме того, можно удалить одну или несколько опций меню. Если удалить опцию Соэдэть из меню Файл, то пользователи не смогут использовать меню для создания новых рабочих книг. Наконец, можно удалить строку меню Excel и заменить ее на собственную строку меню. Таким образом вы позволите контролировать приложение только с помощью созданного макроса.

Важно помнить, что простое удаление строки меню, меню или опций меню никак не повлияет на альтернативные методы выполнения определенных действий. Особенно, если для них представлены комбинации клавиш, кнопки на панелях инструментов, а также команды контекстного меню, которые выполняют те же действия, что и удаленная опция меню. Например, если удалить опцию Создать 8 меню Файл, то всегда можно использовать кнопку Создать на панели инструментов, комбинацию клавиш <Ctrl+N>, область задач (в Excel 2002) или контекстное меню рабочего стола для создания новой рабочей книги.

Переход от Excel 5/95

Если меню изменялись в Excel 5 или Excel 95, то можете забыть обо всех выученных методах создания таких меню. Начиная с Excel 97, методы внесения изменений в систему меню претерпели значительных модификаций. Итак, изменения заключаются в следующем,

•ф-Строкаменюфактическиявляетсязамаскированнойпанельюинструментов.Если это утверждение вызывает недоверие, то можно захватить вертикальные полосы 8 левой части строки меню и перетащить ее в другое место. Если переместить строку меню достаточно далеко, то в итоге получится плавающая панель инструментов. Официальным обобщающим термином (VBA) для строки меню и панелей инструментов являетсякоманднаяпанель(commandbar).

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

593

•$• Исчез редактор меню Excel 5/95. Для того чтобы отредактировать меню вручную, необходимо воспользоваться командой Вид^Панели инструментов^Настройка. Но помните, что рабочие книги Excel 5/95, в которых находятся меню, созданные с помощью старых методов редактирования, продолжают работать в Excel 97 и-последующих версиях. Внести изменения в подобные меню можно только средствами Excel 5/95,

•Ф- Не существует простого способе назначения макроса VBA новой опции меню

Сервис. В Excel 5/95 это сделать очень просто. Далее в этой главе показан код VBA. который можно использовать для добаЕтения новой опции меню Сервис.

•Ф- Excel 2000 и поздние версии по умолчанию отображают те опции меню, которые использовались наиболее часто. На наш взгляд, это одна из наиболее неудачных идей Microsoft. Сложно представить, зачем может понадобиться изменять порядок представления опций меню. К счастью, данная возможность отключается с помощью опции вкладки Параметры диалогового окна Настройка.

Добавление элементов меню

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

Изменение опций меню

Если стандартные подписи опций меню Excel вам надоели, то замените их на другие. Например, можно изменить название меню Сервис на Инструменты или Утилиты. Кроме того, встроенной опции меню можно назначить собственный макрос. Существует ряд других возможностей по изменению меню, в число которых входит переорганизация меню в строке меню (например, меню Справка (?) можно отображать в строке первым, а не последним).

Ссылки на коллекцию CommandBars

Коллекция CoittmandBara содержится в объекте Application. При ссылке на эту коллекцию из модуля кода VBA общего назначения можно опустить ключевое слово Application (подразумевается по умолчанию). Например, следующий оператор (расположенный в модуле кода VBA общего назначения) отображает имя первого элемента коллекции CoimandBars:

MsgBox ComrciandBars (1} .Name

При ссылке на коллекцию CommandBars из модуля кода объекта ЭтаКнига ссылку необходимо предварять ссылкой на объект Application, как показано ниже:

MsgBox Application.CommandBars(1).Name

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

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

594

Глава 23. Создание пользовательских меню

Глава22предоставляетполнуюинформациюодиалоговомокнеНастройкэ.

Примеры кода VBA

В настоящем разделе предоставляются практические примеры кода VBA, который предназначен для управления меню Excel.

Вывод информации о меню

Процедура L i s t M e n u I n f о, которая приведена ниже, демонстрирует описанные принципы. Она отображает название каждого элемента меню (меню, опции меню, а также опции подменю), находящегося в строке меню листа.

Sub ListMenuInfo()

Dim row As Integer

Dim Menu As CommandBarControl

Dim Menultem As CommandBarControl Dim SubMenultem. As Camm.and3arCon.trol row = 1

On Error Resume Next

For Each Menu In CommandBars(1).Controls For Each Menultem In Menu,Controls

For Each SubMenultem In Menultem.Controls Cells(row, 1) = Menu.Caption Cells(row, 2) = Menultem.Caption Cells(row, 3) = SubMenultem.Caption row = row + 1

Next SubMenultem Next Menultem

Next Menu End Sub

Нарнс. 23Л показан результат выполнения процедуры ListMenuInfo.

/*ис.23.1. Фрагмент, полученный s pfsv.ibtnaine выполнения процедуры ListMenuInfo

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

595

Рабочая книга, которая содержит эту процедуру, доступна на Web-узле издательства.

Оператор on Error Resume Next используется с целью предотвратить отображение сообщения об ошибке, которое возникает, когда процедура пытается получить доступ к несуществующей опции подменю.

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

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

CommandBars("Worksheet Menu Bar") CommandBars (1)

Втерминологии VBA метод Add используется для добавления нового элемента управления в коллекцию C o n t r o l s . Новый элемент управления является "всплывающим"; он имеет тип m s o C o n t r o l P o p u p . Можно указать расположение нового элемента управления. Если этого не сделать, то новый элемент управления будет располагаться в конце строки меню.

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

1.Необходимо воспользоваться методом Add для добавления переменной, которая ссылается на новый элемент управления. Аргументы метода Add позволяют указать тип элемента управления, идентификатор элемента управления (имеет смысл только в случае добавления встроенного меню), расположение, а также время существования элемента управления (должен ли элемент управления сохраняться в момент закрытия Excel).

2.Необходимо определить свойства добавленного элемента управления. Например, почти всегда требуется указать значения свойств C a p t i o n и OnAction.

Соглашения по созданию меню

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

•> Традиция требует, чтобы меню Файл всегда располагалось первым, а меню Справка — последним в строке меню.

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

<• Меню верхнего уровня не должны связываться с определенными действиями. Другими словами, каждое меню имеет как минимум одну опцию.

<• Подписи опций меню обычно ограничены тремя или меньшим количеством слов.

•> Каждая опция меню должна иметь "горячую" клавишу (подчеркнутый символ), которая является уникальной в пределах этого меню.

• Опция меню, которая отображает диалоговое окно, должна завершаться троеточием {...). •Ф- Список опций меню должен оставаться относительно коротким. Иногда подменю являются хорошей альтернативой использованию длинных списков. Если вами асе же используется длинный список опций меню, то необходимо вставить разделительные

полосы, которые логически группируют сходные опции меню.

Глава 23. Создание пользовательских меню

Если это возможно, отключите опции меню, которые не соответствуют текущему контексту. В VBA, чтобы отключить опцию (сделать ее неактивной) меню, необходимо изменить значение свойства Enabled на False.

Некоторые опции меню служат в качестве переключателей. Когда параметр активен, опция меню отображается с установленным флажком.

Добавление меню: первая попытка

В этом примере главной целью является добавление нового меню Бюджет в строку меню листа. Данное меню должно располагаться слева от меню Справка.

Sub AddNewMenu()

Dim Helplndex As Integer

Dim NewMenu As CommandBarPopup

i

1Получение индексного номера меню ?

Helplndex = CommandBars(1).Controls{"Help"}.Index

1Создание меню

Set NewMenu = CommandBars (1) .Controls -Add __ (Type:=msoControlPopup, _ Before:=HelpIndex, _

Temporary:=True)

' Добавление названия NewMenu.Caption = "^Бюджет"

End Sub

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

Предполагается, что в строке меню присутствует меню ?. В то же время пользователь мог удалить его.

Предполагается, что меню ? имеет название Help. Неанглийские версии Excel могут использовать другое название для данного меню (в русской версии это Справка).

Добавление меню: вторая попытка

Листинг 23.1 содержит более правильный вариант кода. В представленном коде используется метод F i n d C o n t r o l , который будет находить меню Справка. Если меню Справка не найдено, то код добавляет новое меню в конец строки меню листа-

Листинг 23,1. Добавление меню Бюджет в строку меню листа Excel

Sub AddNewMenu{)

Dim HelpMenu As CommandBarControl

Dim NewMenu As CommandBarPopup

Dim. Menultem As CammandBaEControl

Dim Submenuitem As CommandBarButton

1Удаление меню, если таковое существует Call DeleteMenu

1Поиск меню Справка

Set HelpMenu = CommandEars(1).FindControl(Id:=30010) If HelpMenu Is Nothing Then

'Добавление меню в конец строки меню

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

597

Set NewMenu = CornmandEars (1) .Controls .Add .

(Type:=msoControlPopup, _

temporary:=True}

Else

'Добавление меню перед меню Help

Set NewMenu = CommandBars(1}.Controls.Add

{Type:=msoControlPopup, _

Before:=HelpMenu.Index, _

temporary:=True)

End If

1 Добавление подписи NewMenu.Caption = "&Бюджет"

End Sub

Предыдущая процедура создает полностью бесполезное меню (в этом меню отсутствуют функциональные опции). Обратитесь к разделу "Добавление опции в меню Сервис" далее в этой главе для получения дополнительной информации о добавлении опции меню.

Для того чтобы воспользоваться метолом F i n d C o n t r o l , необходимо знать значения свойства ID требуемого элемента управления. Каждый встроенный элемент управления Excel CommandBar имеет уникальное значение свойства ID. В этом примере значение свойства ID для меню Справка определено с помощью следующего оператора:

MsgBox C o m m a n d B a r s ( 1 ) . C o n t r o l s ( " С л р а в к а " ) . I D

Окно сообщения отобразило значение 30010 свойства ID, которое использовано в качестве параметра метода F i n d C o n t r o l . В табл. 23.1 показаны значения свойства ID для элементов верхнего уровня строки меню Excel.

Таблица 23.1. Значение свойства /О меню верхнего уровня Excel

Меню

Значение

File (Файл)

30002

Edit (Правка)

30003

View (Вид)

30004

Insert (Вставка)

30005

Format (Формат)

30006

Tools (Сервис)

30007

Data (Данные)

30011

Chart (Диаграмма)

30022

Window (Окно)

30009

Help (Справка)

30010

Удаление меню со строки меню

Чтобы удалить меню, можно воспользоваться методом D e l e t e . Следующий пример демонстрирует способ удаления меню Бюджет со строки меню листа. Обратите внимание на использование оператора On E r r o r ReEsume Next, который позволяет игнорировать сообщение об ошибке, которое возникает при попытке удалить несуществующее меню.

598

Глава 23. Создание пользовательских меню

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