Opérateur OR fonctionnement? Comment assignez plus de 2 expressions

Bonjour à tous,

J'ai un peu petit problème et je ne sais pas comment faire pour le contourner!

En effet l'opérateur OR retourne True si une des deux expression est vrais ou les deux!

Quand est il quand je veux mettre 3, 4 ou 5 expression?

Code

exemple:

If Sheets("Extract Orpheline").Cells(r, 1).Value = "83" Or "84" Or "85" Or "86" Or "87" Or "88" Then

J'ai penser a le contourner de cette manière:

Dim GFE()

For z=1 to 6

GFE(1)="83"

GFE(2)="84" ...etc

If Sheets("Extract Orpheline").Cells(r, 1).Value = GFE(z)

next z

Mais cela ne fonction pas non plus!

Avez-vous a solution a ce problème? par avance merci de vos réponse.

Cordialement.

Bonjour,

Évite les "URGENT" dans le titre de la discussion: ça pourrait avoir un effet contre-productif !

Par contre, un exemple de fichier avec les valeurs testées pourrait aider:

  • pourquoi les valeurs (qui semblent numériques) sont-elles encadrées de guillemets?
  • un test

    ne fonctionne pas? Y a-t-il des valeurs décimales intermédiaires
  • etc.

Bonjour,

Pour le IF je ne suis pas sûr que ça fonctionne, je t'y propose donc pour un select case :

select case Sheets("Extract Orpheline").Cells(r, 1).Value 
case 83 to 88 'tu peux faire case "83","84","85","86","87","88" si c'est du texte tu peux aussi faire 83 to 88, 90 to 92 pour 2 plages de valeurs possibles
'ce que tu veux faire
'case "truc" si tu veux rajouter des cas posibles qui mènent à d'autres actions
case else 'si nécessaire
end select

Bonjour,

Précision, quel qu’en soit le nombre, avec "or", il suffit qu'une condition soit vraie pour que ça renvoie la valeur "true".

Ça me fait penser qu'ils n'ont pas programmé de formule OUEXCLUSIF

Le ou exclusif ne renvoie vrai que si un seul des tests logiques renvoie vrai, c'est bien utilisé en automatisme par exemple

Je me demande si ça servirait après...

Merci U. Milité

Je te fais un fichier avec les fonctions qui m'intéresse car l'original est lourd et sous close de confidentialité.

Sub MacroMail1()
Dim Trouve
r = 3
Trouve = 1
While Sheets("Extract Orpheline").Cells(r, 1).Value <> "" And Trouve = 1

    If Sheets("Extract Orpheline").Cells(r, 1).Value = ("84") Xor ("85" Xor "86") Xor ("87" Xor "88") Then
    Trouve = 0
    Sheets("Extract Orpheline").Activate
    Sheets("Extract Orpheline").Rows("2:2").End(xlToRight).Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$2:$I$200").AutoFilter Field:=1, Criteria1:=Array("83", "84", "85", "86", "87", "88"), Operator:=xlFilterValues
    Sheets("Extract Orpheline").Range("A2", Sheets("Extract Orpheline").Range("A2").End(xlToRight).End(xlDown)).Select
    Range("A1:L1").Select
    Selection.Font.Bold = True
    Application.DisplayAlerts = False
    Worksheets("GFE").Delete
    Sheets.Add
    ActiveSheet.Name = "GFE"
        Worksheets("GFE").Columns("A:A").ColumnWidth = 3.29
    Worksheets("GFE").Columns("B:B").ColumnWidth = 31
    Worksheets("GFE").Columns("C:C").ColumnWidth = 13.86
    Worksheets("GFE").Columns("G:G").ColumnWidth = 14.57
    Application.DisplayAlerts = True
    Sheets("Extract Orpheline").Activate
    Sheets("Extract Orpheline").Range("A:J").Select
    Selection.Copy Destination:=Sheets("GFE").Range("A1")
    Sheets("GFE").Activate

    '''''''''''''''''''''''''''''''''''''''''''''''instruction mail'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Sheets("GFE").Range("A1").Select
     Sheets("GFE").Range(Selection, Selection.End(xlDown)).Select
     Sheets("GFE").Range(Selection, Selection.End(xlToRight)).Select

                 Set rng = Selection
                ' on crée un mail
            Set OutApp = CreateObject("Outlook.Application")
            Set OutMail = OutApp.CreateItem(0)

            ' caractéristiques du mail
            With OutMail

                 .To = "*@*.com"
                 .CC = "*@*.fr"
                .Subject = "/!\ Alerte /!\ Détèction des anomalies du DTMASSE!"
                .HTMLBody = "Bonjour à tous, voici un tableau issu d'un fichier excel  : " & RangetoHTML(rng)

                ' afficher
                .Display

                ' envoyer
                '.Send
                End With

                Set OutApp = Nothing
                Set OutMail = Nothing

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sheets("Extract Orpheline").Activate
        Sheets("Extract Orpheline").Rows("2:2").Select
    Selection.AutoFilter
    Trouve1 = 1
    Else
    Trouve = 1
    r = r + 1
    End If
Wend

et si Ausecour Le OUexclusif = Xor

Bon eh bien comme il n'y a pas de fonction OUEXCLUSIF j'en ai bidouillé une, n'hésitez pas à me proposer un code amélioré

Function OUEXCLUSIF(ParamArray testlogique()) As Boolean
Application.Volatile 'se recalcule automatiquement

nb_vrai = 0 'compte le nombre de tests logiques vrais

On Error GoTo erreur 'si une erreur est rencontrée, aller à erreur:
For Each test In testlogique 'pour tous les tests renseignés
    If test = True Then 'si le test est vrai
        nb_vrai = nb_vrai + 1 'on ajoute un test vrai au compteur
    ElseIf test = False Then 'si il est faux
    'on ne fait rien
    Else: GoTo erreur: 'sinon on a une erreur car ce n'est pas un test logique
    End If
Next test

If nb_vrai > 1 Or nb_vrai = 0 Then 'si on a aucun test logique vrai
'ou plus de 1 test logique vrai

    OUEXCLUSIF = False 'la fonction renvoie faux
ElseIf nb_vrai = 1 Then 'sinon si un seul test logique est vrai
    OUEXCLUSIF = True 'elle renvoie vrai
End If
Exit Function 'on sort de la fonction

'gestion des erreurs
erreur:
OUEXCLUSIF = Error 'on renvoie la valeur d'erreur
End Function

Re,

Juste pour retourner la politesse à Ausecour : depuis Xl 2013, Microsoft a ajouté une fonction nommée "OUX" (si, si!), qui ...

Renvoie un OU exclusif logique de tous les arguments.

Ah super!

Merci pour l'info

Je suis sous Excel 2010 du coup pas au courant

Bonjour, Salut à tous !

Je repose la question préalable : pourquoi des nombres entre guillemets ?

Parce que c'est toujours (ou presque, sauf exception ultra ultra rare) une très mauvaise idée de mettre des guillemets autour des nombres, on en fait du texte... et un nombre est plus utile que du texte, quand il faut que ce soit du texte, VBA se charge normalement de convertir (dans l'autre sens, texte vers nombre, c'est moins vrai, contrairement à Excel qui fait en général le contraire).

Et si dans la cellule concernée, on a effectivement du texte (rare mais possible...) il est judicieux de convertir en nombre, et tester la condition avec And sur les bornes :

    If cellule >= 83 And cellule <= 88 Then

Note que la comparaison doit être répétée : on ne peut écrire If cellule >= 83 And <= 88. Même chose avec Or !

Ou bien, on peut réaliser la comparaison avec un Select Case, plus souple que If dans un tel cas :

    Select Case cellule
        Case 83 To 88
            ...
        Case Else
            ...
    End Select

Cordialement.

Bonjour à tous,

@ ausecour : XOR existe en vba sur 2010

eric

C'est animé ici ! J'ai dû m'y reprendre à 4 fois pour que mon message passe, il y en avait toujours un nouveau...

Si OUX n'existe pas sur Excel 2010, Xor en VBA est présent depuis l'origine...

edit : Et là encore ! Resalut à tous...

C'est animé ici ! J'ai dû m'y reprendre à 4 fois pour que mon message passe, il y en avait toujours un nouveau...

Si OUX n'existe pas sur Excel 2010, Xor en VBA est présent depuis l'origine...

Merci pour cette Info

EDIT:

Très animé oui, on se jette sur le peu de sujets qu'il y a, ça sent les vacances

tout d'abord merci pour vos solutions:

Maintenant comment fait ton dans le nombre ne ce suivent pas?

La fonction Case Fonctionne?

i = 3

Trouve1 = 1
Sheets("Extract Orpheline").Activate
While Sheets("Extract Orpheline").Cells(i, 1).Value <> "" And Trouve1 = 1

    If Sheets("Extract Orpheline").Cells(i, 1).Value = "10" Or "92" Or "23" Or "941" Or "942" Then ' Nombre non continue
    Trouve1 = 0
    Sheets("Extract Orpheline").Activate
    Sheets("Extract Orpheline").Rows("2:2").End(xlToRight).Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$2:$I$200").AutoFilter Field:=1, Criteria1:=Array("95", "92", "93", "941", "942"), Operator:=xlFilterValues
    Sheets("Extract Orpheline").Range("A2", Sheets("Extract Orpheline").Range("A2").End(xlToRight).End(xlDown)).Select
    Range("A1:L1").Select
    Selection.Font.Bold = True
    Application.DisplayAlerts = False
    Worksheets("GFE").Delete
    Sheets.Add
    ActiveSheet.Name = "GFE"
        Worksheets("GFE").Columns("A:A").ColumnWidth = 3.29
    Worksheets("GFE").Columns("B:B").ColumnWidth = 31
    Worksheets("GFE").Columns("C:C").ColumnWidth = 13.86
    Worksheets("GFE").Columns("G:G").ColumnWidth = 14.57
    Application.DisplayAlerts = True
    Sheets("Extract Orpheline").Activate
    Sheets("Extract Orpheline").Range("A:J").Select
    Selection.Copy Destination:=Sheets("GFE").Range("A1")
    Sheets("GFE").Activate

par avance merci

Oui le selection case peut fonctionner, si on prend ceci :

If Sheets("Extract Orpheline").Cells(i, 1).Value = "10" Or "92" Or "23" Or "941" Or "942" Then 

Ça donnerait ceci:

select case Sheets("Extract Orpheline").Cells(i, 1).Value
case "10", "92", "23", "941", "942"

Merci a tous pour vos réponse très instructive.

L' opérateur or ou Xor peut en effet comprendre plus de deux expressions!

Voici mon erreur:

If Sheets("Extract Orpheline").Cells(w, 1).Value = 91 Xor 96 Then ' 
'Bon code
If Sheets("Extract Orpheline").Cells(w, 1).Value = 91 Xor [u]Sheets("Extract Orpheline").Cells(w, 1).Value[/u] = 96 Then

Voici ce qui arrive quand on veux aller trop vite.

Encore un grand merci à toutes l'équipes de m'avoir permis d’enrichir mes compétences et ma logique VBA.

Bonne vacance à tous.

Cordialement.

Mordu77

Re,

pour que ce soit bien clair pour toi, une synthèse de toutes les erreurs contenues dans :

If Sheets("Extract Orpheline").Cells(i, 1).Value = "10" Or "92" Or "23" Or "941" Or "942" Then

"10" est une chaine de caractère qui n'a rien à voir avec le nombre 10.

As-tu affaire à des nombres ou réellement à des chaines représentant des nombres ?

Quand tu fais :

x = 10 Or 92 Or 23 tu fais un OU entre 10 et 92 puis avec 23, et tu regardes si x est égal au résultat de ces OU

ce qui n'a rien à voir avec ce que je suppose que tu voulais, qui aurait dû s'écrire :

If Sheets("Extract Orpheline").Cells(i, 1).Value = 10 Or  Sheets("Extract Orpheline").Cells(i, 1).Value = 92 Or  Sheets("Extract Orpheline").Cells(i, 1).Value = 23 then

Ce qui s'écrit plus simplement avec un Select Case

Et ce n'est pas parce qq'un a évoqué le XOR qu'il faut en conclure que c'est équivalent à un OR. Encore une fois ça n'a rien à voir.

Fais une recherche sur Table de vérité OU, puis sur OU exclusif, elles sont différentes.

eric

En effet le OU et le OU exclusif sont 2 opérateurs totalement différents :

Le OU renvoie vrai si au moins un des tests logiques est VRAI, alors que le OU exclusif ne renvoie vrai que si un seul test logique est vrai, si tu as 0 test vrai ou plus de 1 test vrai, le OU exclusif renvoie faux

Illustration du OU:

Fonctions logiques 284-a 29

Illustration du OU exclusif:

Fonctions logiques 285-a 29

Bonjour à tous,

explication du post d'Ausecour pour les non-électriciens, et valable uniquement avec une ampoule non grillée, en bon état de marche (représentée par un petit rond avec une croix).

le courant part du mur à gauche ; ah oui, j'ai oublié d'préciser qu'ça marche pas en cas de panne de courant OU si vous avez baissé le fusible général du disjoncteur OU si le fusible particulier de la pièce est naze.

pour le shéma du haut, l'ampoule s'allumera dans ces 3 cas : si un contact est établi au point a (ligne droite) OU si un contact est établi au point b (ligne droite aussi) OU les 2 à la fois (ligne droite pour a et b).


ATTENTION !

si vous touchez à la fois la borne positive et la borne négative, c'est vous qui risquez d'être allumé, et d'servir de sapin de Noël !!!

mais ... non, y'a pas d'mais qui tienne ; c'est comme ça et pas autrement ! qu'ce soit avec OU ou avec XOR, c'est l'même tarif !

si vous passez outre, vous risquez fort de finir aussi cramé qu'un hamburger trop cuit !


pour le 2ème shéma, c'est un peu plus compliqué, alors je laisse la place à notre ingénieur-électricien dévoué : Ausecour

au cas où, sa 2ème profession est ambulancier-infirmier :

dhany

Salut dhany, c'est un peu tot pour faire sapin de noël !

Ça marche je vais expliquer le deuxième schéma

Alors il y a plusieurs choses a voir dessus, on a deux interrupteur a et b

Et deux lignes, il y a toujours le point d'entrée du courant a gauche et la lumiere qu'on veut allumer a droite.

Les deux lignes ont des interrupteurs chacunes, la premiere a un interrupteur a fermé (le courant passe car il y a un contact), et un interrupteur b ouvert (pas de contact donc pas de courant)

Et inversement sur la deuxième ligne.

Les interrupteurs sur les deux lignes sont reliés par des pointillés, ça veut dire que si l'un change d'état, l'autre aussi. En clair si on ouvre l'interrupteur a de la premiere ligne, celui de la deuxième ligne se ferme.

Sur le schema de base aucune ligne ne fait passer le courant (tout est a 0).

Si on change l'état de l'interrupteur a, on se retrouve avec deux interrupteurs ouverts sur la premiere ligne, et deux fermés sur la deuxième (le courant passe sur cette ligne)

Mais si on change aussi l'état de l'interrupteur b, on se retrouve de nouveau avec un interrupteur ouvert sur chaque ligne (le courant ne passe pas)

Ce qu'il faut donc comprendre c'est que si on ne touche rien (a=0, b=0), la lumière ne s'allume pas (0)

Si on touche seulement a ou b (a=1,b=0 ou a=0, b=1), alors on a une des deux lignes avec tous les interrupteurs qui laissent passer le courant (1).

Et si on touche a tout : (a=1, b=1), on se retrouve avec la meme situation qu'au depart, et le courant ne passe pas (0).

Donc si on veut que ça fonctionne il ne faut toucher qu'à un seul interrupteur, alors qu'avec le ou on peut tout toucher, tant qu'un des interrupteurs laisse passer le courant, alors tout vas bien!

J'espère que vous aurez compris :p

Au passage si on voulait écrite l'équation logique de la lampe ce serait : L = (a . !b) + (!a . b)

Le point sert de ET, le + de OU, le point d'exclamation le NON. Normalement le point d'exclamation c'est une barre au dessus de la lettre mais comme je ne peux pas y faire ici....

Rechercher des sujets similaires à "operateur fonctionnement comment assignez expressions"