Répétition FOR qui déconne [Résolu]

Signaler
Messages postés
131
Date d'inscription
vendredi 18 août 2006
Statut
Membre
Dernière intervention
17 mars 2010
-
Messages postés
131
Date d'inscription
vendredi 18 août 2006
Statut
Membre
Dernière intervention
17 mars 2010
-
Bonjour tout le monde,
Mon problème est que j'ai une répétition for qui ne s'arrête jamais car la variable ne s'arrête pas ?!?
C'est pour un logiciel de mise en barre, mes longueurs sont inscrites en colonne et chaque fois que j'en place une je transfère la valeur dans une autre feuille et je la supprime de la colonne (en prenant soin de modifier les valeurs de ma répétition. Voici le code :

Sub Mise_en_Barre_IPE()
    I = 2
    J = 2
   
    Int_Reste_15 = 15000
    While Not Sheets("IPE").Cells(2, 1).Value = ""
        While Not Sheets("IPE").Cells(I, 1).Value = ""
        I = I + 1
        Wend
        Int_Dernière_Ligne = I - 1
       
        Sheets("IPE").Range("A2:A" & Int_Dernière_Ligne).Sort Key1:=Range("A2"), 
        Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, 
        Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
       
        For I = 2 To Int_Dernière_Ligne
            Int_Barre_Active = Sheets("IPE").Cells(I, 1).Value
            If Int_Reste_15 > Int_Barre_Active Then
                Int_Reste_15 = Int_Reste_15 - Int_Barre_Active
                Sheets("IPE").Cells(I, 1).Delete Shift:=xlUp
                Sheets("Mise en barre").Cells(J, 2).Value = Int_Barre_Active
                J = J + 1
                If I <> Int_Dernière_Ligne Then
                    I = I - 1
                    Int_Dernière_Ligne = Int_Dernière_Ligne - 1
                End If
            End If
        Next I
        J = J + 1
    Wend


End Sub

Ce qui se passe c'est que I dépasse la valeur de Int_Dernière_Ligne...
Qu'est-ce qui se passe

5 réponses

Messages postés
131
Date d'inscription
vendredi 18 août 2006
Statut
Membre
Dernière intervention
17 mars 2010

Sub Mise_en_Barre_IPE()
    I = 2
    J = 2
    Int_Reste_15 = 15000
   
    Int_Derniere_Ligne = Sheets("IPE").Range("A1").End(xlDown).Row
    Sheets("IPE").Range("A2:A" & Int_Derniere_Ligne).Sort Key1:=Range("A2"), Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
       
    While Not Sheets("IPE").Cells(2, 1).Value = ""
   
        Int_Barre_Active = Sheets("IPE").Cells(I, 1).Value
       
        If Int_Reste_15 > Int_Barre_Active And Int_Barre_Active <> 0 Then
            Int_Reste_15 = Int_Reste_15 - Int_Barre_Active
            Sheets("IPE").Cells(I, 1).Delete Shift:=xlUp
            Sheets("Mise en barre").Cells(J, 2).Value = Int_Barre_Active
            J = J + 1
        Else
            I = I + 1
        End If
       
        If Sheets("IPE").Cells(I, 1).Value = "" And I <> 2 Then
            I = 2
            Int_Reste_15 = 15000
            J = J + 1
        End If
       
    Wend


End Sub

Bon ben comme ça, ça marche
merci à vous
allez chous
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
En règle général, on ne doit jamais modifier la valeur de la variable de boucle dans un For !
Je ne sais pas ce que vaut la variable Int_Dernière_Ligne, mais si celle-ci ne vaut pas la même chose que I (à savoir 2 au premier tour de boucle) ta variable I n'augmentera jamais, car le For l'incrémente, et la clause Then du If la décrémente.
A mon avis, tu devrais revoir toute ta boucle For ... Next
en plus, tu utilises cette même variable I en dehors de la boucle For ... Next !
Ce n'est pas recommandé non plus ! Surtout que c'est dans une boucle While ... Wend
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Oula, monstruosité  

        While Not Sheets("IPE").Cells(I, 1).Value = ""
        I = I + 1
        Wend
        Int_Dernière_Ligne = I - 1

dans         While Not Sheets("IPE").Cells(I, 1).Value = ""
I, la première fois, n'est pas initialisée, donc vaut 0. Et la cellule A0, Excel, connait pas

Tout ce bloc à remplacer par
Int_Dernière_Ligne = Sheets("IPE").range("A1").End(xlDown).Row

@++

<hr width="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRONG>
Messages postés
5
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
19 mai 2009

ok alors je pense que juste avant For I = 2 To Int_Dernière_Ligne, tu devrais faire un if I>=int_derniere_ligne then. et evidement fermer cette condition (end if) après le next i .
Par contre juste une chose...
Evite fortement les accents pour le nom des variables, comme Int_Derniè
re_Ligne.
Messages postés
131
Date d'inscription
vendredi 18 août 2006
Statut
Membre
Dernière intervention
17 mars 2010

Ok ben merci Mortalino pour la petite astuce qui va bien je connaissais pas la commande, ma méthode était un peu plus lourde.


Je sors tout de suite l'accent de ma variable, je fais quelques modifs et je vous tiens au courant.
C'est quand même bizarre cette histoire car même si je modifie la valeur du compteur dans la répétition normalement une fois que I=Int_Derniere_Ligne (ce qui se produit, j'avais vérifié en exécutant pas à pas) il ne devrait plus repartir dans la boucle ce qu'il fait et du coup I va vers l'infini.