Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

Tonino7

XLDnaute Occasionnel
Bonjour à tous,

je m'arrache les cheveux depuis hier sur un problème INCOMPREHENSIBLE :

(ci-joint mon fichier : Free - Envoyez vos documents )

dans mon fichier, j'ai prévu une macro ("globalupdate") qui, pour résumer, me supprime toutes les lignes de l'onglet "P&L" (et l'onglet "BS" mais en l'occurence il est vide) dans lesquelles il y a un numéro de compte, et va ensuite recréer ces comptes un à un (donc réinsérer les lignes supprimées) en se basant sur la base de données de l'onglet "COA".

Voici le code principal utilisé pour la suppression des lignes où il y a des numéros de comptes :

Sub globalupdate()


Sheets("P&L").Select

For Each cell In Range("PLsize")
Line = cell.Row - 2

If cell.Value > 1 Then

NBdel = cell.Value - 1
cell.Value = 1

For N = 1 To NBdel


Sheets("P&L").Row(Line & ":" & Line).delete shift:=xlUp
Line = Line - 1
Next N
End If

Next cell
....


CONSTAT : tout se déroule à merveille, sauf pour quelques lignes impossibles à supprimer (comme la ligne 33 : compte 500103)

Je ne comprend absolument pas pourquoi cela ne marche pas pour certains comptes. J'ai tout vérifier des dizaines de fois.


Et j'ai recréer une macro quasiment -similaire, dans laquelle, je ne demande pas de supprimer des lignes, mais de les colorier en Jaune --> et bien, cela fonctionne partout. (vous pouvez tester cette macro en cliquant sur le bouton 346 (ou éxécuter macro "testu").

Cela est donc incompréhensible.


JE VOUS DEMANDE DE L'AIDE ! Merci par avance
 

Roland_M

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

bonjour

supprimer une ligne ne modifie en rien son no ni son emplacement
exemple:
si je suis à la ligne no 5 et que je delete cette ligne (autant de fois que je veux)
je suis toujours à la ligne no 5 ! et pas no 4 puis no 3 puis no 2 . . .
donc ne pas décompter Line = Line - 1

if .. then
je delete (sans décompter)
else
je décompte (Line = Line - 1)
end if

EDIT : autre exemple de boucle
- boucle incorrecte !!!
si 1 est supprimé la ligne 2 remonte donc à la place de 1 et Lig est incrémenté à 2
donc la ligne 2 remontée à 1 ne sera pas testé !
et ce n'est plus To 100 mais 99 !!!
For Lig = 1 To 100
If Cells(Lig,1) . . . Then Rows(Lig).Delete
Next
- conclusion avec cette boucle qui commence par le bas
For Lig = 100 To 1 Step -1
If Cells(Lig,1) . . . Then Rows(Lig).Delete
Next
 
Dernière édition:

Tonino7

XLDnaute Occasionnel
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

bonjour

supprimer une ligne ne modifie en rien son no ni son emplacement
exemple:
si je suis à la ligne no 5 et que je delete cette ligne (autant de fois que je veux)
je suis toujours à la ligne no 5 ! et pas no 4 puis no 3 puis no 2 . . .
donc ne pas décompter Line = Line - 1

if .. then
je delete (sans décompter)
else
je décompte (Line = Line - 1)
end if

oui, si je delete la ligne no 5, je suis toujours à la ligne 5... mais l'objectif est de supprimer la ligne 4, et ligne 3 juste derriere... donc si je ne mets pas Line = Line -1.... je lui donnerai l'ordre de me supprimer la ligne 5 ad vitam eternam.

mais merci quand meme
 

Roland_M

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

re
---------------------------------------------------------------
oui, si je delete la ligne no 5, je suis toujours à la ligne 5... mais l'objectif est de supprimer la ligne 4, et ligne 3 juste derriere... donc si je ne mets pas Line = Line -1.... je lui donnerai l'ordre de me supprimer la ligne 5 ad vitam eternam.
---------------------------------------------------------------
Ok mais je confirme quand même ! mais avec une boucle qui décrémente !

comme indiqué dans mon EDIT
 
Dernière édition:

Tonino7

XLDnaute Occasionnel
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

re
---------------------------------------------------------------
oui, si je delete la ligne no 5, je suis toujours à la ligne 5... mais l'objectif est de supprimer la ligne 4, et ligne 3 juste derriere... donc si je ne mets pas Line = Line -1.... je lui donnerai l'ordre de me supprimer la ligne 5 ad vitam eternam.
---------------------------------------------------------------
Ok mais je confirme quand même ! mais avec une boucle qui décrémente !

comme indiqué dans mon EDIT

effectivement, je viens de comprendre. Je vais tester, mais le problème c'est que j'ai 2 boucles, et c'est visiblement la premiere que je dois faire partir du bas. Or pour cette boucle, j'utilise le "for each... next". (car c'est une plage dynamique). Y'a-t-il possibilité de garder le "for each.. next"... mais dans le sens contraire? c'est à dire qu'il parte de la derniere cellule de la plage et "next" jusqu'à la premiere?
 

ROGER2327

XLDnaute Barbatruc
Re : Problème complexe "for each cell" .. et Rows.delete. Je m'arrache les cheveux

Bonjour Tonino7, Roland_M
Je ne sais pas comment utiliser la strucutre For each... ...Next à l'envers.

Mais en testant ces deux procédures, vous verrez qu'elles parcourent la même plage en sens inverses :
Code:
[COLOR="DarkSlateGray"][B]Sub tata()
Dim n&, plage, cel
   Set plage = Range("B5:B20")
   plage.ClearContents
   For Each cel In plage.Cells
      n = 1 + n
      cel.Value = n
   Next cel
End Sub

Sub toto()
Dim n&, plage, cel, i&
   Set plage = Range("B5:B20")
   plage.ClearContents
   For i = plage.Rows.Count - 1 To 0 Step -1
      n = 1 + n
      plage.Cells(1, 1).Offset(i, 0).Value = n
   Next i
End Sub[/B][/COLOR]
Vous pourrez peut-être adapter cela à votre cas. (Ne disposant pas d'Excel2007, je n'ai pas ouvert votre classeur.)​
ROGER2327
#3227
 

Discussions similaires

Statistiques des forums

Discussions
312 166
Messages
2 085 899
Membres
103 024
dernier inscrit
rdge