Добрый день!
Помогите, пожалуйста, исправить код.
Цель процедуры: убрать пароль со структуры файла, используя набор уже известных паролей.
т.е. есть 300 файлов с разными паролями, но всего паролей 5-10 и они известны и повторяются.
чтобы не указывать макросу пароль для каждого файла - написана такая процедура:
есть массив из 10 паролей
Код |
---|
Dim Password_No(20) As String
|
процедура перебирает по очереди разные пароли, и в случае ошибки - включается обработчик ошибки:
Код |
---|
ActiveWorkbook.Unprotect Password_No(x) |
Но при несовпадении пароля - оператор On Error - отправляет нас в область ErrorPas
В этой области к индексу "x" - добавляется "1"
и процедура возвращается к снятию защиты с книги
Проблема:
обработка ошибки срабатывает как задумано только один раз.
Если натравить этот макрос на файл с запароленной структурой, где пароль "12345" (это третий пароль в нашем массиве), то:
- процедура пробует пароль №1 "1234567" - ошибка
-> область обработки ошибки ErrorPas
-> в этой области к "х" прибавляется 1
-> х=2
-> процедура возвращается к метке "ResumeUnprotect"
-> процедура пробует пароль №2 "123456" - ошибка
-> вместо перехода к области ErrorPas - выполнение прерывается с ошибкой "не верный пароль"
и до правильного пароля мы не доходим всего одну итерацию.
1. возможно ли в принципе использование обработки ошибки с циклами?
2. если да, то как исправить этот код?
Весь код:
(если не удобно смотреть - могу добавить комментарии
Код |
---|
Sub test_1()
Dim Password_No(20) As String
Password_No(1) = "1234567"
Password_No(2) = "123456"
Password_No(3) = "12345"
x = 1
ResumeUnprotect:
Err.Clear
On Error GoTo ErrorPas
MsgBox "x = " & x
ActiveWorkbook.Unprotect Password_No(x)
RealPass = Password_No(x)
MsgBox "Пароль: " & RealPass
'Next x
GoTo Ends
ErrorPas:
x = x + 1
If x > 20 Then
MsgBox "Пароли кончились"
GoTo Ends
End If
GoTo ResumeUnprotect
Ends:End Sub |
на всякий случай - прилагаю файл с запароленной структурой. пароль "12345"