ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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. Создание пользовательских меню |