En mi situación, el uso de OR no funciona, tengo que usar AND, y no estoy seguro de por qué.

Sub blah()
    If LCase(Environ("username")) <> "me" Or LCase(Environ("username")) <> "some other user" Then '''DOESN'T WORK
        Stop
    ElseIf LCase(Environ("username")) <> "me" And LCase(Environ("username")) <> "some other user" Then  '''WORKS
        Stop
    End If
End Sub
1
W-hit 9 may. 2019 a las 22:46

4 respuestas

La mejor respuesta

El VBA Or no funciona porque cuando Environ("username") es yo , no es algún otro usuario y viceversa.

Desea asegurarse de que no sea ninguna de las posibilidades, por lo que necesita And.

0
TylerH 9 may. 2019 a las 20:10

Su ejemplo es difícil de entender, pero probablemente esté confundido por la naturaleza de los operadores.

Piensa en tablas de verdad; el resultado de una operación Or es True si al menos uno de los operandos es True:

True Or True   => True
True Or False  => True
False Or True  => True
False Or False => False

De manera similar, el resultado de una operación And es True si los operandos ambos son True:

True And True   => True
True And False  => False
False And True  => False
False And False => False

Si ayuda, puede visualizar Or como + (suma) y And como una operación * (multiplicación), siendo False {{X5 }} y True son "no cero":

1 Or 1 => 1 + 1 => True
1 Or 0 => 1 + 0 => True
0 Or 1 => 0 + 1 => True
0 Or 0 => 0 + 0 => False

1 And 1 => 1 * 1 => True
1 And 0 => 1 * 0 => False
0 And 1 => 0 * 1 => False
0 And 0 => 0 * 0 => False
7
Mathieu Guindon 9 may. 2019 a las 20:04

Vamos a desglosarlo. Tengo que asumir que "me" es tu propio nombre de usuario. El resultado de esta prueba es: False, True, True

Debug.Print LCase(Environ("username")) <> "me"
Debug.Print LCase(Environ("username")) <> "some other user"
Debug.Print LCase(Environ("username")) <> "me" Or LCase(Environ("username")) <> "some other user"

Ese es el comportamiento esperado para mí.

0
HackSlash 9 may. 2019 a las 20:07

Esto se puede explicar usando las leyes de DeMorgan. Si tomamos:

If LCase(Environ("username")) <> "me" Or LCase(Environ("username")) <> "some other user" Then

Entonces podemos reescribir esto reemplazando <> con = y luego negando cada término con Not:

If Not(LCase(Environ("username")) = "me") Or Not(LCase(Environ("username")) = "some other user") Then

Usando las leyes de DeMorgan, podemos aplicar una única negación a la expresión completa siempre que cambiemos el operador Or a un operador And:

If Not(LCase(Environ("username")) = "me" And LCase(Environ("username")) = "some other user") Then

Es imposible que LCase(Environ("username") iguale simultáneamente dos valores distintos y, por lo tanto, la condición And será False. La aplicación del operador Not significa que toda la expresión siempre se evaluará como Verdadero, independientemente del valor de "nombre de usuario"


Para la versión corregida usando And en lugar de Or, los pasos son los siguientes:

If LCase(Environ("username")) <> "me" And LCase(Environ("username")) <> "some other user" Then

Cambie <> a = y aplique los operadores Not:

If Not(LCase(Environ("username")) = "me") And Not(LCase(Environ("username")) = "some other user") Then

Aplicar las leyes de DeMorgan:

If Not(LCase(Environ("username")) = "me" Or LCase(Environ("username")) = "some other user") Then

Ahora, si el nombre de usuario es "yo" o el nombre de usuario es "algún otro usuario", la condición Or se evaluará como Verdadero y el operador Not lo cambiará a Falso según sea necesario.

Si el nombre de usuario es cualquier otro valor, la condición Or se evaluará como False y el operador Not lo cambiará a True según sea necesario

0
barrowc 10 may. 2019 a las 00:00