Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

Как оставить возможность работать с группировкой/структурой на защищенном листе?

Наверняка многие уже сталкивались с ситуацией, когда необходимо защитить лист от внесения изменений в ячейки(Рецензирование(Review) -Защитить лист(Protect Sheet) - читать подробнее про защиту листа), на котором уже имеются сгруппированные в структуру данные. И при установке такой защиты теряется возможность работы с этой самой группировкой/структурой. Если не знаете, что такое структура(еще её называют группировка): это такие плюсики левее строк/выше столбцов, при нажатии на которые раскрываются скрытые строки/столбцы:
Структура по строкам
Но что делать, если нужна и защита и возможность структурой пользоваться? Т.е. чтобы пользователь мог просмотреть все в удобной форме, но не смог ничего изменить. Одновременно и просто и не очень.
Если вы не знакомы с макросами и VBA, то обязательно пройдите по ссылкам из инструкции ниже - эти знания потребуются, чтобы сделать все правильно и получить корректный результат. Итак, чтобы разрешить использовать структуру на защищенном листе необходимо:

  1. создать в книге стандартный модуль(Alt+F11 -Insert -Module)
  2. разместить в нем нижеприведенный код:
    Sub ProtectShWithOutline()
        ActiveSheet.EnableOutlining = True
        ActiveSheet.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True
    End Sub
  3. Выполнить данный код(Alt+F8 -Protect_And_Structure)

Код сам устанавливает защиту на лист(не надо перед его выполнением устанавливать защиту вручную!), но при этом разрешает использовать группировку.
Основную роль здесь играет параметр UserInterfaceOnly, который говорит Excel-ю, что коды VBA могут выполнять определенные действия, не снимая защиты методом Unprotect. А второй важный пункт - EnableOutlining = True. Он как раз и включает возможность использования группировки. Как ни странно, но без UserInterfaceOnly он не работает. Поэтому важно применять их оба.
Код выше устанавливает такую защиту только на активный лист книги. Но можно указать лист явно(например установить защиту на лист с именем Лист1 в активной книге):

Sub ProtectShWithOutline()
    Sheets("Лист1").EnableOutlining = True
    Sheets("Лист1").Protect Password:="1111", UserInterfaceOnly:=True
End Sub

Так же приведенный код можно еще чуть модернизировать и разрешить пользователю помимо изменения ячеек еще и использовать автофильтр:

Sub ProtectShWithOutline()
    'на лист "Лист1" поставим защиту и разрешим пользоваться фильтром
    Sheets("Лист1").EnableOutlining = True 'разрешаем группировку
    Sheets("Лист1").Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True
End Sub

Можно разрешить и иные действия(выделение незащищенных ячеек, выделение защищенных ячеек, форматирование ячеек, вставку строк, вставку столбцов и т.д. Чуть подробнее про доступные параметры можно узнать в статье Защита листов и ячеек в MS Excel). А как будет выглядеть строка кода с разрешенными параметрами можно узнать, записав макрорекордером установку защиты листа с нужными параметрами:

После этого получится строка вроде такой:

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True

здесь я разрешил использовать автофильтр(AllowFiltering:=True), вставлять строки(AllowInsertingRows:=True) и столбцы(AllowInsertingColumns:=True).Чтобы добавить возможность изменять данные ячеек только через код VBA, останется добавить параметр UserInterfaceOnly:=True и установить EnableOutlining = True:

ActiveSheet.EnableOutlining = True 'разрешаем группировку
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True

и так же неплохо бы добавить и пароль для снятия защиты, т.к. запись макрорекордером не записывает пароль:

ActiveSheet.EnableOutlining = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True, Password:="1111"

Самая большая ложка дегтя заключается в том, что параметр UserInterfaceOnly сбрасывается сразу после закрытия книги. Т.е. если установить таким образом защиту на лист и закрыть книгу, то при следующем открытии этой защиты уже не будет - останется лишь стандартная защита, а группировка работать не будет. Что ставит под сомнение полезность подобного подхода, потому как обычно такое применяется для других пользователей, которые как правило далеки от макросов и даже слушать не станут, что мы там будем им предлагать выполнить. Поэтому, если необходимо такую защиту видеть постоянно и не только у себя на компьютере, то данный макрос лучше всего прописывать на событие открытия книги(модуль ЭтаКнига(ThisWorkbook)). Т.е. приведенный ниже код в обязательном порядке должен быть именно в модуле ЭтаКнига(ThisWorkbook) на событие Workbook_Open. Это заставит код установки защиты на лист выполняться автоматически при открытии книги. Т.е. конечному пользователю не надо будет ничего нажимать для его запуска: открыл книгу - код сам запустился, все работает.
Собственно, сам код защиты, срабатывающий при открытии книги:

Private Sub Workbook_Open()
    Sheets("Лист1").EnableOutlining = True
    Sheets("Лист1").Protect Password:="1111", UserInterfaceOnly:=True
End Sub

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

Private Sub Workbook_Open()
    Dim wsSh As Object
    For Each wsSh In Me.Sheets
        ProtectShWithOutline wsSh
    Next wsSh
End Sub
Sub ProtectShWithOutline(wsSh As Worksheet)
    'Password:="1111" - это пароль на лист - 1111
    wsSh.Protect Password:="1111", UserInterfaceOnly:=True
End Sub

Плюс во избежание ошибок лучше перед установкой защиты снимать ранее установленную(если она была):

Sub ProtectShWithOutline(wsSh As Worksheet)
    wsSh.Unprotect "1111" 'снимаем прежнюю защиту
    wsSh.EnableOutlining = True 'разрешаем группировку
    wsSh.Protect Password:="1111", UserInterfaceOnly:=True 'защищаем лист с паролем "1111"
End Sub

Если же защиту необходимо установить только на конкретные листы, имена которых заранее известны, то можно использовать чуть иной подход - использовать массивы:

Private Sub Workbook_Open()
    Dim arr, sSh
    arr = Array("Январь", "Февраль", "Март")
    For Each sSh in arr
        ProtectShWithOutline Me.Sheets(sSh)
    Next
End Sub
Sub ProtectShWithOutline(wsSh As Worksheet)
    wsSh.EnableOutlining = True
    wsSh.Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True
End Sub

Для применения этого кода в своих книгах необходимо будет лишь изменить(добавить, удалить, вписать другие имена) имена листов в этой строке: Array("Январь", "Февраль", "Март"). Записывать обязательно в кавычках.

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

Также см.:
Как защитить лист от пользователя, но не от макроса?
Защита листов и ячеек в MS Excel
Защита листов/снятие защиты
Снять защиту с листа(без пароля)


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 125 комментариев
  1. Валерий:

    Макрос работает, однако при открытии общего доступа к книге появляется ошибка и работа макроса прекращается. В чем проблема не пониманию. :-(

  2. Проблема проста: в книгах с Общим доступом есть масса ограничений, среди которых так же и запрет на изменение существующей защиты книги и листов. Т.е. изменить при открытии защиту невозможно.

  3. Виталий:

    @Дмитрий(Админ)
    так и не понял где в коде надо пароль указывать

  4. Виталий:

    @Дмитрий(Админ)
    Вопрос не актуален, нашел ответ.

    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 Password:="admin"
        wsSh.EnableOutlining = True
        wsSh.Protect Password:="admin", Scenarios:=True, UserinterfaceOnly:=True
    End Sub
  5. Aleftina:

    Дмитрий,
    не работает Ваш стандартный модуль - при защищенном листе все равно не позволяет программа работать со структурой - для какой версии данный код актуален? У нас Excel 2003.

  6. Что означает "не работает"? Только что проверил - все работает. Вы статью до конца прочитали? Код какой вставили? Куда? Не работает вообще никак или есть нюансы(запустили код, закрыли книгу, открыли заново - не работает)

  7. Денис:

    прочитал статью раз 5 , также "Что такое модуль? Какие бывают модули?" сделал все по описанию, перепробовал все 3 кода , что с 1 листом, что со всей книгой, с паролем без пароля - возвожности пользоваться групировкой при защищеном листе не появляется, что делаю не так ? офис 2003, последовательность следующая: открываю файл, группирую строки, сохраняю, навожу на лист1 (назван "продажи") >"Исходный текст" навожу курсор на "Эта книга" > Insert>Module в открвшееся окно вставляю код ничго не изменяя, закладки "General" и "Declarations" не трогаю, сохраняю, защищаю лист- закладки +/- заблокированы.
    спасибо.

  8. Денис:

    извините , офис 2007 и не 2003

  9. Денис, не могу помочь. Проверил - работает. Проверил на 2003 и на 2007. Пришлите мне на почту свой файл с модулем и группировкой, помотрим, в чем проблема. Вы файл не закрываете после защиты? Какой именно код используете? Первый код необходимо вставлять в стандартный модуль и запускается принудительно(по нажатию клавиши F5 в окне редактора VBA), а остальные - в модуль книги и запускаются при открытии книги сами.

  10. Николай:

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

    Private Sub Workbook_Open()
     
        Const MyPassword = "tsd" 'Caaaeoa naie ia?ieu
        With Sheets("Fokker")
            .Unprotect Password:=MyPassword
            .EnableOutlining = True
            .Protect Password:=MyPassword, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                AllowFiltering:=True, UserInterfaceOnly:=True
        End With
     
        With Sheets("Embraer-190")
            .Unprotect Password:=MyPassword
            .EnableOutlining = True
            .Protect Password:=MyPassword, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                AllowFiltering:=True, UserInterfaceOnly:=True
        End With
     
        With Sheets("Members")
            .Unprotect Password:=MyPassword
            .EnableOutlining = True
            .Protect Password:=MyPassword, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                AllowFiltering:=True, UserInterfaceOnly:=True
        End With
      End Sub

    Теперь осталось решить проблему с Общим доступом и все будет Отлично, но похоже это не возможно

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

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти