Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Misha21 от 16 августа 2017, 07:43

Название: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Misha21 от 16 августа 2017, 07:43
Здравствуйте! Облазил весь интернет в поисках решения данной проблемы, но так и не нашёл. Задача в следующем.

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

Сам алгоритм защиты я находил, но не понятно, как обозначить, что необходимо работать только с выделенными ячейками и можно ли это вообще сделать? Заранее спасибо за ответ!
Название: Re: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Администратор от 16 августа 2017, 07:53
Напишите действия юзера, какие бы делал юзер без макроса, чтобы сделать задачу из первого сообщения. То есть это должно быть примерно так:
1) юзер выделяет нужные ячейки;
2) вкладка "такая-то" - группа "такая-то" - кнопка "такая-то"
3) и т.д.
Название: Re: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Misha21 от 16 августа 2017, 09:16
1) Юзер открывает файл.
2) Выделяет на листе 1 диапазон ячеек (любой).
3) Юзер снимает защиту листа.
4) Юзер заходит в формат ячеек и переходит на вкладку защита.
5) Ставит флажок напротив "защищаемая ячейка".
6) Ставит защиту.

Лист уже защищён, на нем есть области, открытые для редактирования, которые юзер заполняет, выделяет и защищает данным макросом.
Название: Re: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Администратор от 16 августа 2017, 09:49
Для защиты листа у 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
[свернуть]
Название: Re: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Misha21 от 16 августа 2017, 10:08
Огромное спасибо, вы просто волшебник!!!
Название: Re: Excel VBA: Макрос для защиты только выделенных ячеек
Отправлено: Администратор от 16 августа 2017, 11:16
Вариант, если надо сохранить прежние настройки защиты:

Макрос
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
[свернуть]