For to dynamique

Bonjour,

J'utilise la formule For n=2 to LFLF pour qu'une formule passe sur chaque ligne d'une feuille.

LFLF est la dernière ligne et elle est "dynamique".

Je m'explique: quand la formule passe sur chaque ligne, elle peut en rajouter une ou plusieurs (c'est la variable "présence" qui détermine ce nombre de ligne) et dans ce cas la ligne de fin se décale.

Sauf que la formule For ... to ... ne prends pas en compte ce changement notamment quand le rajout d'une ligne se fait à la fin avant la toute dernière ligne...

Ex:

Si LFLF=3 au départ et que finalement après application de la macro Bilan, cela m'a rajouté une ligne LFLF=4, next n ne le prend pas en compte et cela sors de la boucle.

Pourquoi?

Merci d'avance, et je sais que ce n'est pas très compréhensible...

For n = 2 To LFLF
Nom_Produit = Cells(n, CPSb2).Value

Stp.Activate
Cells(LT, 1).Select
Selection.AutoFilter
LigneFin = Stp.Cells(Rows.Count, CP).End(xlUp).Row
Set PlagePresence = Stp.Range(Cells(LT + 1, CP), Cells(LigneFin, CP))
Presence = Application.WorksheetFunction.CountIf(Range(Cells(LT + 1, CP), Cells(LigneFin, CP)), Nom_Produit)

Sb.Activate
    If Cells(n, CPSb2 + 4) > 0 Then 'Il y a un produit
    Else

        Call Bilan(Nom_Produit, Sb, CPSb2, CPSb)

    End If

n = n + Presence - 1
LFLF = Sb.Cells(Rows.Count, CPSb2).End(xlUp).Row

Next n

Bonjour,

Je propose une petite réorganisation du code qui reste, malgré tout, difficilement compréhensible pour moi.

A priori, la boucle devrait passer en revue toutes les lignes puisque n et LFLF sont mises à jour. Il faut donc être attentif à leur valeur.

For n = 2 To LFLF
    with Sb
        Nom_Produit = .Cells(n, CPSb2).Value
        with Stp
            .Cells(LT, 1).AutoFilter
            LigneFin = .Cells(.Rows.Count, CP).End(xlUp).Row
            Set PlagePresence = .Range(.Cells(LT + 1, CP), .Cells(LigneFin, CP))
            Presence = Application.CountIf(.Range(.Cells(LT + 1, CP), .Cells(LigneFin, CP)), Nom_Produit)
        end with
        If .Cells(n, CPSb2 + 4) <= 0 Then 'Il y a un produit
            Call Bilan(Nom_Produit, Sb, CPSb2, CPSb)
        End If
        n = n + Presence - 1
        LFLF = .Cells(.Rows.Count, CPSb2).End(xlUp).Row
    end with
Next n

Sinon, dans les cas d'insertion ou suppression, il est plus courant de commencer d'en bas sans toucher à la valeur de fin de boucle :

For n = LFLF to 2 step - 1
'code
Next n

Cdlt,

Bonjour,

la valeur finale de la boucle for est déterminée à la première exécution de l'instruction for et est mémorisée par l'interpréteur VBA dans une mémoire spécifique non accessible par une instruction VBA. Changer le contenu de la variable qui contient la valeur finale, au sein de la boucle est possible, mais ne modifiera pas la valeur finale de la boucle mémorisée par VBA.

essaie ce code pour t'en convaincre

Sub aargh()
    n = 2
    For i = 1 To n
        n = 100
        MsgBox i & " " & n
    Next i
End Sub

pour contourner ce "problème", utiliser do ... loop

Merci pour cette intervention h2so4 ! J'aurais juré avoir déjà réussi à modifier la valeur de fin de boucle... Mais en effet, avec ton code, la boucle s'arrête (heureusement parce que j'aurais pas aimé me farcir 100 msgbox )

Cdlt,

Bonjour

Merci de vos retour

Désolé du retard, je regarde vos propositions et vous tiens au courant

Agrimaman

Rechercher des sujets similaires à "dynamique"