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 :

Plusieurs conditions dans un while


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut Plusieurs conditions dans un while
    Salut à tous !

    j'ai un petit souci avec VBA : je souhaiterais mettre plusieurs conditions dans une condition While. J'ai écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While k="toto" or k="tata"
     
      instructions...
     
    Wend
    Merci d'avance !!

    laloune
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 595
    Points : 34 271
    Points
    34 271
    Par défaut
    bonjour,
    et quel est ton problème exactement ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    ooops, en me relisant je viens de me rendre compte que ce n'était en effet pas très clair :p

    en fait ce que je souhaite faire, c'est effectuer une boucle avec un while qui prend en compte 2 conditions : tant que k="toto" ou tant que k="tata", alors on exécute les instructions...

    j'ai essayé la syntaxe ci-dessus mais il me génère une erreur...

    ma question est donc : est-il possible de mettre plusieurs conditions dans un while ?

    Merci
    laloune
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 595
    Points : 34 271
    Points
    34 271
    Par défaut
    euh, quelle erreur est générée stp ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    "1004 - Erreur définie par l'application ou par l'objet"

    j'ai testé mes 2 conditions indépendamment, et elles fonctionnent...

    merci
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 595
    Points : 34 271
    Points
    34 271
    Par défaut
    est-ce que ta variable k est un string ?

    ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Dim k As String
    k = "toto"
    While k = "toto" Or k = "tata"
     
      Debug.Print "instructions..."
      k = "tati"
     
    Wend
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonjour,

    Citation Envoyé par laloune Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While k="toto" or k="tata"
    Cela devrait fonctionner, à condition que k soit modifié dans la boucle. Sinon, le résultat du test ne risque pas de changer, et si k était égal à toto" ou à "tata", le traitement ne sortira jamais de la boucle.

    Toutefois, évite les boucles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While k="toto" or k="tata"
        instructions...
    Wend
    Emploie plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do While k="toto" or k="tata"
        instructions...
    Loop
    L’intérêt est que la seconde syntaxe permet de sortir de la boucle si nécessaire evec un

    Par exemple, en phase de test, tu peux employer (à adapter bien sûr, s’il est normal de passer 1 000 fois dans la boucle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Do While k="toto" or k="tata"
        instructions...
        i = i  + 1
            If i = 1000 Then
                MsgBox "Apparemment, bug, déjà 1000 passages dans la boucle !"
                Exit Do
            If i = 1000 Then
    Loop

    En résumé, Do While ... Loop permet de faire tout ce que fait While ... Wend, mais avec plus de souplesse

    Cordialement,
    Michel Gaboly
    Développeur Excel et VBA


    Pas de question technique par MP, je n’y répondrai pas, utilisez le forum - Merci
    Pensez à ajouter le tag

  8. #8
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Re,

    Schématiquement, une erreur 1004 survient lorsque VBA demande à Excel de faire quelque chose qui est impossible, ou qui se traduirait par l’affichage dans Excel d’un message d’erreur si on essayait de faire la même chose manuellement, indépendamment de VBA :

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Range("A" & NumLigne).Select
    n’ a rien de choquant, mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Test()
    Dim NumLigne As Long
    NumLigne = 2 ^ 21
        Range("A" & NumLigne).Select
    End Sub
    va générer une erreur 1004, car 2 puissance 21 = 2 097 152, ce qui est supérieur au nb de lignes d’une feuillle Excel, même avec la version 2007.

    En l’occurrence, l’instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Range("A" & NumLigne).Select
    est correcte, mais va provoquer "l’ire” d’Excel si NumLigne ne désigne pas un numéro de ligne correct.

    Par conséquent ton problème n’a rien à voir avec ton test, mais avec l’une des instructions, à l’intérieur de la boucle.

    Que se passe-t-il si tu cliques sur le bouton Débogage, quand survient l’erreur ? Quelle instruction est surlignée ?

    Cordialement,
    Michel Gaboly
    Développeur Excel et VBA


    Pas de question technique par MP, je n’y répondrai pas, utilisez le forum - Merci
    Pensez à ajouter le tag

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Citation Envoyé par laloune Voir le message
    "1004 - Erreur définie par l'application ou par l'objet"

    j'ai testé mes 2 conditions indépendamment, et elles fonctionnent...

    merci
    Salut
    Exécute ta macro pas-à-pas et regarde la ligne en erreur :
    Si la boucle avec chaque instruction fonctionne, mais pas avec les 2 couplées avec Or, ça ne veut pas forcément dire que ton erreur provient de cette ligne
    A+

  10. #10
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    Par conséquent ton problème n’a rien à voir avec ton test, mais avec l’une des instructions, à l’intérieur de la boucle.
    j'en doute, étant donné que les instructions sont correctement executées lorsque j'exécute le code avec une seule des deux conditions. Pour moi les instructions sont correctes, seulement la boucle ne se déclenche pas correctement

    Que se passe-t-il si tu cliques sur le bouton Débogage, quand survient l’erreur ? Quelle instruction est surlignée ?
    la ligne surlignée est celle de la condition While, ou plutôt Do maintenant.

    Lorsque j'utilise l'opérateur Xor (càd true + false>true / false + true>true). En fait mes conditions sont du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do while k<>"toto" xor k<>"tata"
    donc du coup, je veux que mon code s'exécute tant que k est différent de "toto" ou de "tata". Mais qu'il s'exécute quand même lorsque l'un des deux est faux (ce qui est identique qu'avec or).

    POURTANT ! avec xor mon code s'exécute (plus ou moins bien, mais ce n'est pas le souci pour l'instant), et avec or il me génère une erreur

    Merci en tous cas
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    donc du coup, je veux que mon code s'exécute tant que k est différent de "toto" ou de "tata". Mais qu'il s'exécute quand même lorsque l'un des deux est faux
    C'est pas très clair

    OR (inclusif) la condition est vrai si l'une des 2 conditions est vrai, ou les 2
    XOR (ou exclusif) la condition est vrai si l'une des 2 condition est vrai, mais pas les 2

    J'ai l'impression que dans ton cas il te faut plutôt un AND
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je vois pas bien comment

    and(k="toto";k="tata") pourrait devenir vrai

    d'un autre côté cela supprimera le bug (la condition sera toujours fausse).
    Elle est pas belle la vie ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Il as pas mis égal mais différent
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Si c'est possible met ta macro, ont pourras la tester.
    L'erreur 1004 peut aussi être une erreur qui dépend tu contexte.
    A+

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Au début du post il mettais égal et dans son dernier message il met different :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do while k<>"toto" xor k<>"tata"
    Effectivement la même chose avec OR serais toujours VRAI, d'ou peut-être l'erreur

    Bref c'est pas clair ce qu'uil veux
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par Eric93 Voir le message
    Au début du post il mettais égal et dans son dernier message il met different :



    Effectivement la même chose avec OR serais toujours VRAI, d'ou peut-être l'erreur

    Bref c'est pas clair ce qu'uil veux
    Désolé, mais c'est tout a fait clair et la condition mise dans sont premier poste fonctionne parfaitement, d'où mon message précédant où le problème est dù au contexte.
    A+

  17. #17
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Peux-tu nous indiquer plus précisément ce que sont les 2 conditions, et ce k représente ?
    Michel Gaboly
    Développeur Excel et VBA


    Pas de question technique par MP, je n’y répondrai pas, utilisez le forum - Merci
    Pensez à ajouter le tag

  18. #18
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    voilà mon fichier incluant mon code.

    Merci pour votre aide précieuse en tous cas

    laloune
    Fichiers attachés Fichiers attachés
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    tu fait tout un tas de tests sur une feuille SourceSheet mais qui, dans le fichier passé est vide ? . De ce fait impossible de passer par ton While.

  20. #20
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    Sans données ca va etre compliquer
    J'ai juste remarquer une amelioration de la syntaxe, bien que ca ne changera rien a ton probleme

    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
            'Repérage de la dernière cellule
            'LastCell = .Range("A65536").End(xlUp).Address
            'LastCell = .Cells(Rows.Count, "A").End(xlUp).Address                               '/////////////
     
     
            'Définition de la plage
            'Set PlageATraiter = .Range("A1:" & CStr(LastCell))
            Set PlageATraiter = .Range("A1", .Cells(Rows.Count, "A").End(xlUp))                 '/////////////
     
            For Each Cellule In PlageATraiter
     
                'Extraction de la famille
                If Trim(ExtractElement(Cellule, ":", 1)) = "Famille de formules" Or Trim(ExtractElement(Cellule, ":", 1)) = "Set of formulas" Then
     
                    VarFamille = Left(ExtractElement(Cellule, ":", 2), Len(ExtractElement(Cellule, ":", 2)) - 1)
     
    '//////     'End If
     
                ElseIf Trim(ExtractElement(Cellule, ":", 1)) = "Formule manuelle" Or Trim(ExtractElement(Cellule, ":", 1)) = "Manual formula" Then
    [Edit]
    Par contre ca ne changera peut etre rien mais je mettrais des parentheses, je crois quil y a quelmque chose qui ne va pas sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While (ExtractElement(Cellule.Offset(IndexParametres, 0), ";", 1) <> "Apply to breakdown") Xor (ExtractElement(Cellule.Offset(IndexParametres, 0), ";", 1) <> "Appliquer sur les détails")
    Il me semble .. mais c'est peut etre dans ma tete que dans un cas If A = B Xor C = D Then Vb peut craker et comprendre If A = (B Xor C) = D Then Je crois avoir vu ca quelque part mais n'en suis pas totalement sur, je prend qd meme le risque de me ridiculiser si ca n'est pas le cas
    [/Edit]

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Plusieurs conditions dans un while/wend, possible?
    Par rsoul dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/06/2008, 15h10
  2. plusieurs condition dans un while
    Par realkilla dans le forum C#
    Réponses: 4
    Dernier message: 17/05/2008, 16h16
  3. [Bash] mettre plusieurs conditions dans un while
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 22/07/2007, 22h44
  4. Validation de plusieurs conditions dans un EVALUATE
    Par apokrif dans le forum Cobol
    Réponses: 4
    Dernier message: 29/03/2007, 23h28
  5. Plusieur Condition dans REquette UPDATE
    Par ducseb dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/08/2005, 11h46

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