×
Traktatov.net » Excel. Трюки и эффекты » Читать онлайн
Страница 37 из 146 Настройки
Листинг 2.4. Защита рабочей книги

Sub Worksheet_BeforeRightClick(ByVal Target As Range, _

Cancel As Boolean)

If Target.Address = «$D$2» Then

' Установка защиты рабочей книги (с паролем «123», _

включенной защитой структуры книги и защитой расположения _ окон)

ThisWorkbook.Protect «123», True, True

' Указание не обрабатывать нажатие кнопки мыши _ в этой

ячейке

Cancel = True

ElseIf Target.Address = «$E$5» Then

' Снятие защиты с книги (необходимо указать ранее установленный _ пароль)

ThisWorkbook.Unprotect «123»

Cancel = True

End If

End Sub

В данном примере включение защиты будет выполняться щелчком правой кнопки мыши на ячейке D2, а снятие защиты – щелчком правой кнопки на ячейке Е5.

При необходимости можно запретить вывод текущей рабочей книги на печать (при этом все остальные действия с рабочей книгой остаются доступными). Для этого достаточно записать небольшой макрос, код которого выглядит следующим образом (листинг 2.5; данный код следует поместить в модуль ЭтаКнига).

Листинг 2.5. Запрет печати книги

Sub Workbook_BeforePrint(Cancel As Boolean)

' Установка флага в True заставляет Exсel игнорировать команду _

отправки книги на печать

Cancel = True

End Sub

После выполнения данного макроса перестанут выполняться команды пункта Печать, расположенного в главном меню программы, которое вызывается нажатием Кнопки «Office».

Закрытие рабочей книги только при выполнении условия

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

Листинг 2.6. Условное закрытие книги

Sub Workbook_BeforeClose(Cancel As Boolean)

If Range(«A1»).Value <> «Можно закрывать» Then

' Условие закрытия не выполнено. Укажем Exсel игнорировать _

команду

Cancel = True

End If

End Sub

При использовании данного кода закрытие текущей рабочей книги будет возможно лишь после того, как в ячейку А1 будет введен текст Можно закрывать.

Быстрое удаление из рабочей книги ненужных имен

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

Листинг 2.7. Удаление ненужных имен

Sub EraseNames()

Dim nmName As Name

Dim strMessage As String

' Проверка наличия в книге определенных имен

If ThisWorkbook.Names.Count = 0 Then

' В книге нет определенных имен

MsgBox «Имена не определены»

Exit Sub

End If

' Просмотр всей коллекции определенных имен и удаление тех, _

которые пользователю не нужны

For Each nmName In ThisWorkbook.Names

With nmName

' Спрашиваем пользователя о необходимости удалить _

найденное имя

strMessage = "Удалить имя " & .Name & " ? " & vbCr & _

"относящееся к " & .RefersTo

If MsgBox(strMessage, vbYesNo + vbQuestion) = vbYes Then

' Имя можно удалить

.Delete

End If

End With

Next

End Sub

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