Перейти к содержанию

Защита страницы через VBA

Каждый кто хоть раз писал макросы, сталкивался с тем, что требуется защитить лист и формулы на нем от шаловливых ручек пользователей. При том, нужно чтобы макросы на листе работали. Самое просто решение, это перед кодом макроса, добавить это:

Worksheets("Лист1").Unprotect Password:="123"
'тут макрос делает действия
Worksheets("Лист1").Protect Password:="123"

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

Есть другой способ

Нажмите Alt+F11, чтобы попасть в редактор Visual Basic. Затем в левом верхнем углу в окне Project Explorer (если его не видно, то нажмите Ctrl+R) модуль ЭтаКнига (ThisWorkbook) и откройте двойным щелчком:

Вставьте этот код:

Private Sub Workbook_Open()
   'включаем защиту первого листа для пользователя, но не макроса
   Worksheets("Лист1").Protect Password:="123", UserInterfaceOnly:=True     

   'второй лист защищаем аналогично, но с возможностью пользоваться группировкой
   Worksheets("Лист2").EnableOutlining = True
   Worksheets("Лист2").Protect Password:="555", UserInterfaceOnly:=True
End Sub

Данный код будет автоматически запускаться при открытии файла и ставить защиту на заданные листы. Параметр UserInterfaceOnly указывает Excel, что защита не должна работать для действий макроса, а только на операции юзера. Второй параметр EnableOutlining разрешает пользоваться группировкой.