Excel как разрешить группировку на защищенном листе

Хитрости »

1 Май 2011              197602 просмотров


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

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

  1. создать в книге стандартный модуль(Alt+F11 —InsertModule)
  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
ссылки
статистика

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

NeWru

Дата: Вторник, 29.08.2017, 19:21 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 63


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Здравствуйте! Прошу подсказку, как на защищенном листе оставить возможность работы с показом/скрытием сгруппированных столбцов или строк. В таблице ячейки без защиты и могут редактироваться, но иногда требуется для печати скрывать строки или столбцы, которые сгруппированы. Не могу подобрать условия для их скрытия при включенной защите листа, при выключенной конечно все работает.

 

Ответить

buchlotnik

Дата: Вторник, 29.08.2017, 19:33 |
Сообщение № 2

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

NeWru, разве что программно : [vba]

Код

Private Sub Workbook_Open()
    Sheets(«Лист1»).EnableOutlining = True
    Sheets(«Лист1″).Protect Password:=»12345», UserInterfaceOnly:=True
End Sub

[/vba]

К сообщению приложен файл:

9544809.xlsm
(13.5 Kb)

 

Ответить

NeWru

Дата: Вторник, 29.08.2017, 19:44 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 63


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Работает, думаю подойдет! Спасибо Вам! Если кроме кода вариантов нет, то так и сделаю!

 

Ответить

finiamino

Дата: Пятница, 04.03.2022, 18:49 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 1


Репутация:

0

±

Замечаний:
0% ±


Доброго дня.
А как сделать чтобы работало на все листы в книге?

 

Ответить

Serge_007

Дата: Пятница, 04.03.2022, 22:49 |
Сообщение № 5

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

Пропишите все листы в коде:[vba]

Код

Sheets(«Лист1″).Protect Password:=»12345», UserInterfaceOnly:=True
Sheets(«Лист2″).Protect Password:=»54321», UserInterfaceOnly:=True
Sheets(«Лист3″).Protect Password:=»*****», UserInterfaceOnly:=True

[/vba]


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

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

Как мы все знаем, на защищенном листе существует множество ограничений для применения некоторых операций. Например, мы не можем переключаться между сгруппированными и разгруппированными данными. Есть ли способ сгруппировать или разгруппировать строки на защищенном листе?

Группировка и разгруппировка строк на защищенном листе с кодом VBA


стрелка синий правый пузырь Группировка и разгруппировка строк на защищенном листе с кодом VBA

Возможно, нет другого хорошего способа решить эту проблему, кроме использования кода VBA, сделайте следующее:

1. Активируйте свой рабочий лист, который вы хотите использовать, убедитесь, что рабочий лист еще не защищен.

2. Затем удерживайте ALT + F11 ключи, и он открывает Окно Microsoft Visual Basic для приложений.

3. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.

Код VBA: группировка и разгруппировка строк на защищенном листе

Sub EnableOutlining()
'Update 20140603
Dim xWs As Worksheet
Set xWs = Application.ActiveSheet
Dim xPws As String
xPws = Application.InputBox("Password:", xTitleId, "", Type:=2)
xWs.Protect Password:=xPws, Userinterfaceonly:=True
xWs.EnableOutlining = True
End Sub

4. Затем нажмите F5 нажмите клавишу для запуска этого кода, и появится диалоговое окно с напоминанием о вводе пароля для защиты текущего рабочего листа. Смотрите скриншот:

doc-группа-в-защищенном-листе1

5. Затем нажмите OK, ваш лист был защищен, но вы можете развернуть и сжать символы структуры на этом защищенном листе, см. снимок экрана:

doc-группа-в-защищенном-листе1

Внимание: Если ваш рабочий лист уже защищен, этот код не будет работать.


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (32)


Оценок пока нет. Оцените первым!

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

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

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

Если вы не знакомы с макросами и VBA, то обязательно пройдите по ссылкам из инструкции ниже. Итак, чтобы разрешить использовать структуру на защищенном листе необходимо:

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

    1

    2

    3

    4

    Sub ProtectShWithOutline()

        ActiveSheet.EnableOutlining = True

        ActiveSheet.Protect Contents:=True, Scenarios:=True, UserinterfaceOnly:=True

    End Sub

  4. Выполнить данный код(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

1

2

3

4

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

1

2

3

4

5

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

1

2

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

1

2

3

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″

1

2

3

ActiveSheet.EnableOutlining = True

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _

        , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True, Password:=»1111″

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

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

1

2

3

4

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) wsSh.Protect Password:=»1111″, UserInterfaceOnly:=True End Sub

1

2

3

4

5

6

7

8

9

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)

    wsSh.Protect Password:=»1111″, UserInterfaceOnly:=True

End Sub

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

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

1

2

3

4

5

Sub ProtectShWithOutline(wsSh As Worksheet)

    wsSh.Unrotect «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

1

2

3

4

5

6

7

8

9

10

11

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(«Январь», «Февраль», «Март»)

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

Да, было такое решение в архиве форума. Можно, но только с помощью VBA.

Алексей Б., 12.09.07 02:17:

Доброго дня всем форумчанам! Как всегда нужен совет бывалых и осведомленных. Появилась проблемка которую никак не могу решить. Ситуация: Есть файл-шаблон, который отправляется людям для заполнения. А ручки у некоторых шаловливые и они все время пытаются подстроить под себя шаблончик (меняют формулы, добавляют строки и т.п.), поэтому все листы в этом файле защищены. НО, защитив листы столкнулся с проблемой: невозможно раскрыть/свернуть (+ /-) сгруппированные строчки и столбцы. Может есть какая нибудь фишка в настройках, чтобы это было осуществимо? Буду рад любым советам.

Vasyl Grabovsky, 12.09.07 12:30:

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

Сергей Л., 12.09.07 13:46:

К сожалению, среди этих функций нет тех, которые позволяют скрыть-раскрыть группированные столбцы и строки. Сам сначала подумал об этом, проверил — ничего не подходит… Таким образом, IMHO, только при помощи VBA. То есть, будет запускаться макрос, снимающий защиту листа, раскрывающий(скрывающий) нужные столбцы и ставящий защиту обратно. …Вот только как привязать его запуск к отображению/скрытию деталей (к тем самым «+» и «-«) — не знаю. Можно сделать отдельные кнопки на запуск.

Anton slonik, 24.10.07 07:42:

Не знаю, актуален ли еще этот вопрос, но на всякий случай напишу, что знаю: в листе (Worksheet) есть свойство EnableOutlining, которое отвечает за группировку в защищенном режиме при доступности корректировки через юзеринтерфейс. Его можно засунуть в обработчик события открытия книги или в другое место по вашему желанию. Приведу тут же текст из хелпа:

EnableOutlining Property
True if outlining symbols are enabled when user-interface-only protection is turned on.
Read/write Boolean.

Remarks

This property applies to each worksheet and isn’t saved with the worksheet or session.

Example

This example enables outlining symbols on a protected worksheet.

ActiveSheet.EnableOutlining = True
ActiveSheet.Protect contents:=True, userInterfaceOnly:=True

Алексей Шмуйлович, 24.10.07 17:36:

Потрясающе. Век живи — век учись. Этот вопрос уже не раз на форуме поднимали и ответ не нашли. А вот, оказывается, можно группировку на защищенном листе включить!

If there is nothing preventing you from running the code externally, then just put this code into another macro enabled workbook OR run it from a seperate C# winform/console application exe.
Note I had quick search of the Excel 2007 object model and didn’t find the EnableGrouping method, but maybe i wasn’t looking hard enough.

External VBA

Sub UpdateWorkbook()  
Constant workbookpath As String = "C:somepathsomeworkbookname.xlsx"  
Dim wkbk As Workbook  
Set wkbk = Application.Workbooks.Open(workbookpath)  
Dim wksht As Worksheet  
Set wksht = wkbk.Worksheets.Item("sheetname")  
wksht.EnableGrouping  
wksht.Protect UserInterfaceonly = true  
Set wksht = Nothing  
Set wkbk = Nothing  
End Sub

External C#

    public void UpdateWorkbook()  
    {  
        const string workbookpath = @"C:somepathsomeworkbookname.xlsx";  
    Excel.Application xlApp = New Excel.Application();   
    // To use the next line you need the Excel Extension library otherwise use Type.Missing.  
        Excel.Workbook wkbk  = Application.Workbooks.Open(workbookpath);  
        Excel.Worksheet wksht wksht = (Excel.Worksheet)wkbk.Worksheets.get_Item("sheetname");  
//Check the way this method works..  
        wksht.EnableGrouping();  
    // UserInterfaceOnly is the 6th parameter, so 5 before and 11 after.  
        wksht.Protect(missing,missing,missing,missing,missing,True,missing,missing,missing, missing,missing,missing,missing,missing,missing,missing,missing);  
        Set wksht = null;  
        Set wkbk = null;  
    Set xlApp = null;   
    }

Понравилась статья? Поделить с друзьями:
  • Excel как разорвать график
  • Excel как разместить рисунок за текстом
  • Excel как разместить несколько диаграмм на одном листе
  • Excel как разместить кнопку
  • Excel как разложить строку по столбцам