Архив

Публикации с меткой ‘Защита’

Защита листов/снятие защиты

 

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

Защита листоврис.1

Все пункты расписывать не буду — большинство пунктов полностью повторяют те, которые Вы можете увидеть в обычной защите листов. Остановлюсь лишь на отличиях.Защитить лист, оставив возможность изменять данные на листе только макросом — Вы можете установить на выбранные листы защиту таким образом, что внести на лист изменения вручную будет невозможно, но останется возможность вносить изменения на лист макросами(той же надстройкой). Иногда бывает полезно.

Защитить ячейки:

  • Без изменений(по умолчанию) — защита ячеек остается такой же, какой была;
  • Все — защищаются все ячейки листа. После установки защиты ни одну из ячеек нельзя будет изменить(в соответствии с выбранными условиями защиты);
  • Выделенные — защищаются только те ячейки листа, которые были выделены на активном листе в момент запуска команды. Если выбрано несколько листов, то на всех листах будут защищены ячейки, выделенные на АКТИВНОМ листе. После установки защиты ни одну из выбранных ячеек нельзя будет изменить(в соответствии с выбранными условиями защиты).

Для установки защиты необходимо установить флажок на пункте «Установить защиту«. Для снятия защиты — «Снять защиту«. Если установить оба флажка, то с каждого выбранного листа сначала будет снята защита, а затем заново установлена с указанным паролем и указанными параметрами защиты.

Так же см.:
Как разрешить изменять только выбранные ячейки?
Как защитить лист от пользователя, но не от макроса?
Как оставить возможность работать со структурой на защищенном листе?

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

 

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

Sub Protect_for_User_Non_for_VBA()
    ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
End Sub
Sub Protect_for_User_Non_for_VBA()
    ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True
End Sub

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

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

Конечно, приведенный код можно модернизировать и разрешить пользователю хоть какие-то действия. Например использование автофильтра:

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

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

Примечание: данный макрос лучше всего прописывать на событие открытия книги(модуль ЭтаКнига(ThisWorkbook)), т.к. сразу после закрытия и открытия книги данная защита снимается.

Можно ставить защиту сразу на все листы книги при открытии таким кодом:

Private Sub Workbook_Open()
    Dim wsSh As Object
    For Each wsSh In Me.Sheets
        Protect_for_User_Non_for_VBA wsSh
    Next wsSh
End Sub
Sub Protect_for_User_Non_for_VBA(wsSh As Object)
    wsSh.Protect Password:="1111", UserInterfaceOnly:=True
End Sub
Private Sub Workbook_Open()
    Dim wsSh As Object
    For Each wsSh In Me.Sheets
        Protect_for_User_Non_for_VBA wsSh
    Next wsSh
End Sub
Sub Protect_for_User_Non_for_VBA(wsSh As Object)
    wsSh.Protect Password:="1111", UserInterfaceOnly:=True
End Sub

Данный код вставляется в модуль ЭтаКнига.

Ну и если Вам только на один лист надо установить, то убираем цикл и вызываем процедуру только для нужного листа:

Private Sub Workbook_Open()
    Protect_for_User_Non_for_VBA Me.Sheets("Лист1")
End Sub
Sub Protect_for_User_Non_for_VBA(wsSh As Object)
    wsSh.Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True
End Sub
Private Sub Workbook_Open()
    Protect_for_User_Non_for_VBA Me.Sheets("Лист1")
End Sub
Sub Protect_for_User_Non_for_VBA(wsSh As Object)
    wsSh.Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True
End Sub

Также см.:
Как разрешить изменять только выбранные ячейки?
Защита листов/снятие защиты
Как оставить возможность работать со структурой на защищенном листе?

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

 

Если Вы хотите защитить лист от внесения изменений и на листе имеется сгруппированные в структуру данные, то при установке обычной защиты теряется возможность работы с этой структурой. Для тех, кто не совсем понимает, что такое структура(еще её называют группировка): это такие плюсики левее строк, при нажатии на которые раскрываются скрытые строки. Так вот частенько очень необходимо, чтобы наряду с защитой листа можно было еще и структурой пользоваться. Т.е. чтобы пользователь мог просмотреть все в удобной форме, но не смог ничего изменить. Так как же защитить лист и оставить возможность работы со структурой? Очень просто.

Если Вы не знакомы с макросами и VBA, то Вам сначала необходимо:

  1. создать стандартный модуль
  2. разместить в нем нижеприведенный код:
    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

Также см.:
Как защитить лист от пользователя, но не от макроса?
Защита листов/снятие защиты

Categories: Tags:

Как сделать лист очень скрытым

 

Если Вы хотите скрыть лист со всем его содержимым от посторонних любопытных глаз, то Вы можете скрыть его из контекстного меню листа(это для счастливых обладателей 2007 Excel. Подробнее об этом здесь). Но при использовании данного метода необходимо защитить книгу, иначе отобразить скрытые листы сможет каждый. А что делать, если книгу не надо защищать? Что если необходимо оставить пользователям возможность работы со структурой книги, например, добавлять листы? А лист скрыть надо. Здесь на помощь придет VBA. Притом не обязательно иметь какие-то глубокие познания в программировании. Просто заходим в редактор VBA(Alt+F11) и щелкаем по листу в окне объектов(если не отображается то — Ctrl+R или View-Project Explorer). Подробнее про модули листов и как их найти читайте здесь. После того как выбрали необходимый лист в Окне свойств — Properties Window(если не отображается:F4 или View-Properties Window) находим свойство Visible и назначаем ему значение xlSheetVeryHidden(рис.1).

Скрыть лист через VBAрис.1

После этого для отображения листа необходимо будет обязательно зайти в редактор VBA, а простым методом отобразить не получиться. И книгу защищать не надо. Что нам и было необходимо.

Чтобы затем отобразить этот лист необходимо свойству Visible задать значение — xlSheetVisible.

Скрыть все листы в книге, кроме листа с именем «Видимый» можно следующим макросом:

Sub Hide_All_Sheets()
    Dim wsSh As Object
    For Each wsSh In ActiveWorkbook.Sheets
        If wsSh.Name <> "Видимый" Then wsSh.Visible = xlSheetVeryHidden
        'отобразить – xlSheetVisible; сделать лист просто скрытым -  xlSheetHidden
    Next wsSh
End Sub
Sub Hide_All_Sheets()
    Dim wsSh As Object
    For Each wsSh In ActiveWorkbook.Sheets
        If wsSh.Name <> "Видимый" Then wsSh.Visible = xlSheetVeryHidden
        'отобразить – xlSheetVisible; сделать лист просто скрытым -  xlSheetHidden
    Next wsSh
End Sub

Также см.:
Как сделать лист скрытым?