Если Вы хотите защитить лист от внесения изменений и на листе имеется сгруппированные в структуру данные, то при установке обычной защиты теряется возможность работы с этой структурой. Для тех, кто не совсем понимает, что такое структура(еще её называют группировка): это такие плюсики левее строк, при нажатии на которые раскрываются скрытые строки. Так вот частенько очень необходимо, чтобы наряду с защитой листа можно было еще и структурой пользоваться. Т.е. чтобы пользователь мог просмотреть все в удобной форме, но не смог ничего изменить. Так как же защитить лист и оставить возможность работы со структурой? Очень просто.
Если Вы не знакомы с макросами и VBA, то Вам сначала необходимо:
- создать стандартный модуль
- разместить в нем нижеприведенный код:
Sub Protect_and_Structure()
ActiveSheet.EnableOutlining = True
ActiveSheet.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Sub Protect_and_Structure()
ActiveSheet.EnableOutlining = True
ActiveSheet.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Выполнив данный код, Вы защитите активный лист, не потеряв возможности работать со структурой.Естественно можно указать любой лист вместо активного.
Примечание: данный макрос лучше всего прописывать на событие открытия книги(модуль ЭтаКнига(ThisWorkbook)), т.к. сразу после закрытия и открытия книги данная защита снимается.
Можно ставить защиту сразу на все листы книги при открытии таким кодом:
Private Sub Workbook_Open()
Dim wsSh As Object
For Each wsSh In Me.Sheets
Protect_and_Structure wsSh
Next wsSh
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Private Sub Workbook_Open()
Dim wsSh As Object
For Each wsSh In Me.Sheets
Protect_and_Structure wsSh
Next wsSh
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Данный код вставляется в модуль ЭтаКнига.
Ну и если Вам только на один лист надо установить, то убираем цикл и вызываем процедуру только для нужного листа:
Private Sub Workbook_Open()
Protect_and_Structure Me.Sheets("Лист1")
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Private Sub Workbook_Open()
Protect_and_Structure Me.Sheets("Лист1")
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Чтобы помимо этого можно было разрешить пользователям производить иные стандартные операции(форматирование ячеек, форматирование строк, форматирование столбцов, вставка строк и т.д.) достаточно просто записать макрос по установке защиты листа и посмотреть как будет выглядеть код. Код ниже вставлен в основной после записи макрорекордером установки защиты с возможностью форматировать столбцы:
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, AllowFormattingColumns:=True, UserinterfaceOnly:=True
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Contents:=True, Scenarios:=True, AllowFormattingColumns:=True, UserinterfaceOnly:=True
End Sub
Чтобы добавить в код установку пароля, записать его следует так:
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Password:="1234", Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect
wsSh.EnableOutlining = True
wsSh.Protect Password:="1234", Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End Sub
Также см.:
→Как защитить лист от пользователя, но не от макроса?
→Защита листов/снятие защиты