1
votes

Pourquoi «ET» fonctionne-t-il ici alors que «OU» ne fonctionne pas?

Dans ma situation, l'utilisation de OR ne fonctionne pas, je dois utiliser AND, et je ne sais pas pourquoi.

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


7 commentaires

Que signifie «ne fonctionne pas» dans ce contexte? il renvoie True et vous attendez False ?


OR renvoie faux et j'attends vrai, ET renvoie vrai et j'attends faux


Ce n'est pas possible. Environ ("username") ne peut pas être à la fois "me" et "some other user" : la condition And ne peut être que False .


Est-ce égal ou n'est-il pas égal?


Désolé, je viens de vérifier. ce n'est pas égal


Qu'est-ce que «l'utilisation présumée du OU»? Veuillez expliquer ce que vous essayez d'accomplir avec ce code.


Merci pour toutes les réponses. Le n'est pas égal m'a jeté.


4 Réponses :


0
votes

Le VBA Ou ne fonctionne pas car lorsque Environ ("username") est moi , ce n'est pas certains autre utilisateur et vice versa.

Vous voulez vous assurer que ce n'est pas l'une des possibilités, vous avez donc besoin de Et .


0 commentaires

7
votes

Votre exemple est difficile à comprendre, mais vous êtes probablement simplement confus par la nature des opérateurs.

Pensez aux tables de vérité; le résultat d'une opération Ou est True si au moins l'un des opérandes est Vrai:

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


0 commentaires

0
votes

Décomposons-le. Je dois supposer que "me" est votre propre nom d'utilisateur. Le résultat de ce test est: Faux, Vrai, Vrai

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"

C'est le comportement attendu pour moi.


0 commentaires

0
votes

Cela peut être expliqué en utilisant Lois de DeMorgan . Si nous prenons:

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

alors nous pouvons réécrire ceci en remplaçant le par = puis en annulant chaque terme par Non :

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

En utilisant les lois de DeMorgan, nous pouvons appliquer une seule négation à l'expression entière tant que nous changeons le Ou à un opérateur Et :

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

Il est impossible pour LCase (Environ ("username") d'égaler simultanément deux des valeurs distinctes et donc la condition And sera False. L'application de l'opérateur Not signifie que l'expression entière sera toujours évaluée à True quelle que soit la valeur de "username" p >


Pour la version corrigée en utilisant Et au lieu de Ou les étapes sont les suivantes:

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

Remplacez par = et appliquez les opérateurs Not :

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

Appliquez les lois de DeMorgan :

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

Maintenant, si le nom d'utilisateur est "moi" ou le nom d'utilisateur est "un autre utilisateur" alors la condition Ou évaluera à True et l'opérateur Not changera cela en False si nécessaire.

Si le nom d'utilisateur est une autre valeur, alors le La condition Ou sera évaluée à False et l'opérateur Not la changera en True si nécessaire


0 commentaires