Страница 1 из 1

Пароль на защиту листа

Добавлено: 20 янв 2011, 13:46
AlexGvozdev
Добрый день.

Помогите, пожалуйста заполнить пробел в коде.
Необходимо узнать как можно проверить установлен ли пароль на защищенном листе.

Код: Выделить всё

If sh.ProtectContents Then    'если лист защищен
       If ... Then 'условие должно проверять есть ли пароль на листе или он защищен без пароля
             pass = InputBox(Prompt:="Введите пароль")
             sh.Unprotect Password:=pass
       Else
             sh.Unprotect
    End If
И еще вопрос, можно ли как нить сделать, чтобы когда вводили пароль, через InputBox, то выводились за место символов звездочки *.

Заранее спасибо!!!!

Re: Пароль на защиту листа

Добавлено: 20 янв 2011, 19:51
nilem
А зачем? Просто пишем sh.Unprotect. Если лист защищен с паролем, то появится окно ввода пароля; если защита без пароля - лист просто разблокируется.

Re: Пароль на защиту листа

Добавлено: 21 янв 2011, 09:20
AlexGvozdev
Так конечно можно было бы сделать, но есть пару нюансов.
  1. Как мне тогда, после выполнения процедуры, защитить лист под таким же паролем.
  2. А если не делать проверку, если там пароль, то может быть вот такая ситуация. Пароля на защиту не было, лист был просто защищен, а после того как выскочит окно, о том что необходимо ввести пароль

    Код: Выделить всё

    pass = InputBox(Prompt:="Введите пароль")
    и пользователь введет туда что нибудь, то будет как бы сказать не приятно :) , так как защита с листа снимется, а код сохранит пароль в переменную, и как только программа дойдет до того места где надо ставить защиту обратно, она поставит защиту с паролем, который указал пользователь в самом начале. И получится, был лист без пароля, а стал с паролем :) .

Re: Пароль на защиту листа

Добавлено: 21 янв 2011, 10:57
nilem
AlexGvozdev писал(а): Пароля на защиту не было, лист был просто защищен, а после того как выскочит окно, о том что необходимо ввести пароль ...
Ну нет, так не должно быть. Если на листе стоит защита без пароля, то и запрос на ввод пароля не появляется. Попробуйте:

Код: Выделить всё

Sub WithoutParol()
ActiveSheet.Unprotect
MsgBox "Лист разблокирован без пароля"
'тут какой-то код
ActiveSheet.Protect
MsgBox "Опять заблокирован без пароля"
End Sub
Если лист защищен с паролем, то этот же пароль потом и ставим:

Код: Выделить всё

Sub WithParol()
ActiveSheet.Unprotect Password:="111"
MsgBox "Лист разблокирован с паролем"
'тут какой-то код
ActiveSheet.Protect Password:="111"
End Sub
Или вы хотите разблокировать лист с неизвестным паролем, чтобы польз-ль сам его вводил?

Re: Пароль на защиту листа

Добавлено: 21 янв 2011, 13:59
AlexGvozdev
nilem писал(а):Или вы хотите разблокировать лист с неизвестным паролем, чтобы польз-ль сам его вводил?
Да именно так.
А чтобы пароль вводить в код программы, такой вариант не подходит, т.к. данный файл будет разослан нескольким персонам, и каждый файл должен иметь разные пароли. А персон этих около 200 :) , по этому не очень охота в каждом файле прописывать пароль в коде :) .

Re: Пароль на защиту листа

Добавлено: 03 фев 2011, 08:26
mc-black
Не до конца понял, что именно вам надо получить в итоге, но могу сказать, что защита листа с паролем легко обходится. по крайней мере это работает в версии 2003 - в других не проверял. При этом вы точно не узнаете исходный пароль, но сможете восстановить защиту тем же паролем.

Просто пароль защиты листа снимается методом Unprotect:
expression.Unprotect(Password)
...
Password Optional Variant. A string that denotes the case-sensitive password to use to unprotect the sheet or workbook. If the sheet or workbook isn't protected with a password, this argument is ignored. If you omit this argument for a sheet that's protected with a password, you'll be prompted for the password. If you omit this argument for a workbook that's protected with a password, the method fails.
Обратите внимание, что пароль типа Variant, а передаем мы туда обычно строку. Защиту можно снять, просто пробутфорсив другой тип данных...