Автоматическая защита листов после сохранения - PullRequest
0 голосов
/ 04 августа 2020

Изображение

Здравствуйте, я пытаюсь написать макрос, который автоматически блокирует ячейки после того, как пользователь нажал кнопку сохранения. Листы защищены и содержат несколько незаблокированных ячеек, в которые пользователь может вводить данные. Теперь я хочу, чтобы эти ячейки блокировались после того, как пользователь щелкнул данные. У меня в книге несколько листов, но я хочу, чтобы это происходило только для первых листов. Я пробовал много кода на форуме, но безуспешно, может ли кто-нибудь помочь мне с этим.

Код VBA:

Option Explicit Dim Ws As Worksheet

Private bRangeEdited As Boolean 'Private WithEvents Ws As Worksheet


Private Sub Workbook_Open()
    Set Ws = Range("A1:ZZ27").Parent End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim sMSG As String
    sMSG = "Beim Speichern der Arbeitsmappe werden die Eingabezellen gesperrt. " & vbLf
    sMSG = sMSG & "Möchten Sie fortfahren ?"
    If Not bRangeEdited Then GoTo Xit
    If Not Me.ReadOnly Then
        With Range("A1:ZZ27")
            If MsgBox(sMSG, vbExclamation + vbYesNo) = vbNo Then
                Cancel = True
                GoTo Xit
            End If
            Unpro_SheeTS '            .Parent.Unprotect "1234"
            If .SpecialCells(xlCellTypeBlanks).Address <> .Address Then
                .SpecialCells(xlCellTypeConstants).Locked = True
                bRangeEdited = False
            End If
            Pro_SheeTS '            .Parent.Protect "1234"
        End With
    End If Xit: End Sub

Private Sub ws_Change(ByVal Target As Range)
    Dim Ws As Worksheet
    If Not Intersect(Range("A1:ZZ27"), Target) Is Nothing Then
        bRangeEdited = True
    End End Sub

Sub Unpro_SheeTS()

      For Each Ws In ActiveWorkbook.Worksheets
        Ws.Unprotect ("1234")
    Next
    Exit Sub

End Sub Sub Pro_SheeTS()
 
      For Each Ws In ActiveWorkbook.Worksheets
        Ws.Protect ("1234")
    Next
    Exit Sub

End Sub

1 Ответ

0 голосов
/ 04 августа 2020

Я предполагаю, что у вас должна быть функция события worksheet_change, которая отслеживает, какая ячейка изменена в списке / массиве / коллекции, как вы чувствуете. С другой стороны, ваше событие Workbook_BeforeSave будет go через нужные вам листы, и для каждого из них оно снимет защиту с листа, заблокирует ячейки (worksheet.range (...). Locked = true), а затем защитит лист. (Вам не нужно защищать книгу для ваших целей, это другое дело)

для получения лучших результатов:

  • отступ в коде
  • см. в явно диапазоны от листа (worksheet.range)
  • рассмотрите возможность перехода на другой язык;)
...