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
4 Réponses :
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 .
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
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.
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
Que signifie «ne fonctionne pas» dans ce contexte? il renvoie
Trueet vous attendezFalse?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 conditionAndne peut être queFalse.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é.