Excel. Трюки и эффекты | страница 149



Добавим на вкладку Надстройки пользовательскую команду Линии сетки. С помощью данной команды можно будет управлять отображением сетки на текущем рабочем листе.

Итак, в стандартном модуле редактора VBA напишем код, который представлен в листинге 3.104.

Листинг 3.104. Код в стандартном модуле

Dim AppObject As New Class1

Sub AddCommand()

Dim cbrpBar As CommandBarPopup

' Удаление аналогичной команды (при ее наличии)

Call DeleteCommand

' Получение доступа к меню «Вид»

Set cbrpBar = CommandBars(1).FindControl(ID:=30004)

If cbrpBar Is Nothing Then

' Не удалось получить доступ к меню

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

Exit Sub

Else

' Добавление команды

With cbrpBar.Controls.Add(Type:=msoControlButton)

.Caption = «&Линии сетки»

.OnAction = «GhangeGridlinesState»

End With

End If

' Даем объекту AppObject обрабатывать события

Set AppObject.AppEvents = Application

End Sub

Sub DeleteCommand()

' Удаление каманды из меню (если она там есть)

On Error Resume Next

CommandBars(1).FindControl(ID:=30004). _

Controls(«&Линии сетки»).Delete

End Sub

Sub GhangeGridlinesState()

' Изменение состояния отображения линий сетки _

на противоположное (если нет – покажем, если есть – скроем)

If TypeName(ActiveSheet) = «Worksheet» Then

ActiveWindow.DisplayGridlines = _

Not ActiveWindow.DisplayGridlines

' Установка или снятие флажка в меню

Call CheckGridlines

End If

End Sub

Sub CheckGridlines()

Dim button As CommandBarButton

On Error Resume Next

' Поиск команды «Линии сетки» в меню «Вид»

Set button = CommandBars(1).FindControl(ID:=30004). _

Controls(«&Линии сетки»)

' Изменение состояния флажка на противоположное

If ActiveWindow.DisplayGridlines Then

' Установка

button.State = msoButtonDown

Else

' Снятие

button.State = msoButtonUp

End If

End Sub

После этого в редакторе VBA необходимо создать модуль класса и поместить в него следующий код (листинг 3.105).

Листинг 3.105. Код в модуле класса

Public WithEvents AppEvents As Application

' Обработка события активации листа

Sub AppEvents_SheetActivate(ByVal Sh As Object)

Call CheckGridlines

End Sub

' Обработка события активации книги

Sub AppEvents_WorkbookActivate(ByVal Wb As Excel.Workbook)

Call CheckGridlines

End Sub

' Обработка события активации окна

Sub AppEvents_WindowActivate _

(ByVal Wb As Workbook, ByVal Wn As Window)

Call CheckGridlines

End Sub

В результате выполнения макроса AddCommand (после написания кода этот макрос появится в окне выбора макросов) на вкладку Надстройки будет добавлена команда Линии сетки, с помощью которой можно включать/выключать отображение сетки на текущем рабочем листе (рис. 3.42).