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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
AlexGvozdev
Сообщения: 3
Зарегистрирован: 20 янв 2011, 13:31

Добрый день.

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

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

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

Заранее спасибо!!!!
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

А зачем? Просто пишем sh.Unprotect. Если лист защищен с паролем, то появится окно ввода пароля; если защита без пароля - лист просто разблокируется.
AlexGvozdev
Сообщения: 3
Зарегистрирован: 20 янв 2011, 13:31

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

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

    pass = InputBox(Prompt:="Введите пароль")
    и пользователь введет туда что нибудь, то будет как бы сказать не приятно :) , так как защита с листа снимется, а код сохранит пароль в переменную, и как только программа дойдет до того места где надо ставить защиту обратно, она поставит защиту с паролем, который указал пользователь в самом начале. И получится, был лист без пароля, а стал с паролем :) .
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

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

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

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

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

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

nilem писал(а):Или вы хотите разблокировать лист с неизвестным паролем, чтобы польз-ль сам его вводил?
Да именно так.
А чтобы пароль вводить в код программы, такой вариант не подходит, т.к. данный файл будет разослан нескольким персонам, и каждый файл должен иметь разные пароли. А персон этих около 200 :) , по этому не очень охота в каждом файле прописывать пароль в коде :) .
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Не до конца понял, что именно вам надо получить в итоге, но могу сказать, что защита листа с паролем легко обходится. по крайней мере это работает в версии 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, а передаем мы туда обычно строку. Защиту можно снять, просто пробутфорсив другой тип данных...
На заказ: VBA, Excel mc-black@yandex.ru
Ответить