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 :

Aide sur une boucle infinie


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 75
    Points : 42
    Points
    42
    Par défaut Aide sur une boucle infinie
    Bonjour à tous... Je viens vous demander de l'aide sur une boucle qui tourne indéfiniment et j'ai beau retourné le problème dans tous les sens, je ne comprends pas pourquoi.

    J'ai un tableur dynamique alimenté par une connexion serveur. Ma première colonne contient une année. Mon souhait est d'éliminer toutes les lignes ne correspondant pas au critère d'année. Le problème c'est que ma boucle tourne indéfiniment. Voici le code que je pensais fonctionnerait sans problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim fin2 As Single
        fin2 = Range("B2").End(xlDown).Row
     
        For i = 2 To fin2
     
            While Range("A" & i).Value <> "2010"
            Rows(i).Delete
            Wend
     
        Next
    Comme c'est un classeur dynamique, je teste la dernière ligne avant ma boucle et je lui demande de le faire de i=2 à la dernière ligne. Mais la boucle ne s'arrête jamais... Pourquoi ? Merci à tous pour votre aide.

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,

    essayes comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim fin2 As long 'ou integer
    fin2 = Range("B2").End(xlDown).Row
     
        For i = 2 To fin2
     
            If Range("A" & i).Value <> "2010" Then Rows(i).Delete
     
        Next
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Salut,

    1) A quoi pourrait bien servir une boucle while au sein d'une boucle for ?
    2) lorsque l'on supprime en chemin, il faut toujours commencer du bas et remonter vers le haut. Cela permet d'eviter de se referer a un numero de ligne qui n'existe plus du fait des suppressions !
    L'utilisation de Step - 1 dans la boucle For est donc ici recommande, tout simplement

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour babaothe,
    tu as raison pour la décrementation, je corrige
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim fin2 As long 'ou integer
    i as integer
    fin2 = Range("B2").End(xlDown).Row
     
        For i = fin2 To 2 step -1
     
            If Range("A" & i).Value <> "2010" Then Rows(i).Delete
     
        Next i
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    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
    Salut willyol3 et le forum
    Tu peux expliquer ce que tu veux faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim fin2 As Single
        fin2 = Range("B2").End(xlDown).Row
     
        For i = 2 To fin2
     
            While Range("A" & i).Value <> "2010"
            Rows(i).Delete
            Wend
     
        Next
    i=2 => tu effaces la ligne 2 => la ligne 3 devient la ligne 2 qui, si elle a une valeur différente de 2010, et effacé, et ainsi de suite.
    Le problème est qu'une fois la dernière ligne dont A=2010, comme tu dois aller à Fin2 et que tu n'as plus de valeur, tu efface ligne après ligne et tu ne sorts plus de la boucle While...Wend.

    Quelques idées :
    - Même si on n'a pas beaucoup de lignes, j'utilises Long qui va jusqu'à la dernière ligne de la feuille. Une erreur peut mettre un espace à la dernière ligne.
    - Je n'utilise jamais xlDown, je préfère xlUp à partir de la dernière ligne de la feuille => si B2 ou B3 sont vides, la réponse n'est pas forcément la même.
    - Je n'utilises que très rarement des boucles sans fin. Je préfère for.

    - Une idée de macro effaçant les lignes différentes en A de 2010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
    Dim X As Long
    For X = Cells(Rows.Count, "B") To 2 Step -1
        If Range("A" & X) <> 2010 Then Rows(X).Delete
    Next X
    End Sub
    On efface en commençant de la dernière, évitant ainsi une boucle interminable et ne sautant aucune ligne.
    A+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Pourquoi VB est toujours si simple en vous lisant ?? Merci à tous ça fonctionne à merveille. J'avoue que je ne connaissais pas le For Step-1... Bien utile et que je pourrais réutiliser à l'occasion.

    Gorfael, merci beaucoup pour ton explication. Je comprend maintenant pourquoi ma boucle ne se terminait pas... J'avoue que mettre un while dans un For me semblait inutile. Mais avec le If ca ne fonctionnait pas non plus. Il fallait effectivement que je parte à l'envers pour éviter les erreurs. Sujet résolu. Merci encore et sans doute à très bientôt car je fais malheureusement souvent appel à vos compétences...

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

Discussions similaires

  1. [XL-2013] VBA function.Vlookup debogage et aide sur une boucle
    Par Jeremy.ch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/08/2014, 09h32
  2. [XL-2013] Besoin d'aide sur une boucle en vba dans excel
    Par ppfun dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/04/2014, 20h25
  3. aide sur une boucle
    Par olivverte dans le forum Excel
    Réponses: 11
    Dernier message: 15/11/2013, 16h43
  4. Aide sur une boucle
    Par jackborogar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2012, 15h55
  5. Aide sur une boucle for
    Par Kemanke dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 11/12/2008, 14h13

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