Как отладить защищенный лист с помощью условных операторов (скрытие / скрытие столбцов и блокировка / защита ячеек), чтобы он работал быстрее - PullRequest
0 голосов
/ 24 июня 2019

У меня есть фрагмент кода VBA на защищенном листе (форма запроса), который отображает столбец F, когда в столбцах D & E выбраны определенные значения. Кроме того, код гарантирует, что если условия выполняются,некоторые ячейки разблокированы, поэтому пользователь может их вводить, в противном случае они остаются заблокированными для редактирования.

Все работает, как нужно, НО, при заполнении требуемой информации, Excel действительно требуется время, чтобы принять введенные данные.Например, когда я набираю что-то в ячейку A (на самом деле не имеет значения, какая ячейка редактируется) и нажимаю Enter, Excel обрабатывает редактирование примерно 2-4 секунды.

Когда я создавалПодобных форм в прошлом я никогда не испытывал такой медлительности.Мой вопрос: есть ли что-то в предоставленном коде, который я могу изменить, чтобы он работал быстрее?Я что-то пропустил?Я использовал Application.Calculation, Application.ScreenUpdating, Application.DisplayStatusBar и Application.EnableEvents в коде, и это немного быстрее, но далеко не гладко.

Я хотел бы отладить его, чтобы он не был таким медленнымкак сейчас.Буду признателен за любые советы.

Private Sub Worksheet_Change(ByVal Target As Range)

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False

    Pass = "4X4lZ7n0FxvCmQ?Z"

    '-------------------------------------------------------------------------
    'THIS SECTION HIDES/UNHIDES THE 'SECURITY GROUPS' COLUMN ON IF PA ACCOUNT CREATION, MODIFICATION OR REACTIVATION IS REQUESTED OR NOT
    '-------------------------------------------------------------------------

    'Unhides column F (security groups) if value in J17 is 1 (i.e. when PA account creation, modification or reactivation is requested)
    If Range("J17").Value = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Columns("F").Hidden = False
        ActiveSheet.Protect Password:=Pass

    'Keeps column F (security groups) hidden if value in J17 is 0 (i.e. when anything else is requested including PA account deactivation)
    ElseIf Range("J17").Value = "0" Then
        ActiveSheet.Unprotect Password:=Pass
        Columns("F").Hidden = True
        ActiveSheet.Protect Password:=Pass
    End If

    '-------------------------------------------------------------------------
    'THIS SECTION LOCKS/UNLOCKS THE 'SECURITY GROUPS' CELL FOR EACH USER BASED ON IF PA ACCOUNT CREATION, MODIFICATION OR REACTIVATION IS REQUESTED OR NOT
    '-------------------------------------------------------------------------

    'The 'Security Groups' cell for row 7
    If Range("J7") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F7").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F7").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 8
    If Range("J8") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F8").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F8").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 9
    If Range("J9") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F9").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F9").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 10
    If Range("J10") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F10").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F10").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 11
    If Range("J11") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F11").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F11").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 12
    If Range("J12") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F12").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F12").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 13
    If Range("J13") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F13").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F13").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 14
    If Range("J14") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F14").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F14").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

    'The 'Security Groups' cell for row 15
    If Range("J15") = "1" Then
        ActiveSheet.Unprotect Password:=Pass
        Range("F15").Locked = False
        ActiveSheet.Protect Password:=Pass
    Else
        ActiveSheet.Unprotect Password:=Pass
        Range("F15").Locked = True
        ActiveSheet.Protect Password:=Pass
    End If

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True

End Sub

1 Ответ

0 голосов
/ 24 июня 2019

Снятие защиты и защиты листа значительно медленнее в Excel, начиная с 2013 года. Это связано с тем, что лист зашифрован более безопасным способом (давайте не будем обсуждать тему как безопасный)

Таким образом, вы должны ограничить количество случаев снятия защиты / защиты листа. Вы можете установить ActiveSheet.Unprotect Password:=Pass вверху и ActiveSheet.Protect Password:=Pass внизу вашей программы, это должно помочь.

Однако есть и лучшее решение: вы можете установить специальный режим защиты. Это защитит лист от ввода и изменения пользователем, но не от изменений кодом VBA. Вам просто нужно знать, что этот специальный режим не сохраняется в Рабочей книге, если вы закроете и снова откроете его, он снова будет защищен также от изменений через VBA.

Итак, вам нужно установить этот специальный режим защиты при открытии рабочей книги. Создайте обработчик событий для события Open и установите режим защиты на UserInterfaceOnly. Возможно, вам нужно вызвать метод для более чем одного листа, и, конечно, вам нужно определить значение для Pass где-то в вашем коде. Теперь вы можете удалить все остальные Unprotect и Protect -статементы из вашего кода.

Const Pass = "(your password)"

Private Sub Workbook_Open()
    Sheets("SheetName").Protect Password:=Pass, UserInterfaceOnly:=True
End Sub

Недостатком является то, что открыть книгу можно немного медленнее.

P.S .: Теперь вы опубликовали свой пароль в StackOverflow, возможно, вам следует изменить его ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...