Excel VBA: Макрос для защиты только выделенных ячеек

Автор Misha21, 16 августа 2017, 07:43

Misha21

Здравствуйте! Облазил весь интернет в поисках решения данной проблемы, но так и не нашёл. Задача в следующем.

Пользователь выделяет определенный диапазон ячеек (каждый раз разный), нажимает на кнопку макроса и макрос осуществляет защиту ТОЛЬКО ВЫДЕЛЕННЫХ ячеек.

Сам алгоритм защиты я находил, но не понятно, как обозначить, что необходимо работать только с выделенными ячейками и можно ли это вообще сделать? Заранее спасибо за ответ!

Администратор

Напишите действия юзера, какие бы делал юзер без макроса, чтобы сделать задачу из первого сообщения. То есть это должно быть примерно так:
1) юзер выделяет нужные ячейки;
2) вкладка "такая-то" - группа "такая-то" - кнопка "такая-то"
3) и т.д.

Misha21

1) Юзер открывает файл.
2) Выделяет на листе 1 диапазон ячеек (любой).
3) Юзер снимает защиту листа.
4) Юзер заходит в формат ячеек и переходит на вкладку защита.
5) Ставит флажок напротив "защищаемая ячейка".
6) Ставит защиту.

Лист уже защищён, на нем есть области, открытые для редактирования, которые юзер заполняет, выделяет и защищает данным макросом.

Администратор

Для защиты листа у VBA-Excel есть возможность, чтобы макрос мог делать действия, не снимая защиты листа. Это ускоряет работу макроса в некоторых случаях.
В самом экселе такой возможности нет - нет кнопки (или другого элемента управления) в экселе для этой задачи.
Это параметр "UserInterfaceOnly" у метода "Protect". Но в некоторых случаях макросу может потребоваться снять защиту, не смотря на этот параметр.

Макрос
Sub макрос()
   
    '1. Если макросу надо снять защиту, чтобы сделать действия.
    If ActiveSheet.ProtectionMode = False Then
        '1) Снятие защиты листа.
        ActiveSheet.Unprotect
        '2) Установка галочки: диалог "Формат ячеек" - вкладка "Защита" - галочка "Защищаемая ячейка".
        Selection.Locked = True
        '3) Установка защиты листа.
            ' Используется параметр "UserInterfaceOnly", чтобы при следующем запуске макроса
            ' не снимать защиту. Это может ускорить макрос в некоторых случаях.
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
    ' Если макросу не надо снимать защиту, чтобы сделать действия.
    Else
        ' Установка галочки: диалог "Формат ячеек" - вкладка "Защита" - галочка "Защищаемая ячейка".
        Selection.Locked = True
    End If

End Sub
[свернуть]

Misha21


Администратор

Вариант, если надо сохранить прежние настройки защиты:

Макрос
Sub макрос()
   
    '1. Если макросу надо снять защиту, чтобы сделать действия.
    If ActiveSheet.ProtectionMode = False Then
        '1) Снятие защиты листа.
        ActiveSheet.Unprotect
        '2) Установка галочки: диалог "Формат ячеек" - вкладка "Защита" - галочка "Защищаемая ячейка".
        Selection.Locked = True
        '3) Установка защиты листа.
        protect ActiveSheet, "", True
    ' Если макросу не надо снимать защиту, чтобы сделать действия.
    Else
        ' Установка галочки: диалог "Формат ячеек" - вкладка "Защита" - галочка "Защищаемая ячейка".
        Selection.Locked = True
    End If

End Sub

Private Sub protect(sh As Worksheet, pass As String, uif As Boolean)
    sh.protect Password:=pass, UserInterfaceOnly:=uif, _
        DrawingObjects:=sh.ProtectDrawingObjects, _
        Scenarios:=sh.ProtectScenarios, _
        AllowFormattingCells:=sh.Protection.AllowFormattingCells, _
        AllowFormattingColumns:=sh.Protection.AllowFormattingColumns, _
        AllowFormattingRows:=sh.Protection.AllowFormattingRows, _
        AllowInsertingColumns:=sh.Protection.AllowInsertingColumns, _
        AllowInsertingRows:=sh.Protection.AllowInsertingRows, _
        AllowInsertingHyperlinks:=sh.Protection.AllowInsertingHyperlinks, _
        AllowDeletingColumns:=sh.Protection.AllowDeletingColumns, _
        AllowDeletingRows:=sh.Protection.AllowDeletingRows, _
        AllowSorting:=sh.Protection.AllowSorting, _
        AllowFiltering:=sh.Protection.AllowFiltering, _
        AllowUsingPivotTables:=sh.Protection.AllowUsingPivotTables
End Sub
[свернуть]