IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E] Comment coder "différent d'1 enumeration de valeurs"?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Par défaut [VBA-E] Comment coder "différent d'1 enumeration de valeurs"?
    Salut

    Voilà de retour avec une question simple sans doute pour vous, mais pour laquelle je cherche une réponse sur le Web depuis une heure et demie...

    Quelle syntaxe utiliser pour comparer le contenu d'une cellule à une liste de valeurs?

    Quelqu'un svp pourrait corriger mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(x,y).Value <> "Valeur1";"Valeur2";"Valeur3" Then.....
    J'essaie avec OR, en mettant des parentheses, rien n'y fait, et je ne trouve pas de réponse dans l'aide....

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    peu-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Cells(x,y).Value <> "Valeur1" OR _ 
       Cells(x,y).Value <>  "Valeur2" OR _ 
       Cells(x,y).Value <> "Valeur3" Then.....

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Attention, l'opérateur OR attend qu'au moins une condition soit remplie.
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Cells(x,y).Value <> "Valeur1" OR _ 
       Cells(x,y).Value <>  "Valeur2" OR _ 
       Cells(x,y).Value <> "Valeur3" Then.....
    On rentre donc dans le If à tous les coups.

    Personnellement, j'écrirais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Not Cells(x, y).Value = "Valeur1" OR _ 
           Cells(x, y).Value = "Valeur2" OR _ 
           Cells(x, y).Value = "Valeur3" Then...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par AlainTech
    Attention, l'opérateur OR attend qu'au moins une condition soit remplie....
    oui comme AliochaBada parler d'OR j'ai remis un OR sans réfléchir en corrigeant seulement l'erreur de Synthase... mais si la valeur dans la cellule doit être différente des 3 valeurs (1,2,3..) c'est plutôt un AND qu'il faudrai....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Cells(x,y).Value <> "Valeur1" AND _ 
       Cells(x,y).Value <>  "Valeur2" AND _ 
       Cells(x,y).Value <> "Valeur3" Then.....

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Même si, dans le cas présent, la différence de vitesse ne se fera probablement pas sentir, je vous invite à réfléchir à l'optimisation d'un code basé sur le Or par rapport à celui basé sur le And.

    Dans le code que j'ai proposé, on sortira du test DES QU'une condition sera remplie.
    Alors qu'avec un And, on doit tester TOUTES les conditions.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  6. #6
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par AlainTech
    Même si, dans le cas présent, la différence de vitesse ne se fera probablement pas sentir, je vous invite à réfléchir à l'optimisation d'un code basé sur le Or par rapport à celui basé sur le And.

    Dans le code que j'ai proposé, on sortira du test DES QU'une condition sera remplie.
    Alors qu'avec un And, on doit tester TOUTES les conditions.
    ... salut Alain ... eu... tu devrai relire ton code... il doit manquer des Nots ou des parenthéses... ce qui change tout pour la sortie anticipée du test ( je ne me souviens plus si VB/VBA ... sort du test avant l'évaluation compléte de l'expression..., un petit test et je reviens...)

    [Edit] Le petit test :


    C'est bien ce que je pensai VB évalue chaque élément d'une expression quelque soit le résultat des éléments précédents , pour vérifier cela j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Function MaFctFalse() As Boolean
      Debug.Print "FonctionFalse"
      MaFctFalse = False
    End Function
    Function MaFctTrue() As Boolean
      Debug.Print "FonctionTrue"
      MaFctTrue = True
    End Function
    Sub MonTest()
      Debug.Print "Test 1 un OR .. 1° Expression fausse 2° vrai"
      If MaFctFalse Or MaFctTrue Then
       Debug.Print "-------------- Fin test 1 ------------"
      End If
      Debug.Print "Test 2 : un OR .. 1° Expression vrai 2° fausse"
      If MaFctTrue Or MaFctFalse Then
       Debug.Print "-------------- Fin test 2 ------------"
      End If
    End Sub
    Citation Envoyé par Fenêtre exécution
    Test 1 un OR .. 1° Expression fausse 2° vrai
    FonctionFalse
    FonctionTrue
    -------------- Fin test 1 ------------
    Test 2 : un OR .. 1° Expression vrai 2° fausse
    FonctionTrue
    FonctionFalse
    -------------- Fin test 2 ------------
    on voit bien dans la fenêtre exécution le passage dans les 2 fonctions..

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par AlainTech
    Dans le code que j'ai proposé, on sortira du test DES QU'une condition sera remplie.
    Mea culpa.
    Je me suis basé sur le comportement d'un ancien Basic (probablement QBasic) qui , effectivement, sortait du test à la première valeur Vraie trouvée.

    Je constate que VB(A) n'a pas cette intelligence.

    On peut donc, indifféremment, utiliser le Or ou le And.

    Ceci dit, j'ai testé ma formulation et elle fonctionne aussi (sans Not ni parenthèses ajoutées).
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Par défaut
    Citation Envoyé par bbil
    oui comme AliochaBada parler d'OR j'ai remis un OR sans réfléchir en corrigeant seulement l'erreur de Synthase... mais si la valeur dans la cellule doit être différente des 3 valeurs (1,2,3..) c'est plutôt un AND qu'il faudrai....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Cells(x,y).Value <> "Valeur1" AND _ 
       Cells(x,y).Value <>  "Valeur2" AND _ 
       Cells(x,y).Value <> "Valeur3" Then.....
    Vi pour mon code, la valeur de la cellule testée doit bien être différente des valeurs 1, 2, 3.....
    Donc dans ce cas si je suis bien, c'est pas la peine de chercher à optimiser, tout doit être testé (ouf, tant mieux, l'instruction Instr me semblait un peu compliquée pour un dimanche, je vais la garder pour une autre fois ).

    Merci Bbil ca marche nickel, je pensais qu'il existait une syntaxe plus contractée, mais bon ca y est j'ai tout écrit, ca marche,

    Merci pour vos réponses

    Bon je clique sur Résolu, hein, mais que ca vous empeche pas de faire la course....

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 54
    Par défaut
    Citation Envoyé par bbil
    peu-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Cells(x,y).Value <> "Valeur1" OR _ 
       Cells(x,y).Value <>  "Valeur2" OR _ 
       Cells(x,y).Value <> "Valeur3" Then.....
    Merci Bbil pour ta réponse.

    Ca ne fonctionne pas, car il additionne pas les conditions, je veux que le Then s'applique que si la valeur de Cells(x,y) est différente de toutes les valeurs 1, 2, 3, .....

    J'ai essayé ta synthaxe en remplacant OR par AND mais ca me donne le meme résultat, il applique la suite de Then à toutes mes cellules.

    Je bloque là....

    EDIT 2 min apres : OOPS, OOPS, OOPS, mais il y a eu des posts entre temps , bon je vais commencer par lire avant alors , tout le monde ne se lève pas à 14H on dirait....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] comment coder en vba des sauts de page sous word
    Par xixeme dans le forum VBA Word
    Réponses: 1
    Dernier message: 28/03/2009, 00h35
  2. [FAQ] Comment coder/dé-coder en Quote-Printable
    Par Delbeke dans le forum Vos contributions VB6
    Réponses: 0
    Dernier message: 30/07/2008, 10h48
  3. [VB6>VB.NET] Comment coder "break on all errors"
    Par RiiiDD dans le forum VB.NET
    Réponses: 5
    Dernier message: 07/03/2006, 12h53
  4. Comment coder une tabulation pour cut ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2004, 10h31
  5. Comment coder guillemets et cotes ?
    Par Vow dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/05/2003, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo