Страницы: 1
RSS
Защита листа макросом, снятие защиты
 
Уважаемые форумчане, подскажите пожалуйста в чем прикол.

Защищаю лист вот таким способом
Код
Sub Lock()
Dim ws As Worksheet
ws.Protect Password = "123", DrawingObjects:=False
End Sub
Далее пытаюсь снять защиту обычным способом.
Рецензирование->снять защиту листа
И пароль введенный в макросе 123 не подходит
При этом конструкция
Код
Sub UnLock_1()
ActiveSheet.Unprotect Password = "123"
End Sub
Прекрасно защиту снимает.
А мне надо чтобы обычный человек без помощи макроса штатным способом мог эту защиту снять.
 
Кхм... а где какую конструкцию Вы прописываете?
Вы точно ЭТО внимательно прочитали?
 
Цитата
Danmer написал:
При этом конструкция
Password = "123" End Sub
Прекрасно защиту снимает.
а Вы попробуйте снять защиту без макроса, введя в окно "False"(без кавычек). Думаю все получится. Потому что синтаксисом VBA предусмотрено указание аргументов при помощи двоеточия и равно, а не просто равенства.
Т.е. если ставить защиту так:
Код
ws.Protect Password:= "123", DrawingObjects:=False
и снимать так:
Код
ActiveSheet.Unprotect Password:= "123"
то пароль будет и в коде и при ручном снятии "123". Учите мат.часть...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist? cпасибо Вам огромное!
Справедливости ради,  "False"(без кавычек) не работает.

Мат.часть в процессе освоения. Понимаю, что вопрос глупейший.
 
Цитата
Danmer написал: "False"(без кавычек) не работает
Логично. Попробуйте снять, записав FALSE(т.е. в верхнем регистре) :)

Плюс, после
Код
Dim ws As Worksheet
надо и назначить значение:
Код
Set ws = ActiveSheet
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Логично. Попробуйте снять, записав FALSE(т.е. в верхнем регистре)
Да, и  правда снимает.

Почему false я понимаю, он игнорирует все что между Password и :=
А почему верхний регистр?
Неужто потому, что False без кавычек?
 
Нет, потому что если на листе записать =истина, то оно преобразуется в верхний регистр. Т.е. для Excel логическое False и True(Истина и Ложь) всегда в верхнем регистре, в отличие от VBA. И он преобразует в верхний регистр эти значения всегда, когда встречает. А тут Вы ставите защиту, передавая аргумент False в качестве пароля. И после передачи этого аргумента методу Protect он преобразуется в единый регистр для исключения ошибок.
Цитата
Danmer написал:
он игнорирует все что между Password и :=
ни фига ничего Вы не поняли. Вы у себя не записали двоеточие перед равно. И в результате это получилась не передача аргумента методу, а логическое выражение. Т.к. директива Option Explicit у Вас не включена, то VBA не указал Вам на ошибку(переменная Protect не определена) и сам определил Protect как переменную со значением Empty. И получается логическое выражение:
Protect = "123"
т.е. сравнение значения переменной Empty с текстом "123"
Empty = "123"
и это выражение возвращает False. И именно результат этого выражения и передается уже в метод Protect.

На всякий случай: Variable not defined или что такое Option Explicit и зачем оно нужно?
Изменено: The_Prist - 07.11.2016 14:28:11
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх