Как оставить возможность работать со структурой на защищенном листе?
Что умеет Excel
Если Вы хотите защитить лист от внесения изменений и на листе имеется сгруппированные в структуру данные, то при установке обычной защиты теряется возможность работы с этой структурой. Для тех, кто не совсем понимает, что такое структура(еще её называют группировка): это такие плюсики левее строк, при нажатии на которые раскрываются скрытые строки. Так вот частенько очень необходимо, чтобы наряду с защитой листа можно было еще и структурой пользоваться. Т.е. чтобы пользователь мог просмотреть все в удобной форме, но не смог ничего изменить. Так как же защитить лист и оставить возможность работы со структурой? Очень просто.
Если Вы не знакомы с макросами и VBA, то Вам сначала необходимо:
- создать стандартный модуль
- разместить в нем нижеприведенный код:
Выполнив данный код, Вы защитите активный лист, не потеряв возможности работать со структурой.Естественно можно указать любой лист вместо активного.
Примечание: данный макрос лучше всего прописывать на событие открытия книги(модуль ЭтаКнига(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 "1234" wsSh.EnableOutlining = True wsSh.Protect Password:="1234", Contents:=True, Scenarios:=True, UserinterfaceOnly:=True End Sub
Sub Protect_and_Structure(wsSh As Object)
wsSh.Unprotect "1234"
wsSh.EnableOutlining = True
wsSh.Protect Password:="1234", Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
End SubХочу обратить внимание, что тогда и снимать защиту тоже следует с указанием пароля, как показано выше(wsSh.Unprotect "1234"). Если изначально пароль не установлен, то следует его установить вручную и запустить код, либо просто удалить строку wsSh.Unprotect "1234".
Также см.:
→Как защитить лист от пользователя, но не от макроса?
→Защита листов/снятие защиты

14670


Дмитрий, добрый день. Вставил Ваш код в файл. При запуске файла все работает (лист защищен), но можно зайти в Редактирование-Снять защиту листа и далее просто снять защиту и редактировать любую информацию на листе. Я в макросах не силен, подскажите, пжлста, что можно добавить в макрос или иные действия, способные защитить информацию?
alx74, я бы посоветовал Вам дочитать статью до конца. Последний код демонстрирует возможность кодом установки пароля на защиту. Тогда не зная пароля никто защиту не снимет.
Дочитал, попробовал, получилось. Спасибо.
Если с функциями более или менее, то с макросами знания «стерильны» . Все методом проб и ошибок.
Еще раз, Спасибо.
Может кому пригодится-просто и удобно!!!
Код позволяет пользоваться группировкой (символы плюс-минус для сворачивания-разворачивания строк и столбцов) на всей защищенной книге!!!
Код вставляется в основу самой книги.
Janis, а Вы не прочитали статью, да? Если прочитали, то не вникали, я полагаю? Там уже есть код, позволяющий ставить защиту на все листы книги…
Притом Ваш код выдаст ошибку при как минимум втором открытии книги. Потому что отсутствует строка снятия защиты с листов перед установкой.
Статью я читал, но данный в статье код мне не подошёл, на каждый лист просит пароль!!! На моих книгах мною указанный код пока действует без проблем, можно работать вводить данные и сохранять их, при этом никто не видит ни формулы ни макроса и не нужен никакой пароль чтоб вводить и сохранять информацию, хотя листы защищены.
Не буду переубеждать(тем более, что статью Вы все же не дочитали до конца и не свели воедино информацию в ней). Просто вглядитесь в свой код и посмотрите — где Вы там снимаете защиту с листов, прежде чем изменить параметры этой защиты? Если Вы, конечно, не забыли указать, что перед закрытием книги снимаете защиту с листов. Закройте свою книгу, откройте и попробуйте воспользоваться группировкой.
А за запись в защищенные листы информации макросом отвечает параметр UserinterfaceOnly:=True. Об этом я писал в другой статье (в этой он тоже применяется, если Вы, конечно, заметили).
Дмитрий, как мне Вам лично отправить пример .xls, может Вы меня переубедите
Хотя не вижу смысла. Я так понимаю, что Вы не особо еще в кодах разбираетесь. Я вот не вижу смысла в строке Вашего кода: Dim ProtectAllSheets()
Спасибо! Оч.полезная статья- помогла!
Janis прав. Дело в том, что команда UserinterfaceOnly:=True не распространяет защиту на выполнение макроса, а только на действия пользователя. И поэтому снимать защиту при запуске не надо.
Николай вы гений пробовал разные коды подошел только ваш… спс
Добрый день! У меня не получается с код. Я воспользовался первым кодом
Sub Protect_and_Structure() ActiveSheet.EnableOutlining = True ActiveSheet.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True End SubПоставил его в новый модуль, у меня Module 3, защите листа через раздел Разрешить изменение диапазонов, но все равно не дает работать с группами. Почему?
Работает все отлично, но не получается добавить возможность обновления данных из внешнего источника.
Необходимо подгружать данные с сайта. Пробовал добавить RefreshAll:=True, но ничего не получилось…
khmelae, а какое вообще имеет отношение группировка к обновлению данных? Данная статья не предназначена для решения ВСЕХ Ваших проблем. Есть форум, есть другие статьи — советую почитать.
Комментарии, не имеющие отношения к комментируемой статье, будут удаляться без уведомления и объяснения причин. Если есть вопрос по проблеме в Excel- добро пожаловаться на Форум