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 nBonjour,
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 nSinon, 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 nCdlt,
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 Subpour 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