Пример такого макроса приведен в листинге 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; данный код следует поместить в модуль ЭтаКнига).
Sub Workbook_BeforePrint(Cancel As Boolean)
' Установка флага в True заставляет Exсel игнорировать команду _
отправки книги на печать
Cancel = True
End Sub
После выполнения данного макроса перестанут выполняться команды пункта Печать, расположенного в главном меню программы, которое вызывается нажатием Кнопки «Office».
Закрытие рабочей книги только при выполнении условия
С помощью несложного трюка можно запретить закрытие текущей рабочей книги. Для этого можно воспользоваться кодом, приведенным в листинге 2.6 (этот код должен быть помещен в модуль ЭтаКнига).
Sub Workbook_BeforeClose(Cancel As Boolean)
If Range(«A1»).Value <> «Можно закрывать» Then
' Условие закрытия не выполнено. Укажем Exсel игнорировать _
команду
Cancel = True
End If
End Sub
При использовании данного кода закрытие текущей рабочей книги будет возможно лишь после того, как в ячейку А1 будет введен текст Можно закрывать.
Быстрое удаление из рабочей книги ненужных имен
В процессе использования программы в рабочих книгах может накапливаться большое количество имен ячеек, диапазонов и т. п., часть из которых с течением времени становится ненужной. Вручную избавляться от ненужных имен слишком долго и нерационально, поэтому данный процесс целесообразно автоматизировать. Для решения этой задачи можно использовать следующий макрос (листинг 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