ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 18.06.2025

Просмотров: 8973

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Врассматриваемомслучаеосновнойзадачейявляетсясинхронизация состоянияфлажка

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

Добавление опции меню

Процедура AddMenuItem, показанная в листинге 23.5, выполняется при каждом открытии рабочей книги. Эта процедура создает новую опцию Линии сетки в меню Вид.

Рис. 23.5. Опция меню Линии сетки имеет установленный флажок, если активный лист содержит линиисетки

Листинг 23.5. Внесение изменений во встроенное меню Excel

Dim AppObject As New XLHandler

Sub AddMenuItem()

Dim ViewMenu As CommandBarPopup

Dim NewMenuItem As CommandBarButton

'Удаление опции, если таковая существует Call DeleteMenuItem

'Поиск меню Вид

Set ViewMenu = CommandBars(1)-FindControl(ID:=30004)

If ViewMenu Is Nothing Then

MsgBox "Невозможно добавить элемент меню."

Exit Sub

Else

Set NewMenuItem = ViewMenu.Controls-Add _

(Type:=msoControlButton)

With HewMenuItem

.Caption

=

"&Линии сетки"

.OnAction

=

"ToggleGridlines"

End With

End If

1

Обработчик события

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

607


Set AppObject.AppEvents = Application

End Sub

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

Обратите внимание, что в последнем операторе процедура AddMenuItem настраивает события уровня приложения, которые будут обрабатываться в приложении. Процедуры обработки событий, которые хранятся в модуле класса XLHandler, приведены ниже.

Public WithEvents AppEvents As Application

Private Sub AppEvents_SheetActivat.e{ByVal Sh As Object)

Call CheckGridlines

End Sub

Private Sub AppEvents_Work£>ookActivate (EyVal Wb As Excel .Workbook)

Call CheckGridlines

End Sub

Private Sub AppEvents_WindowActivette _

(ByVal Wb As Workbook, ByVal Wn As Window}

Call CheckGridlines

End Sub

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

Отображение линий сетки

Главным эффектом является запуск процедуры CheckGridlines при активизации пользователем другой рабочей книги или другого рабочего листа. Эта процедура обеспечивает состояние флажка для огсцли Линии сетки мелю Вид в соответствии с параметрами активного листа.

Sub CheckGridlines()

Dim TG As CommandBarButton On Error Resume Next

Set TG = CommandBars(1).FindControl(ID:=30004). _ Controls(ЧЛинии сетки")

If ActiveWindow.DisplayGridlines Then TG.State = msoButtonDown

Else

TG.State = msoButtonUp End If

End Sub

Данная процедура проверяет характеристики активного окна и устанавливает соответствующее значение свойства S t a t e опции меню. Если линии сетки отображаются, то к опции Линии сетки добавляется флажок. Если линии сетки не отображаются, то флажок из соответствующей опции меню удаляется.

Синхронизация меню с активным листом

Если выбрана опция меню, значение свойства OnAction этой опции изменяется, что приводит к вызову процедуры ToggleGr i d l i n e s , которая показана ниже.

608

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


Sub ToggleGridlines()

If TypeName(ActiveSheet) = "Worksheet" Then

ActiveWindow.DisplayGridlines = _

Not ActiveWindow.DisplayGridlines

Call CheckGridlines

End If

End Sub

Эта процедура просто переключает состояние линий сетки в активном листе. Конструкция I f - T h e n используется для того, чтобы проверить принадлежность активного листа к рабочим листам.

Простой способ создания пользовательских меню

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

Puc. 23.6. Информация этого рабочего листа используетсядлясозданияменю

Рабочий лист состоит из таблицы, которая имеет пять столбцов.

Уровень. Это расположение определенной опции в иерархии системы меню. Допустимыми значениями данного столбца выступают целые числа 1, 2 и 3. Уровень 1 соответствует меню. Уровень 2 описывает опции меню. Уровень 3 предназначен для доступа к опциям подменю. Обычно создается один элемент первого уровня, а для него — несколько элементов второго уровня. Опции второго уровня могут иметь, а могут и не иметь элементы третьего уровня (опции подменю).

Подпись. Этот текст отображается в качестве подписи меню, опции меню или подменю. Чтобы подчеркнуть один из символов в названии, необходимо перед ним ввести символ амперсанта (&).

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

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

609


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

Разделитель. Введите ИСТИНА, если перед опцией меню или подменю должна располагаться разделительная полоса.

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

На рис. 23.7 показано меню, которое создано с помощью данных, сохраненных на рабочем листе.

Рис.23.7.Меню,созданноенаосноведанных,которыехранилисьнарабочемлисте

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

1.Откройте пример рабочей книги, который находится на Web-узле.

2.Скопируйте весь код из модуля Modulel в модуль собственного проекта.

3.Добавьте процедуры, которые приведены ниже, к модулю кода объекта ЭтаКнига.

P r i v a t e

Sub Workbook_Open(}

Call CreateMenu

End

Sub

Private

Sub Workbook_BeforeClose(Cancel As Boolean)

Call DeleteMenu

End

Sub

4.Вставьте новый рабочий лист и назовите его ЛистМеню. Еще более удачным вариантом будет копирование рабочего листа ЛистМеню из примера рабочей книги.

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

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

610

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