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 :

Evaluation paresseuse avec Or ? [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Evaluation paresseuse avec Or ?
    Bonjour a tous.
    Je possède 2 colonne
    Colonne A avec environ 40 lignes
    Colonne B avec environ 11 240

    A chaque ligne de la Colonne B se trouve une cellule dont le contenu est dans la colonne A et j'applique un traitement.
    Je voulais que, dans une ligne B, dés qu'on trouve la correspondance, on ne rentre pas dans la boucle While.
    Cela aurait été une évaluation paresseuse (si le booléen IsFind est à True, alors je ne rentre pas la suite).


    La, la macro rentre tout le temps dans la boucle (car iLigneA <= last_Ligne_A)
    Comment faire pour éviter d'y rentrer dés lors que IsFind passe à True ?

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    For iLigneB = 2 To last_Ligne_B ' 2 à 11 240
         iLigneA = 2 ' Ré-initialise début de A
         IsFind = False ' Ré-initialise bool
     
         Do While IsFind = False Or iLigneA <= last_Ligne_A ' Eval non paresseuse 
              If Range("B" & iLigneOnglet).Text = variable_txt Then
                   IsFind = True   ' Ligne trouvée donc pas besoin de tester les autres valeur de A
                   ' Traitement
              End If
              iLigneA = iLigneA + 1 'iLigneA ++
         Loop
     
    Next iLigneB

  2. #2
    Membre habitué Avatar de Orhleil
    Homme Profil pro
    Intégrateur fonctionnel
    Inscrit en
    Mai 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Intégrateur fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 81
    Points : 152
    Points
    152
    Par défaut
    Salut
    C'est pas un Or qu'il faut utiliser, c'est un And
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While IsFind = False And iLigneA <= last_Ligne_A
    Quand IsFind passe à vrai, l'expression retournera faux, et il sortira de la boucle.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci Orhleil

    Je sais pas dans quoi je suis parti avec mon "OR" alors que c'est bien évidemment le "AND".

    J'ai déjà fait des trucs beaucoup plus compliqué mais je comprends pas pourquoi j'ai séché sur un truc aussi simpliste, digne de mon 1° cours d'algo

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Optimiser la boucle imbriquée
    D'Ores et déjà la sortie Exit For

    IsFind dans un Do While puis à la fin l'incrémentation iLigneA = iLigneA + 1 'iLigneA ++
    cela ressemble fort à un For Next.
    C'est par là la sortie avec Exit For.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
    Const colA = 1
    Const colB = colA + 1
    Const last_Ligne_A = 40
    Const last_Ligne_B = 11240
    Les deux boucles For ... Next imbriquées :
    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
    Sub LazyGoldenEval()
    Dim iLigneA As Integer, iLigneB As Integer, iLigneOnglet As Integer
    Dim tStart As Double, tEnd As Double
     
        '... calcul de iLigneOnglet éventuellement à l'intérieur d'une boucle
        tStart = Time
        For iLigneB = 2 To last_Ligne_B ' 2 à 11 240
             For iLigneA = 2 To last_Ligne_A ' Eval non paresseuse
                  If Cells(iLigneOnglet, colB) = variable_txt Then
                       ' Traitement
                       Exit For ' Ligne trouvée. Pas besoin de tester les autres valeur de A
                  End If
             Next
        Next
        tEnd = Time
        Debug.Print Format(tEnd - tStart, "HH:MM:SS")
    End Sub
    Il faudrait voir si on arrive à grignoter une seconde voire une micro-seconde ;-) en remplaçant dans le test du If :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("B" & iLigneOnglet).Text = variable_txt Then
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(iLigneOnglet, colB) = variable_txt Then

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Désolé MattChess, j'ai vu un peu tard ton message mais je l'ai mis quand même mis en action.

    En mettant le test avec Cells au lieu de Range, je passe de 21-22 secondes à 20 secondes.
    Pour la macro totale, je passe de 48-49 à 46. C'est toujours appréciable sachant que la macro totale doit être répété 24 fois donc ça m'économisera 48 secondes

    Merci à toi

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

Discussions similaires

  1. Evaluer un string text avec code PHP: Eval?!
    Par Just dans le forum Langage
    Réponses: 5
    Dernier message: 04/09/2010, 10h42
  2. Evaluation paresseuse: fun ou lazy ?
    Par SpiceGuid dans le forum Caml
    Réponses: 16
    Dernier message: 06/06/2008, 21h43
  3. Réponses: 3
    Dernier message: 07/05/2008, 12h36
  4. [AJAX] comment programmer les evaluations avec les etoiles?
    Par makohsarah dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 26/04/2008, 22h44
  5. [LG] Evaluation paresseuse ?
    Par M-RiX dans le forum Langage
    Réponses: 8
    Dernier message: 20/11/2005, 15h06

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