Поскольку другие ответы уже объясняли, почему почему , я хочу сосредоточиться на практике кодирования.
Как вы узнали, Not x
не обязательно то, что вы хотите.На практике вы хотите больше, как Not CBool(x)
.Однако CBool()
может выдавать ошибки - например, CBool(Null)
выдает ошибку 91 (недопустимое использование null).
Можно утверждать, что вы можете избежать этого, строго набирая переменные, но даже не используя Variant
, не гарантирует, что в выражении Boolean
останется Boolean
.Пример:
?typename(true and 0)
Integer
На практике слишком легко случайно позволить VBA выполнять неявные преобразования вуду для вас, поэтому по этой причине изменение привычек кодирования может подойти вам лучше.
Длятестируя истинные значения, вы хотите выражения типа:
If x Then
А для ложных значений вы хотите выражения типа:
If x = False Then
Теработает независимо от типа x
, независимо от того, является ли оно выражением или нет, и поэтому считается, что оно намного более согласованно / предсказуемо по своему поведению по сравнению с If x = True Then
или If Not x Then
.Приняв эту привычку кода, вы можете избежать создания тонких ошибок, возникающих в результате случайного преобразования из типов Boolean
и получения побитовой операции, а не логической операции.
Для назначений будет работать переменная Boolean
в обеспечении того, чтобы оно последовательно приводилось либо к True
, либо False
, а не к некоторым случайным числам.