VBA Обработка неверных ошибок времени выполнения пароля - PullRequest
0 голосов
/ 12 октября 2018

Первый пост, но долгое время пользователь!Во-первых, я хотел бы поблагодарить каждого за все отзывы о кодах, которые вы, ребята, размещаете в постах.Это помогло мне разработать код VBA больше, чем вы можете себе представить!

Хорошо, поэтому вопрос:

Справочная информация:
Я разрабатываю надстройку, ориентированную на VBA, дляЯ и коллеги, чтобы использовать.Частично это включает в себя функции, которые вы могли бы, кроме Excel, но не там.Некоторые из них было довольно легко сделать (например, инвертировать фильтры), но некоторые оказываются более сложными.Это один из тех примеров.

Проблема:
Следующий код предназначен для циклического выбора пользователем листов, применения пользовательского пароля или удаления существующего.Часть функции заключается в захвате паролей, которые нельзя удалить (т. Е. Потому что пользователь ввел неправильный пароль).Он отлично работает для первой ошибки, но устраняет ошибку времени выполнения (1004) для второй и повторяет ошибку после.У меня мало опыта работы с ошибками во время выполнения (старайтесь избегать ошибок!), Но я не могу заставить это работать.Любые идеи / помощь, чтобы остановить появление ошибки во время выполнения, были бы хорошими.

Код:

Dim SHT As Worksheet, Password As String, SHT_Names(0 To 30) As String
'PREP
    'DISABLE APPLICATION FUNCTIONS
    Call Quicker_VBA(False)
    Application.EnableEvents = False

'USER PASSWORD OPTION
    Password = InputBox("Please enter a password (leave blank for no password)", "Password")

    'USER INFORMATION MESSAGES SETUP
        MSG_Protect = "Added to-"
        Protect_check = MSG_Protect

        MSG_Unprotect = "Removed from-"
        Unprotect_check = MSG_Unprotect

        MSG_unable = "Unable to remove protection from-"
        Unable_check = MSG_unable

    'ID SHEETS SELECTED
        For Each SHT In ActiveWindow.SelectedSheets
            a = a + 1
            SHT.Activate
            SHT_Names(a) = SHT.name
        Next

'MAIN
    HomeSHT = ActiveSheet.name

    'PROTECT SHEETS SELECTED BY USER
        For b = 1 To a
            Sheets(SHT_Names(b)).Select
            Set SHT = ActiveSheet

            'ENABLE OR REMOVE PROTECTION FROM SELECTED SHEET
            If SHT.ProtectContents Then
                On Error GoTo Password_FAIL
                Application.DisplayAlerts = False
                SHT.Unprotect Password
                On Error GoTo 0

                MSG_Unprotect = MSG_Unprotect & vbNewLine & Chr(149) & " " & SHT.name
            Else:

                'ENABLE FILTER CHECK
                FilterOn = False
                If ActiveSheet.AutoFilterMode Then FilterOn = True

                'PROTECT SHEET
                SHT.Protect Password, AllowFiltering:=FilterOn

                'UPDATE USER MESSAGE
                MSG_Protect = MSG_Protect & vbNewLine & Chr(149) & " " & SHT.name & " - Users can: Select locked and unlocked cells"
                If FilterOn = True Then MSG_Protect = MSG_Protect & " and use filters"
            End If
200     Next

'INFORM USER
    If Protect_check <> MSG_Protect Then msg = MSG_Protect & vbNewLine & "___________________" & vbNewLine
    If Unprotect_check <> MSG_Unprotect Then msg = msg & MSG_Unprotect & vbNewLine & "___________________" & vbNewLine
    If Unable_check <> MSG_unable Then msg = msg & MSG_unable

    MsgBox msg, , "Protection summary"

'TIDY UP
    Sheets(HomeSHT).Activate
    'ENABLE APPLICATION FUNCTIONS
    Call Quicker_VBA(True)
Exit Sub
Password_FAIL:
    MSG_unable = MSG_unable & vbNewLine & Chr(149) & " " & SHT.name
    Application.EnableEvents = False
    GoTo 200
End Sub

1 Ответ

0 голосов
/ 12 октября 2018

На первый взгляд кажется, что проблема в том, как вы обрабатываете свои ошибки.Вы используете строку On Error GoTo Password_FAIL, чтобы перейти к обработчику ошибок.Обработчик ошибок регистрирует некоторую информацию и затем переходит к метке «200».Я не могу сказать, выключено ли форматирование, но похоже, что метка для «200» указывает на Next, указывая на то, что цикл должен продолжаться со следующего листа.

Итак, в чем проблема?Вы никогда не сбросите исходную ошибку.На три строки ниже On Error GoTo Password_FAIL вы явно вызываете On Error GoTo 0 для сброса обработчика ошибок, но эта строка никогда не будет достигнута при ошибке.Программа перейдет к обработчику ошибок, а затем перейдет к итератору цикла.Использование оператора GoTo для потока управления может легко привести к этим типам проблем, поэтому большинство разработчиков рекомендуют против него.

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

Sub ToggleProtectionAllSheets()
    Dim sht As Worksheet
    Dim password As String

    On Error Resume Next

    password = InputBox("Please enter a password (leave blank for no password)", "Password")
    For Each sht In ActiveWorkbook.Worksheets
        If sht.ProtectContents Then
            sht.Unprotect password

            If Err.Number <> 0 Then
                Err.Clear
                MsgBox "Something did not work according to plan unprotecting the sheet"
            End If
        Else
            sht.Protect password

            If Err.Number <> 0 Then
                Err.Clear
                MsgBox "Something went wrong with protection"
            End If
        End If

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