VBA Макросы: Странное (нелогичное) поведение параметра функции, метода

Автор ddiller, 26 апреля 2018, 10:59

ddiller

Почему в этом коде у параметра NoReset странное поведение:
ActiveDocument.Protect wdAllowOnlyFormFields, NoReset = False

По логике и по описанию параметр "NoReset = False" наоборот должен все сбрасывать, но он сбрасывает при значении True. Прав ли я?

Администратор

После NoReset должно быть двоеточие:
ActiveDocument.Protect wdAllowOnlyFormFields, NoReset:= False

Если вы не ставите после параметра двоеточие, то слово "NoReset" макрос воспринимает, как переменную, а не как параметр функции. То есть, используя "NoReset" без использования двоеточия, вы создаёте, сами того не зная, переменную. То есть делаете действие, аналогичное этому:
Dim NoReset

Затем переменная сравнивается со словом False.
Переменная NoReset имеет тип данных Variant и видимо становится булевой. Т.к. в ней пусто, то в переменной NoReset становится False.

Затем False сравнивается с False:
False = False

Это возвращает True.

Во второй параметр метода Protect, подставляется True, что соответствует:
NoReset:=True

Чтобы было меньше проблем, сделайте режим, при котором нужно обязательно создавать переменные. В этом случае, если макрос увидит несозданную переменную с помощью Dim, будет ошибка и макрос не запустится.
Как сделать этот режим, написано здесь: https://forumvba.ru/index.php?topic=402.0