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
4 respuestas
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
.
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
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í.
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
Preguntas relacionadas
Nuevas preguntas
excel
Solo para preguntas sobre programación contra objetos o archivos de Excel, o desarrollo de fórmulas complejas. Puede combinar la etiqueta de Excel con VBA, VSTO, C #, VB.NET, PowerShell, automatización OLE y otras etiquetas y preguntas relacionadas con la programación, si corresponde. La ayuda general con respecto a MS Excel para funciones de hoja de trabajo única está disponible en Super User.